Aleksander Machniak
2012-08-26 651c7b6e9df38a3b7cdf6daebed39021d88c3bea
commit | author | age
4e17e6 1 <?php
T 2
3 /*
4  +-----------------------------------------------------------------------+
5  | program/steps/settings/func.inc                                       |
6  |                                                                       |
e019f2 7  | This file is part of the Roundcube Webmail client                     |
438753 8  | Copyright (C) 2005-2012, The Roundcube Dev Team                       |
7fe381 9  |                                                                       |
T 10  | Licensed under the GNU General Public License version 3 or            |
11  | any later version with exceptions for skins & plugins.                |
12  | See the README file for a full license statement.                     |
4e17e6 13  |                                                                       |
T 14  | PURPOSE:                                                              |
15  |   Provide functionality for user's settings & preferences             |
16  |                                                                       |
17  +-----------------------------------------------------------------------+
18  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
19  +-----------------------------------------------------------------------+
20 */
21
681969 22 if (!$OUTPUT->ajax_call)
A 23   $OUTPUT->set_pagetitle(rcube_label('preferences'));
4e17e6 24
b19097 25
f05834 26 // similar function as /steps/settings/identities.inc::rcmail_identity_frame()
A 27 function rcmail_preferences_frame($attrib)
d11fb2 28 {
f05834 29   global $OUTPUT;
cb3538 30
f05834 31   if (!$attrib['id'])
A 32     $attrib['id'] = 'rcmprefsframe';
35c31e 33
f05834 34   $attrib['name'] = $attrib['id'];
35c31e 35
f05834 36   $OUTPUT->set_env('contentframe', $attrib['name']);
cfc27c 37   $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/resources/blank.gif');
f8e8af 38
f05834 39   return html::iframe($attrib);
d11fb2 40 }
f05834 41
A 42
43 function rcmail_sections_list($attrib)
d11fb2 44 {
49771b 45   global $RCMAIL;
f8e8af 46
f05834 47   // add id to message list table if not specified
A 48   if (!strlen($attrib['id']))
49     $attrib['id'] = 'rcmsectionslist';
50
49771b 51   list($list, $cols) = rcmail_user_prefs();
f8e8af 52
f05834 53   // create XHTML table
49771b 54   $out = rcube_table_output($attrib, $list, $cols, 'id');
f05834 55
A 56   // set client env
57   $RCMAIL->output->add_gui_object('sectionslist', $attrib['id']);
58   $RCMAIL->output->include_script('list.js');
59
35c31e 60   return $out;
d11fb2 61 }
4e17e6 62
T 63
64 function rcmail_identities_list($attrib)
d11fb2 65 {
a90ad2 66   global $OUTPUT, $RCMAIL;
4e17e6 67
T 68   // add id to message list table if not specified
69   if (!strlen($attrib['id']))
70     $attrib['id'] = 'rcmIdentitiesList';
71
54759c 72   // get identities list and define 'mail' column
a90ad2 73   $list = $RCMAIL->user->list_identities();
54759c 74   foreach ($list as $idx => $row)
e8d5bd 75     $list[$idx]['mail'] = trim($row['name'] . ' <' . rcube_idn_to_utf8($row['email']) .'>');
54759c 76
3ca3bd 77   // get all identites from DB and define list of cols to be displayed
e6ce00 78   $plugin = $RCMAIL->plugins->exec_hook('identities_list', array(
54759c 79     'list' => $list,
A 80     'cols' => array('mail')));
4e17e6 81
54759c 82   // @TODO: use <UL> instead of <TABLE> for identities list
A 83   // create XHTML table
3ca3bd 84   $out = rcube_table_output($attrib, $plugin['list'], $plugin['cols'], 'identity_id');
54759c 85
4e17e6 86   // set client env
f11541 87   $OUTPUT->add_gui_object('identitieslist', $attrib['id']);
4e17e6 88
T 89   return $out;
d11fb2 90 }
4e17e6 91
T 92
93 // similar function as in /steps/addressbook/edit.inc
57f0c8 94 function get_form_tags($attrib, $action, $id = null, $hidden = null)
d11fb2 95 {
197601 96   global $EDIT_FORM, $RCMAIL;
4e17e6 97
57f0c8 98   $form_start = $form_end = '';
f8e8af 99
57f0c8 100   if (empty($EDIT_FORM)) {
T 101     $request_key = $action . (isset($id) ? '.'.$id : '');
f05834 102     $form_start = $RCMAIL->output->request_form(array(
d11fb2 103       'name'    => 'form',
A 104       'method'  => 'post',
105       'task'    => $RCMAIL->task,
106       'action'  => $action,
107       'request' => $request_key,
108       'noclose' => true
109     ) + $attrib);
f8e8af 110
57f0c8 111     if (is_array($hidden)) {
T 112       $hiddenfields = new html_hiddenfield($hidden);
113       $form_start .= $hiddenfields->show();
4e17e6 114     }
f8e8af 115
57f0c8 116     $form_end = !strlen($attrib['form']) ? '</form>' : '';
4e17e6 117
57f0c8 118     $EDIT_FORM = !empty($attrib['form']) ? $attrib['form'] : 'form';
T 119     $RCMAIL->output->add_gui_object('editform', $EDIT_FORM);
120   }
4e17e6 121
197601 122   return array($form_start, $form_end);
d11fb2 123 }
4e17e6 124
ec0171 125
49771b 126 function rcmail_user_prefs($current=null)
A 127 {
128   global $RCMAIL;
129
130   $sections['general'] = array('id' => 'general', 'section' => rcube_label('uisettings'));
131   $sections['mailbox'] = array('id' => 'mailbox', 'section' => rcube_label('mailboxview'));
132   $sections['compose'] = array('id' => 'compose', 'section' => rcube_label('messagescomposition'));
133   $sections['mailview'] = array('id' => 'mailview','section' => rcube_label('messagesdisplaying'));
d73448 134   $sections['addressbook'] = array('id' => 'addressbook','section' => rcube_label('addressbook'));
49771b 135   $sections['folders'] = array('id' => 'folders', 'section' => rcube_label('specialfolders'));
A 136   $sections['server'] = array('id' => 'server',  'section' => rcube_label('serversettings'));
137
138   // hook + define list cols
e6ce00 139   $plugin = $RCMAIL->plugins->exec_hook('preferences_sections_list',
49771b 140         array('list' => $sections, 'cols' => array('section')));
A 141
142   $sections = $plugin['list'];
f8e8af 143
49771b 144   $config = $RCMAIL->config->all();
A 145   $no_override = array_flip($RCMAIL->config->get('dont_override', array()));
f8e8af 146
49771b 147   foreach ($sections as $idx => $sect) {
f8e8af 148
49771b 149     if ($current && $sect['id'] != $current)
A 150       continue;
f8e8af 151
49771b 152     $blocks = array();
f8e8af 153
49771b 154     switch ($sect['id']) {
A 155     // general
156     case 'general':
f8e8af 157
49771b 158     $blocks = array(
06c990 159       'main'    => array('name' => Q(rcube_label('mainoptions'))),
A 160       'browser' => array('name' => Q(rcube_label('browseroptions'))),
49771b 161     );
f8e8af 162
49771b 163     // language selection
A 164     if (!isset($no_override['language'])) {
165       $a_lang = $RCMAIL->list_languages();
166       asort($a_lang);
167
168       $field_id = 'rcmfd_lang';
169       $select_lang = new html_select(array('name' => '_language', 'id' => $field_id));
170       $select_lang->add(array_values($a_lang), array_keys($a_lang));
171
172       $blocks['main']['options']['language'] = array(
173         'title' => html::label($field_id, Q(rcube_label('language'))),
174         'content' => $select_lang->show($RCMAIL->user->language),
175       );
176     }
177
08ffd9 178     // timezone selection
49771b 179     if (!isset($no_override['timezone'])) {
A 180       $field_id = 'rcmfd_timezone';
5879c0 181       $select_timezone = new html_select(array('name' => '_timezone', 'id' => $field_id));
49771b 182       $select_timezone->add(rcube_label('autodetect'), 'auto');
5879c0 183
a60d13 184       $zones = array();
5879c0 185       foreach (DateTimeZone::listIdentifiers() as $i => $tzs) {
476fa9 186         try {
AM 187           $tz = new DateTimeZone($tzs);
188           $date = new DateTime('2012-12-21', $tz);
189           $offset = $date->format('Z') + 45000;
190           $sortkey = sprintf('%06d.%s', $offset, $tzs);
191           $zones[$sortkey] = array($tzs, $date->format('P'));
192         }
193         catch (Exception $e) {}
5879c0 194       }
T 195
196       ksort($zones);
197       foreach ($zones as $zone) {
198         list($tzs, $offset) = $zone;
199         $select_timezone->add('(GMT ' . $offset . ') ' . strtr($tzs, '_', ' '), $tzs);
200       }
201
202       if (is_numeric($config['timezone']))
203         timezone_name_from_abbr("", $config['timezone'] * 3600, 0);
49771b 204
A 205       $blocks['main']['options']['timezone'] = array(
206         'title' => html::label($field_id, Q(rcube_label('timezone'))),
207         'content' => $select_timezone->show((string)$config['timezone']),
208       );
209     }
210
1cc9e2 211     // date/time formatting
T 212     if (!isset($no_override['time_format'])) {
213       $reftime = mktime(7,30,0);
214       $field_id = 'rcmfd_time_format';
215       $select_time = new html_select(array('name' => '_time_format', 'id' => $field_id));
216       foreach ((array)$RCMAIL->config->get('time_formats', array('G:i', 'H:i', 'g:i a', 'h:i A')) as $choice)
217         $select_time->add(date($choice, $reftime), $choice);
218
219       $blocks['main']['options']['time_format'] = array(
220         'title' => html::label($field_id, Q(rcube_label('timeformat'))),
221         'content' => $select_time->show($RCMAIL->config->get('time_format')),
222       );
223     }
224
225     if (!isset($no_override['date_format'])) {
226       $refdate = mktime(12,30,0,7,24);
227       $field_id = 'rcmfd_date_format';
228       $select_date = new html_select(array('name' => '_date_format', 'id' => $field_id));
229       foreach ((array)$RCMAIL->config->get('date_formats', array('Y-m-d','d-m-Y','Y/m/d','m/d/Y','d/m/Y','d.m.Y','j.n.Y')) as $choice)
230         $select_date->add(date($choice, $refdate), $choice);
231
232       $blocks['main']['options']['date_format'] = array(
233         'title' => html::label($field_id, Q(rcube_label('dateformat'))),
234         'content' => $select_date->show($config['date_format']),
235       );
236     }
237
49771b 238     // MM: Show checkbox for toggling 'pretty dates' 
A 239     if (!isset($no_override['prettydate'])) {
240       $field_id = 'rcmfd_prettydate';
241       $input_prettydate = new html_checkbox(array('name' => '_pretty_date', 'id' => $field_id, 'value' => 1));
242
243       $blocks['main']['options']['prettydate'] = array(
244         'title' => html::label($field_id, Q(rcube_label('prettydate'))),
245         'content' => $input_prettydate->show($config['prettydate']?1:0),
246       );
247     }
248
249     // show drop-down for available skins
250     if (!isset($no_override['skin'])) {
251       $skins = rcmail_get_skins();
252
253       if (count($skins) > 1) {
254         $field_id = 'rcmfd_skin';
255         $input_skin = new html_select(array('name'=>'_skin', 'id'=>$field_id));
256
257         foreach($skins as $skin)
258           $input_skin->add($skin, $skin);
259
260         $blocks['main']['options']['skin'] = array(
261           'title' => html::label($field_id, Q(rcube_label('skin'))),
262           'content' => $input_skin->show($config['skin']),
263         );
264       }
265     }
f8e8af 266
06c990 267     $product_name = $RCMAIL->config->get('product_name', 'Roundcube Webmail');
A 268     $RCMAIL->output->add_script(sprintf("%s.check_protocol_handler('%s', '#mailtoprotohandler');",
269       JS_OBJECT_NAME, JQ($product_name)), 'foot');
270
271     $blocks['browser']['options']['mailtoprotohandler'] = array(
272       'content' => html::a(array(
273         'href' => '#',
274         'id' => 'mailtoprotohandler'), Q(rcube_label('mailtoprotohandler'))),
275     );
276
f8e8af 277     break;
A 278
49771b 279     // Mailbox view (mail screen)
A 280     case 'mailbox':
f8e8af 281
49771b 282     $blocks = array(
A 283       'main' => array('name' => Q(rcube_label('mainoptions'))),
284       'new_message' => array('name' => Q(rcube_label('newmessage'))),
285     );
286
287     // show config parameter for preview pane
288     if (!isset($no_override['preview_pane'])) {
289       $field_id = 'rcmfd_preview';
bc4960 290       $input_preview = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1,
81c2ce 291         'onchange' => "$('#rcmfd_preview_pane_mark_read').prop('disabled', !this.checked)"));
49771b 292
A 293       $blocks['main']['options']['preview_pane'] = array(
294         'title' => html::label($field_id, Q(rcube_label('previewpane'))),
295         'content' => $input_preview->show($config['preview_pane']?1:0),
296       );
297     }
298
bc4960 299     // show config parameter for preview pane auto mark as read delay
T 300     if (!isset($no_override['preview_pane_mark_read'])) {
301       // apply default if config option is not set at all
302       $config['preview_pane_mark_read'] = $RCMAIL->config->get('preview_pane_mark_read', 0);
f8e8af 303
bc4960 304       $field_id = 'rcmfd_preview_pane_mark_read';
T 305       $select_delay = new html_select(array('name' => '_preview_pane_mark_read', 'id' => $field_id,
306         'disabled' => $config['preview_pane']?0:1));
307
308       $select_delay->add(rcube_label('never'), '-1');
309       $select_delay->add(rcube_label('immediately'), 0);
310       foreach(array(5, 10, 20, 30) as $sec)
311         $select_delay->add(rcube_label(array('name' => 'afternseconds', 'vars' => array('n' => $sec))), $sec);
312
313       $blocks['main']['options']['preview_pane_mark_read'] = array(
314         'title' => html::label($field_id, Q(rcube_label('previewpanemarkread'))),
315         'content' => $select_delay->show(intval($config['preview_pane_mark_read'])),
316       );
317     }
318
49771b 319     if (!isset($no_override['mdn_requests'])) {
A 320       $field_id = 'rcmfd_mdn_requests';
321       $select_mdn_requests = new html_select(array('name' => '_mdn_requests', 'id' => $field_id));
322       $select_mdn_requests->add(rcube_label('askuser'), 0);
323       $select_mdn_requests->add(rcube_label('autosend'), 1);
a99968 324       $select_mdn_requests->add(rcube_label('autosendknown'), 3);
6c6bb0 325       $select_mdn_requests->add(rcube_label('autosendknownignore'), 4);
49771b 326       $select_mdn_requests->add(rcube_label('ignore'), 2);
A 327
328       $blocks['main']['options']['mdn_requests'] = array(
329         'title' => html::label($field_id, Q(rcube_label('mdnrequests'))),
330         'content' => $select_mdn_requests->show($config['mdn_requests']),
331       );
332     }
333
c321a9 334     $storage             = $RCMAIL->get_storage();
T 335     $threading_supported = $storage->get_capability('THREAD');
63ab02 336
A 337     if (!isset($no_override['autoexpand_threads']) && $threading_supported) {
f52c93 338       $field_id = 'rcmfd_autoexpand_threads';
T 339       $select_autoexpand_threads = new html_select(array('name' => '_autoexpand_threads', 'id' => $field_id));
340       $select_autoexpand_threads->add(rcube_label('never'), 0);
341       $select_autoexpand_threads->add(rcube_label('do_expand'), 1);
342       $select_autoexpand_threads->add(rcube_label('expand_only_unread'), 2);
f8e8af 343
f52c93 344       $blocks['main']['options']['autoexpand_threads'] = array(
600bb1 345         'title' => html::label($field_id, Q(rcube_label('autoexpand_threads'))),
A 346         'content' => $select_autoexpand_threads->show($config['autoexpand_threads']),
08ffd9 347       );
A 348     }
349
350     // show page size selection
a61cce 351     if (!isset($no_override['mail_pagesize'])) {
A 352       $field_id = 'rcmfd_mail_pagesize';
353       $input_pagesize = new html_inputfield(array('name' => '_mail_pagesize', 'id' => $field_id, 'size' => 5));
354
355       $size = intval($config['mail_pagesize'] ? $config['mail_pagesize'] : $config['pagesize']);
08ffd9 356
A 357       $blocks['main']['options']['pagesize'] = array(
358         'title' => html::label($field_id, Q(rcube_label('pagesize'))),
a61cce 359         'content' => $input_pagesize->show($size ? $size : 50),
f52c93 360       );
T 361     }
362
49771b 363     if (!isset($no_override['keep_alive'])) {
A 364       $field_id = 'rcmfd_keep_alive';
365       $select_keep_alive = new html_select(array('name' => '_keep_alive', 'id' => $field_id));
366
367       foreach(array(1, 3, 5, 10, 15, 30, 60) as $min)
368         if((!$config['min_keep_alive'] || $config['min_keep_alive'] <= $min * 60)
369             && (!$config['session_lifetime'] || $config['session_lifetime'] > $min)) {
370           $select_keep_alive->add(rcube_label(array('name' => 'everynminutes', 'vars' => array('n' => $min))), $min);
371         }
372
373       $blocks['new_message']['options']['keep_alive'] = array(
374         'title' => html::label($field_id, Q(rcube_label('keepalive'))),
375         'content' => $select_keep_alive->show($config['keep_alive']/60),
376       );
377     }
378
379     if (!isset($no_override['check_all_folders'])) {
380       $field_id = 'rcmfd_check_all_folders';
381       $input_check_all = new html_checkbox(array('name' => '_check_all_folders', 'id' => $field_id, 'value' => 1));
382
383       $blocks['new_message']['options']['check_all_folders'] = array(
384         'title' => html::label($field_id, Q(rcube_label('checkallfolders'))),
385         'content' => $input_check_all->show($config['check_all_folders']?1:0),
386       );
387     }
388
389     break;
f8e8af 390
49771b 391     // Message viewing
A 392     case 'mailview':
f8e8af 393
49771b 394     $blocks = array(
A 395       'main' => array('name' => Q(rcube_label('mainoptions'))),
396     );
397
398     // show checkbox for HTML/plaintext messages
399     if (!isset($no_override['prefer_html'])) {
400       $field_id = 'rcmfd_htmlmsg';
401       $input_preferhtml = new html_checkbox(array('name' => '_prefer_html', 'id' => $field_id, 'value' => 1,
81c2ce 402         'onchange' => "$('#rcmfd_show_images').prop('disabled', !this.checked).val(0)"));
49771b 403
A 404       $blocks['main']['options']['prefer_html'] = array(
405         'title' => html::label($field_id, Q(rcube_label('preferhtml'))),
406         'content' => $input_preferhtml->show($config['prefer_html']?1:0),
407       );
408     }
409
e55ab0 410     if (!isset($no_override['default_charset'])) {
A 411       $field_id = 'rcmfd_default_charset';
412
413       $blocks['main']['options']['default_charset'] = array(
414         'title' => html::label($field_id, Q(rcube_label('defaultcharset'))),
415         'content' => $RCMAIL->output->charset_selector(array(
81c2ce 416           'name' => '_default_charset', 'selected' => $config['default_charset']
A 417         ))
e55ab0 418       );
A 419     }
420
49771b 421     if (!isset($no_override['show_images'])) {
A 422       $field_id = 'rcmfd_show_images';
e01e79 423       $input_show_images = new html_select(array('name' => '_show_images', 'id' => $field_id,
A 424         'disabled' => !$config['prefer_html']));
49771b 425       $input_show_images->add(rcube_label('never'), 0);
A 426       $input_show_images->add(rcube_label('fromknownsenders'), 1);
427       $input_show_images->add(rcube_label('always'), 2);
428
429       $blocks['main']['options']['show_images'] = array(
430         'title' => html::label($field_id, Q(rcube_label('showremoteimages'))),
e01e79 431         'content' => $input_show_images->show($config['prefer_html'] ? $config['show_images'] : 0),
49771b 432       );
A 433     }
434
435     if (!isset($no_override['inline_images'])) {
436       $field_id = 'rcmfd_inline_images';
437       $input_inline_images = new html_checkbox(array('name' => '_inline_images', 'id' => $field_id, 'value' => 1));
438
439       $blocks['main']['options']['inline_images'] = array(
440         'title' => html::label($field_id, Q(rcube_label('showinlineimages'))),
441         'content' => $input_inline_images->show($config['inline_images']?1:0),
442       );
443     }
444
445     // "display after delete" checkbox
446     if (!isset($no_override['display_next'])) {
447       $field_id = 'rcmfd_displaynext';
448       $input_displaynext = new html_checkbox(array('name' => '_display_next', 'id' => $field_id, 'value' => 1));
449
450       $blocks['main']['options']['display_next'] = array(
451         'title' => html::label($field_id, Q(rcube_label('displaynext'))),
452         'content' => $input_displaynext->show($config['display_next']?1:0),
453       );
454     }
455
456     break;
f8e8af 457
49771b 458     // Mail composition
A 459     case 'compose':
f8e8af 460
49771b 461     $blocks = array(
66df08 462       'main'       => array('name' => Q(rcube_label('mainoptions'))),
A 463       'spellcheck' => array('name' => Q(rcube_label('spellcheckoptions'))),
464       'sig'        => array('name' => Q(rcube_label('signatureoptions'))),
49771b 465     );
A 466
467     if (!isset($no_override['htmleditor'])) {
468       $field_id = 'rcmfd_htmleditor';
868deb 469       $select_htmleditor = new html_select(array('name' => '_htmleditor', 'id' => $field_id));
A 470       $select_htmleditor->add(rcube_label('never'), 0);
471       $select_htmleditor->add(rcube_label('always'), 1);
472       $select_htmleditor->add(rcube_label('htmlonreply'), 2);
49771b 473
A 474       $blocks['main']['options']['htmleditor'] = array(
475         'title' => html::label($field_id, Q(rcube_label('htmleditor'))),
868deb 476         'content' => $select_htmleditor->show(intval($config['htmleditor'])),
49771b 477       );
A 478     }
479
480     if (!isset($no_override['draft_autosave'])) {
481       $field_id = 'rcmfd_autosave';
482       $select_autosave = new html_select(array('name' => '_draft_autosave', 'id' => $field_id, 'disabled' => empty($config['drafts_mbox'])));
483       $select_autosave->add(rcube_label('never'), 0);
484       foreach (array(1, 3, 5, 10) as $i => $min)
485         $select_autosave->add(rcube_label(array('name' => 'everynminutes', 'vars' => array('n' => $min))), $min*60);
486
487       $blocks['main']['options']['draft_autosave'] = array(
488         'title' => html::label($field_id, Q(rcube_label('autosavedraft'))),
489         'content' => $select_autosave->show($config['draft_autosave']),
490       );
491     }
492
493     if (!isset($no_override['mime_param_folding'])) {
494       $field_id = 'rcmfd_param_folding';
495       $select_param_folding = new html_select(array('name' => '_mime_param_folding', 'id' => $field_id));
496       $select_param_folding->add(rcube_label('2231folding'), 0);
497       $select_param_folding->add(rcube_label('miscfolding'), 1);
498       $select_param_folding->add(rcube_label('2047folding'), 2);
499
500       $blocks['main']['options']['mime_param_folding'] = array(
0207c4 501         'advanced' => true,
49771b 502         'title' => html::label($field_id, Q(rcube_label('mimeparamfolding'))),
A 503         'content' => $select_param_folding->show($config['mime_param_folding']),
504       );
505     }
47ad83 506
A 507     if (!isset($no_override['force_7bit'])) {
508       $field_id = 'rcmfd_force_7bit';
509       $input_7bit = new html_checkbox(array('name' => '_force_7bit', 'id' => $field_id, 'value' => 1));
510
511       $blocks['main']['options']['force_7bit'] = array(
512         'title' => html::label($field_id, Q(rcube_label('force7bit'))),
513         'content' => $input_7bit->show($config['force_7bit']?1:0),
514       );
515     }
516
b3660b 517     if (!isset($no_override['mdn_default'])) {
A 518       $field_id = 'rcmfd_mdn_default';
519       $input_mdn = new html_checkbox(array('name' => '_mdn_default', 'id' => $field_id, 'value' => 1));
520
521       $blocks['main']['options']['mdn_default'] = array(
522         'title' => html::label($field_id, Q(rcube_label('reqmdn'))),
523         'content' => $input_mdn->show($config['mdn_default']?1:0),
524       );
525     }
526
f22ea7 527     if (!isset($no_override['dsn_default'])) {
A 528       $field_id = 'rcmfd_dsn_default';
529       $input_dsn = new html_checkbox(array('name' => '_dsn_default', 'id' => $field_id, 'value' => 1));
530
531       $blocks['main']['options']['dsn_default'] = array(
532         'title' => html::label($field_id, Q(rcube_label('reqdsn'))),
533         'content' => $input_dsn->show($config['dsn_default']?1:0),
534       );
535     }
536
eeb85f 537     if (!isset($no_override['reply_same_folder'])) {
A 538       $field_id = 'rcmfd_reply_same_folder';
539       $input_reply_same_folder = new html_checkbox(array('name' => '_reply_same_folder', 'id' => $field_id, 'value' => 1));
540
541       $blocks['main']['options']['reply_same_folder'] = array(
542         'title' => html::label($field_id, Q(rcube_label('replysamefolder'))),
543         'content' => $input_reply_same_folder->show($config['reply_same_folder']?1:0),
544       );
545     }
546
651c7b 547     if (!isset($no_override['reply_mode'])) {
AM 548       $field_id = 'rcmfd_reply_mode';
549       $select_replymode = new html_select(array('name' => '_reply_mode', 'id' => $field_id,
550         'onchange' => "\$('#rcmfd_sig_above').attr('disabled',this.selectedIndex<2)"));
551       $select_replymode->add(rcube_label('replyempty'), -1);
0207c4 552       $select_replymode->add(rcube_label('replybottomposting'), 0);
T 553       $select_replymode->add(rcube_label('replytopposting'), 1);
50f56d 554
651c7b 555       $blocks['main']['options']['reply_mode'] = array(
0207c4 556         'title' => html::label($field_id, Q(rcube_label('whenreplying'))),
651c7b 557         'content' => $select_replymode->show(intval($config['reply_mode'])),
50f56d 558       );
A 559     }
560
1d5779 561     if (!isset($no_override['spellcheck_before_send']) && $config['enable_spellcheck']) {
A 562       $field_id = 'rcmfd_spellcheck_before_send';
563       $input_spellcheck = new html_checkbox(array('name' => '_spellcheck_before_send', 'id' => $field_id, 'value' => 1));
564
66df08 565       $blocks['spellcheck']['options']['spellcheck_before_send'] = array(
1d5779 566         'title' => html::label($field_id, Q(rcube_label('spellcheckbeforesend'))),
A 567         'content' => $input_spellcheck->show($config['spellcheck_before_send']?1:0),
568       );
569     }
570
66df08 571     if ($config['enable_spellcheck']) {
A 572       foreach (array('syms', 'nums', 'caps') as $key) {
573         $key = 'spellcheck_ignore_'.$key;
574         if (!isset($no_override[$key])) {
575           $input_spellcheck = new html_checkbox(array('name' => '_'.$key, 'id' => 'rcmfd_'.$key, 'value' => 1));
576
577           $blocks['spellcheck']['options'][$key] = array(
578             'title' => html::label($field_id, Q(rcube_label(str_replace('_', '', $key)))),
579             'content' => $input_spellcheck->show($config[$key]?1:0),
580           );
581         }
582       }
583     }
584
50f56d 585     if (!isset($no_override['show_sig'])) {
A 586       $field_id = 'rcmfd_show_sig';
587       $select_show_sig = new html_select(array('name' => '_show_sig', 'id' => $field_id));
0207c4 588       $select_show_sig->add(rcube_label('never'), 0);
T 589       $select_show_sig->add(rcube_label('always'), 1);
590       $select_show_sig->add(rcube_label('newmessageonly'), 2);
591       $select_show_sig->add(rcube_label('replyandforwardonly'), 3);
50f56d 592
0207c4 593       $blocks['sig']['options']['show_sig'] = array(
T 594         'title' => html::label($field_id, Q(rcube_label('autoaddsignature'))),
655bd9 595         'content' => $select_show_sig->show($RCMAIL->config->get('show_sig', 1)),
0207c4 596       );
T 597     }
598
599     if (!isset($no_override['sig_above'])) {
600       $field_id = 'rcmfd_sig_above';
651c7b 601       $select_sigabove = new html_select(array('name' => '_sig_above', 'id' => $field_id, 'disabled' => $config['reply_mode'] < 1));
655bd9 602       $select_sigabove->add(rcube_label('belowquote'), 0);
T 603       $select_sigabove->add(rcube_label('abovequote'), 1);
0207c4 604
T 605       $blocks['sig']['options']['sig_above'] = array(
655bd9 606         'title' => html::label($field_id, Q(rcube_label('replysignaturepos'))),
T 607         'content' => $select_sigabove->show($config['sig_above']?1:0),
0207c4 608       );
T 609     }
610
611     if (!isset($no_override['strip_existing_sig'])) {
612       $field_id = 'rcmfd_strip_existing_sig';
613       $input_stripexistingsig = new html_checkbox(array('name' => '_strip_existing_sig', 'id' => $field_id, 'value' => 1));
614
615       $blocks['sig']['options']['strip_existing_sig'] = array(
616         'title' => html::label($field_id, Q(rcube_label('replyremovesignature'))),
617         'content' => $input_stripexistingsig->show($config['strip_existing_sig']?1:0),
50f56d 618       );
A 619     }
49771b 620
c08396 621     if (!isset($no_override['forward_attachment'])) {
AM 622       $field_id = 'rcmfd_forward_attachment';
623       $select = new html_select(array('name' => '_forward_attachment', 'id' => $field_id));
624       $select->add(rcube_label('inline'), 0);
625       $select->add(rcube_label('asattachment'), 1);
626
627       $blocks['main']['options']['forward_attachment'] = array(
628         'title' => html::label($field_id, Q(rcube_label('forwardmode'))),
629         'content' => $select->show(intval($config['forward_attachment'])),
630       );
631     }
632
7e263e 633     if (!isset($no_override['default_font'])) {
A 634       $field_id     = 'rcmfd_default_font';
635       $fonts        = rcube_fontdefs();
636       $default_font = $config['default_font'] ? $config['default_font'] : 'Verdana';
637
638       $select = '<select name="_default_font" id="'.$field_id.'">';
639       foreach ($fonts as $fname => $font)
640         $select .= '<option value="'.$fname.'"'
641           . ($fname == $default_font ? ' selected="selected"' : '')
642           . ' style=\'font-family: ' . $font . '\'>'
643           . Q($fname) . '</option>';
644       $select .= '</select>';
645
646       $blocks['main']['options']['default_font'] = array(
647         'title' => html::label($field_id, Q(rcube_label('defaultfont'))),
648         'content' => $select
649       );
650     }
651
49771b 652     break;
f8e8af 653
d73448 654
A 655     // Addressbook config
656     case 'addressbook':
657
658     $blocks = array(
659       'main' => array('name' => Q(rcube_label('mainoptions'))),
660     );
661
662     if (!isset($no_override['default_addressbook'])
663       && ($books = $RCMAIL->get_address_sources(true))
664     ) {
665       $field_id = 'rcmfd_default_addressbook';
666       $select_abook = new html_select(array('name' => '_default_addressbook', 'id' => $field_id));
667
668       foreach ($books as $book) {
669         $select_abook->add($book['name'], $book['id']);
670       }
671
672       $blocks['main']['options']['default_addressbook'] = array(
673         'title' => html::label($field_id, Q(rcube_label('defaultaddressbook'))),
674         'content' => $select_abook->show($config['default_addressbook']),
675       );
676     }
677
f9a967 678     // show addressbook listing mode selection
T 679     if (!isset($no_override['addressbook_name_listing'])) {
680       $field_id = 'rcmfd_addressbook_name_listing';
681       $select_listing = new html_select(array('name' => '_addressbook_name_listing', 'id' => $field_id));
682       $select_listing->add(rcube_label('name'), 0);
683       $select_listing->add(rcube_label('firstname') . ' '  . rcube_label('surname'), 1);
684       $select_listing->add(rcube_label('surname')   . ' '  . rcube_label('firstname'), 2);
685       $select_listing->add(rcube_label('surname')   . ', ' . rcube_label('firstname'), 3);
686
687       $blocks['main']['options']['list_name_listing'] = array(
688         'title' => html::label($field_id, Q(rcube_label('listnamedisplay'))),
689         'content' => $select_listing->show($config['addressbook_name_listing']),
690       );
691     }
692
438753 693     // show addressbook sort column
T 694     if (!isset($no_override['addressbook_sort_col'])) {
695       $field_id = 'rcmfd_addressbook_sort_col';
696       $select_sort = new html_select(array('name' => '_addressbook_sort_col', 'id' => $field_id));
697       $select_sort->add(rcube_label('name'), 'name');
698       $select_sort->add(rcube_label('firstname'), 'firstname');
699       $select_sort->add(rcube_label('surname'), 'surname');
710b1b 700
438753 701       $blocks['main']['options']['sort_col'] = array(
T 702         'title' => html::label($field_id, Q(rcube_label('listsorting'))),
703         'content' => $select_sort->show($config['addressbook_sort_col']),
710b1b 704       );
A 705     }
706
08ffd9 707     // show addressbook page size selection
A 708     if (!isset($no_override['addressbook_pagesize'])) {
709       $field_id = 'rcmfd_addressbook_pagesize';
710       $input_pagesize = new html_inputfield(array('name' => '_addressbook_pagesize', 'id' => $field_id, 'size' => 5));
711
a61cce 712       $size = intval($config['addressbook_pagesize'] ? $config['addressbook_pagesize'] : $config['pagesize']);
08ffd9 713
A 714       $blocks['main']['options']['pagesize'] = array(
715         'title' => html::label($field_id, Q(rcube_label('pagesize'))),
a61cce 716         'content' => $input_pagesize->show($size ? $size : 50),
08ffd9 717       );
A 718     }
719
438753 720     if (!isset($no_override['autocomplete_single'])) {
T 721       $field_id = 'rcmfd_autocomplete_single';
722       $checkbox = new html_checkbox(array('name' => '_autocomplete_single', 'id' => $field_id, 'value' => 1));
723
724       $blocks['main']['options']['autocomplete_single'] = array(
725         'title' => html::label($field_id, Q(rcube_label('autocompletesingle'))),
726         'content' => $checkbox->show($config['autocomplete_single']?1:0),
727       );
728     }
729
d73448 730     break;
A 731
49771b 732     // Special IMAP folders
A 733     case 'folders':
f8e8af 734
49771b 735     $blocks = array(
A 736       'main' => array('name' => Q(rcube_label('mainoptions'))),
737     );
738
739     // Configure special folders
c321a9 740     if (!isset($no_override['default_folders'])) {
63ab02 741       // load folders list only when needed
A 742       if ($current) {
e2dfb5 743         $select = rcmail_mailbox_select(array(
A 744           'noselection'   => '---',
745           'realnames'     => true,
746           'maxlength'     => 30,
747           'folder_filter' => 'mail',
748           'folder_rights' => 'w',
749           // #1486114, #1488279
750           'onchange'      => "if ($(this).val() == 'INBOX') $(this).val('')",
751         ));
63ab02 752       }
A 753       else // dummy select
754         $select = new html_select();
49771b 755
A 756       if (!isset($no_override['drafts_mbox']))
757         $blocks['main']['options']['drafts_mbox'] = array(
758           'title' => Q(rcube_label('drafts')),
759           'content' => $select->show($config['drafts_mbox'], array('name' => "_drafts_mbox")),
760         );
761
762       if (!isset($no_override['sent_mbox']))
763         $blocks['main']['options']['sent_mbox'] = array(
764           'title' => Q(rcube_label('sent')),
765           'content' => $select->show($config['sent_mbox'], array('name' => "_sent_mbox")),
766     );
767
768       if (!isset($no_override['junk_mbox']))
769         $blocks['main']['options']['junk_mbox'] = array(
770           'title' => Q(rcube_label('junk')),
771           'content' => $select->show($config['junk_mbox'], array('name' => "_junk_mbox")),
772     );
773
774       if (!isset($no_override['trash_mbox']))
775         $blocks['main']['options']['trash_mbox'] = array(
776           'title' => Q(rcube_label('trash')),
777           'content' => $select->show($config['trash_mbox'], array('name' => "_trash_mbox")),
778         );
779     }
780
781     break;
f8e8af 782
49771b 783     // Server settings
A 784     case 'server':
f8e8af 785
49771b 786     $blocks = array(
A 787       'main' => array('name' => Q(rcube_label('mainoptions'))),
788       'maintenance' => array('name' => Q(rcube_label('maintenance'))),
789     );
790
791     if (!isset($no_override['read_when_deleted'])) {
792       $field_id = 'rcmfd_read_deleted';
793       $input_readdeleted = new html_checkbox(array('name' => '_read_when_deleted', 'id' => $field_id, 'value' => 1));
794
795       $blocks['main']['options']['read_when_deleted'] = array(
796         'title' => html::label($field_id, Q(rcube_label('readwhendeleted'))),
797         'content' => $input_readdeleted->show($config['read_when_deleted']?1:0),
798       );
799     }
800
801     if (!isset($no_override['flag_for_deletion'])) {
802       $field_id = 'rcmfd_flag_for_deletion';
803       $input_flagfordeletion = new html_checkbox(array('name' => '_flag_for_deletion', 'id' => $field_id, 'value' => 1));
804
805       $blocks['main']['options']['flag_for_deletion'] = array(
806         'title' => html::label($field_id, Q(rcube_label('flagfordeletion'))),
807         'content' => $input_flagfordeletion->show($config['flag_for_deletion']?1:0),
808       );
809     }
810
811     // don't show deleted messages
812     if (!isset($no_override['skip_deleted'])) {
813       $field_id = 'rcmfd_skip_deleted';
814       $input_purge = new html_checkbox(array('name' => '_skip_deleted', 'id' => $field_id, 'value' => 1));
815
816       $blocks['main']['options']['skip_deleted'] = array(
817         'title' => html::label($field_id, Q(rcube_label('skipdeleted'))),
818         'content' => $input_purge->show($config['skip_deleted']?1:0),
819       );
820     }
821
b7f952 822     if (!isset($no_override['delete_always'])) {
A 823       $field_id = 'rcmfd_delete_always';
824       $input_delete_always = new html_checkbox(array('name' => '_delete_always', 'id' => $field_id, 'value' => 1));
825
826       $blocks['main']['options']['delete_always'] = array(
827         'title' => html::label($field_id, Q(rcube_label('deletealways'))),
828         'content' => $input_delete_always->show($config['delete_always']?1:0),
829       );
830     }
831
1b30a7 832     if (!isset($no_override['delete_junk'])) {
A 833       $field_id = 'rcmfd_delete_junk';
834       $input_delete_junk = new html_checkbox(array('name' => '_delete_junk', 'id' => $field_id, 'value' => 1));
835
836       $blocks['main']['options']['delete_junk'] = array(
837         'title' => html::label($field_id, Q(rcube_label('deletejunk'))),
838         'content' => $input_delete_junk->show($config['delete_junk']?1:0),
839       );
840     }
841
49771b 842     // Trash purging on logout
A 843     if (!isset($no_override['logout_purge'])) {
844       $field_id = 'rcmfd_logout_purge';
845       $input_purge = new html_checkbox(array('name' => '_logout_purge', 'id' => $field_id, 'value' => 1));
846
847       $blocks['maintenance']['options']['logout_purge'] = array(
848         'title' => html::label($field_id, Q(rcube_label('logoutclear'))),
849         'content' => $input_purge->show($config['logout_purge']?1:0),
850       );
851     }
852
853     // INBOX compacting on logout
854     if (!isset($no_override['logout_expunge'])) {
855       $field_id = 'rcmfd_logout_expunge';
856       $input_expunge = new html_checkbox(array('name' => '_logout_expunge', 'id' => $field_id, 'value' => 1));
857
858       $blocks['maintenance']['options']['logout_expunge'] = array(
859         'title' => html::label($field_id, Q(rcube_label('logoutcompact'))),
860         'content' => $input_expunge->show($config['logout_expunge']?1:0),
861       );
862     }
f8e8af 863
49771b 864     break;
A 865     }
866
e6ce00 867     $data = $RCMAIL->plugins->exec_hook('preferences_list', array('section' => $sect['id'], 'blocks' => $blocks));
49771b 868     $found = false;
f8e8af 869
49771b 870     // create output
A 871     foreach ($data['blocks'] as $block) {
f8e8af 872       if (!empty($block['content']) || !empty($block['options'])) {
A 873         $found = true;
874         break;
49771b 875       }
A 876     }
877
878     if (!$found)
879       unset($sections[$idx]);
880     else
881       $sections[$idx]['blocks'] = $data['blocks'];
882   }
883
884   return array($sections, $plugin['cols']);
885 }
886
887
888 function rcmail_get_skins()
889 {
890   $path = 'skins';
891   $skins = array();
892
893   $dir = opendir($path);
f8e8af 894
49771b 895   if (!$dir)
A 896     return false;
f8e8af 897
49771b 898   while (($file = readdir($dir)) !== false)
A 899   {
900     $filename = $path.'/'.$file;
90b1cb 901     if (!preg_match('/^\./', $file) && is_dir($filename) && is_readable($filename))
49771b 902       $skins[] = $file;
A 903   }
904
905   closedir($dir);
906
907   return $skins;
908 }
909
bbce3e 910
254d5e 911 function rcmail_folder_options($mailbox)
bbce3e 912 {
A 913     global $RCMAIL;
914
c321a9 915     $options = $RCMAIL->get_storage()->folder_info($mailbox);
67975b 916     $options['protected'] = $options['is_root'] || ($options['special'] && $RCMAIL->config->get('protect_default_folders'));
bbce3e 917
1a0343 918     return $options;
bbce3e 919 }
A 920
1a0343 921 /**
A 922  * Updates (or creates) folder row in the subscriptions table
923  *
924  * @param string $name      Folder name
925  * @param string $oldname   Old folder name (for update)
926  * @param bool   $subscribe Checks subscription checkbox
927  * @param string $class     CSS class name for folder row
928  */
929 function rcmail_update_folder_row($name, $oldname=null, $subscribe=false, $class_name=null)
254d5e 930 {
63ff2a 931     global $RCMAIL, $OUTPUT;
A 932
933     $default_folders = (array) $RCMAIL->config->get('default_folders');
934     $protect_folders = $RCMAIL->config->get('protect_default_folders');
254d5e 935
c321a9 936     $storage      = $RCMAIL->get_storage();
T 937     $delimiter    = $storage->get_hierarchy_delimiter();
254d5e 938     $name_utf8    = rcube_charset_convert($name, 'UTF7-IMAP');
63ff2a 939     $protected    = $protect_folders && in_array($name, $default_folders);
254d5e 940
c321a9 941     $foldersplit  = explode($delimiter, $storage->mod_folder($name));
254d5e 942     $level        = count($foldersplit) - 1;
A 943     $display_name = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level)
944         . Q($protected ? rcmail_localize_foldername($name) : rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP'));
945
946     if ($oldname === null)
1a0343 947         $OUTPUT->command('add_folder_row', $name_utf8, $display_name, $protected, $subscribe,
A 948             false, $class_name);
254d5e 949     else
A 950         $OUTPUT->command('replace_folder_row', rcube_charset_convert($oldname, 'UTF7-IMAP'),
1a0343 951             $name_utf8, $display_name, $protected, $class_name);
254d5e 952 }
A 953
bbce3e 954
f11541 955 // register UI objects
T 956 $OUTPUT->add_handlers(array(
f05834 957   'prefsframe' => 'rcmail_preferences_frame',
A 958   'sectionslist' => 'rcmail_sections_list',
b89d5a 959   'identitieslist' => 'rcmail_identities_list',
f11541 960 ));
T 961
68d2d5 962 // register action aliases
A 963 $RCMAIL->register_action_map(array(
964     'folders'       => 'folders.inc',
965     'rename-folder' => 'folders.inc',
966     'delete-folder' => 'folders.inc',
967     'subscribe'     => 'folders.inc',
968     'unsubscribe'   => 'folders.inc',
969     'purge'         => 'folders.inc',
970     'folder-size'   => 'folders.inc',
971     'add-identity'  => 'edit_identity.inc',
972 ));