| | |
| | | | program/steps/settings/func.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2007, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | Copyright (C) 2005-2012, The Roundcube Dev Team | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | | | See the README file for a full license statement. | |
| | | | | |
| | | | PURPOSE: | |
| | | | Provide functionality for user's settings & preferences | |
| | |
| | | +-----------------------------------------------------------------------+ |
| | | | Author: Thomas Bruederli <roundcube@gmail.com> | |
| | | +-----------------------------------------------------------------------+ |
| | | |
| | | $Id$ |
| | | |
| | | */ |
| | | |
| | | if (!$OUTPUT->ajax_call) |
| | |
| | | if (!$attrib['id']) |
| | | $attrib['id'] = 'rcmprefsframe'; |
| | | |
| | | $attrib['name'] = $attrib['id']; |
| | | |
| | | $OUTPUT->set_env('contentframe', $attrib['name']); |
| | | $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif'); |
| | | |
| | | return html::iframe($attrib); |
| | | return $OUTPUT->frame($attrib, true); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | $sections['general'] = array('id' => 'general', 'section' => rcube_label('uisettings')); |
| | | $sections['mailbox'] = array('id' => 'mailbox', 'section' => rcube_label('mailboxview')); |
| | | $sections['compose'] = array('id' => 'compose', 'section' => rcube_label('messagescomposition')); |
| | | $sections['mailview'] = array('id' => 'mailview','section' => rcube_label('messagesdisplaying')); |
| | | $sections['compose'] = array('id' => 'compose', 'section' => rcube_label('messagescomposition')); |
| | | $sections['addressbook'] = array('id' => 'addressbook','section' => rcube_label('addressbook')); |
| | | $sections['folders'] = array('id' => 'folders', 'section' => rcube_label('specialfolders')); |
| | | $sections['server'] = array('id' => 'server', 'section' => rcube_label('serversettings')); |
| | |
| | | case 'general': |
| | | |
| | | $blocks = array( |
| | | 'main' => array('name' => Q(rcube_label('mainoptions'))), |
| | | 'main' => array('name' => Q(rcube_label('mainoptions'))), |
| | | ); |
| | | |
| | | // language selection |
| | |
| | | $select_timezone = new html_select(array('name' => '_timezone', 'id' => $field_id)); |
| | | $select_timezone->add(rcube_label('autodetect'), 'auto'); |
| | | |
| | | $now = new DateTime(); |
| | | $zones = array(); |
| | | foreach (DateTimeZone::listIdentifiers() as $i => $tzs) { |
| | | $tz = new DateTimeZone($tzs); |
| | | $date = new DateTime('2012-12-21', $tz); |
| | | $offset = $date->format('Z') + 45000; |
| | | $sortkey = sprintf('%06d.%s', $offset, $tzs); |
| | | $zones[$sortkey] = array($tzs, $date->format('P')); |
| | | try { |
| | | $tz = new DateTimeZone($tzs); |
| | | $date = new DateTime('2012-12-21', $tz); |
| | | $offset = $date->format('Z') + 45000; |
| | | $sortkey = sprintf('%06d.%s', $offset, $tzs); |
| | | $zones[$sortkey] = array($tzs, $date->format('P')); |
| | | } |
| | | catch (Exception $e) {} |
| | | } |
| | | |
| | | ksort($zones); |
| | |
| | | list($tzs, $offset) = $zone; |
| | | $select_timezone->add('(GMT ' . $offset . ') ' . strtr($tzs, '_', ' '), $tzs); |
| | | } |
| | | |
| | | if (is_numeric($config['timezone'])) |
| | | timezone_name_from_abbr("", $config['timezone'] * 3600, 0); |
| | | |
| | | $blocks['main']['options']['timezone'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('timezone'))), |
| | |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['refresh_interval'])) { |
| | | $field_id = 'rcmfd_refresh_interval'; |
| | | $select_refresh_interval = new html_select(array('name' => '_refresh_interval', 'id' => $field_id)); |
| | | |
| | | $select_refresh_interval->add(rcube_label('never'), 0); |
| | | foreach (array(1, 3, 5, 10, 15, 30, 60) as $min) { |
| | | if (!$config['min_refresh_interval'] || $config['min_refresh_interval'] <= $min * 60) { |
| | | $label = rcube_label(array('name' => 'everynminutes', 'vars' => array('n' => $min))); |
| | | $select_refresh_interval->add($label, $min); |
| | | } |
| | | } |
| | | |
| | | $blocks['main']['options']['refresh_interval'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('refreshinterval'))), |
| | | 'content' => $select_refresh_interval->show($config['refresh_interval']/60), |
| | | ); |
| | | } |
| | | |
| | | // show drop-down for available skins |
| | | if (!isset($no_override['skin'])) { |
| | | $skins = rcmail_get_skins(); |
| | | |
| | | if (count($skins) > 1) { |
| | | $field_id = 'rcmfd_skin'; |
| | | $input_skin = new html_select(array('name'=>'_skin', 'id'=>$field_id)); |
| | | $input_skin = new html_radiobutton(array('name'=>'_skin')); |
| | | |
| | | foreach($skins as $skin) |
| | | $input_skin->add($skin, $skin); |
| | | $blocks['skin'] = array('name' => Q(rcube_label('skin')),); |
| | | |
| | | $blocks['main']['options']['skin'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('skin'))), |
| | | 'content' => $input_skin->show($config['skin']), |
| | | ); |
| | | foreach($skins as $skin) { |
| | | $thumbnail = "./skins/$skin/thumbnail.png"; |
| | | if (!is_file($thumbnail)) |
| | | $thumbnail = './program/resources/blank.gif'; |
| | | |
| | | $skinname = ucfirst($skin); |
| | | $author_link = $license_link = ''; |
| | | $meta = @json_decode(@file_get_contents("./skins/$skin/meta.json"), true); |
| | | if (is_array($meta) && $meta['name']) { |
| | | $skinname = $meta['name']; |
| | | $author_link = $meta['url'] ? html::a(array('href' => $meta['url'], 'target' => '_blank'), Q($meta['author'])) : Q($meta['author']); |
| | | $license_link = $meta['license-url'] ? html::a(array('href' => $meta['license-url'], 'target' => '_blank'), Q($meta['license'])) : Q($meta['license']); |
| | | } |
| | | |
| | | $blocks['skin']['options'][$skin]['content'] = html::label(array('class' => 'skinselection'), |
| | | html::span('skinitem', $input_skin->show($config['skin'], array('value' => $skin, 'id' => $field_id.$skin))) . |
| | | html::span('skinitem', html::img(array('src' => $thumbnail, 'class' => 'skinthumbnail', 'alt' => $skin, 'width' => 64, 'height' => 64))) . |
| | | html::span('skinitem', html::span('skinname', Q($skinname)) . html::br() . |
| | | html::span('skinauthor', $author_link ? 'by ' . $author_link : '') . html::br() . |
| | | html::span('skinlicense', $license_link ? rcube_label('license').': ' . $license_link : '')) |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | |
| | | $product_name = $RCMAIL->config->get('product_name', 'Roundcube Webmail'); |
| | | $RCMAIL->output->add_script(sprintf("%s.check_protocol_handler('%s', '#mailtoprotohandler');", |
| | | JS_OBJECT_NAME, JQ($product_name)), 'foot'); |
| | | |
| | | $blocks['browser'] = array( |
| | | 'name' => Q(rcube_label('browseroptions')), |
| | | 'options' => array('mailtoprotohandler' => array( |
| | | 'content' => html::a(array( |
| | | 'href' => '#', |
| | | 'id' => 'mailtoprotohandler'), Q(rcube_label('mailtoprotohandler'))), |
| | | )), |
| | | ); |
| | | |
| | | break; |
| | | |
| | |
| | | 'content' => $input_pagesize->show($size ? $size : 50), |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['keep_alive'])) { |
| | | $field_id = 'rcmfd_keep_alive'; |
| | | $select_keep_alive = new html_select(array('name' => '_keep_alive', 'id' => $field_id)); |
| | | |
| | | foreach(array(1, 3, 5, 10, 15, 30, 60) as $min) |
| | | if((!$config['min_keep_alive'] || $config['min_keep_alive'] <= $min * 60) |
| | | && (!$config['session_lifetime'] || $config['session_lifetime'] > $min)) { |
| | | $select_keep_alive->add(rcube_label(array('name' => 'everynminutes', 'vars' => array('n' => $min))), $min); |
| | | } |
| | | |
| | | $blocks['new_message']['options']['keep_alive'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('keepalive'))), |
| | | 'content' => $select_keep_alive->show($config['keep_alive']/60), |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['check_all_folders'])) { |
| | | $field_id = 'rcmfd_check_all_folders'; |
| | | $input_check_all = new html_checkbox(array('name' => '_check_all_folders', 'id' => $field_id, 'value' => 1)); |
| | |
| | | $blocks = array( |
| | | 'main' => array('name' => Q(rcube_label('mainoptions'))), |
| | | ); |
| | | |
| | | // show checkbox to open message view in new window |
| | | if (!isset($no_override['message_extwin'])) { |
| | | $field_id = 'rcmfd_message_extwin'; |
| | | $input_msgextwin = new html_checkbox(array('name' => '_message_extwin', 'id' => $field_id, 'value' => 1)); |
| | | |
| | | $blocks['main']['options']['message_extwin'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('showinextwin'))), |
| | | 'content' => $input_msgextwin->show($config['message_extwin']?1:0), |
| | | ); |
| | | } |
| | | |
| | | // show checkbox to show email instead of name |
| | | if (!isset($no_override['message_show_email'])) { |
| | | $field_id = 'rcmfd_message_show_email'; |
| | | $input_msgshowemail = new html_checkbox(array('name' => '_message_show_email', 'id' => $field_id, 'value' => 1)); |
| | | |
| | | $blocks['main']['options']['message_show_email'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('showemail'))), |
| | | 'content' => $input_msgshowemail->show($config['message_show_email']?1:0), |
| | | ); |
| | | } |
| | | |
| | | // show checkbox for HTML/plaintext messages |
| | | if (!isset($no_override['prefer_html'])) { |
| | |
| | | |
| | | $blocks = array( |
| | | 'main' => array('name' => Q(rcube_label('mainoptions'))), |
| | | 'spellcheck' => array('name' => Q(rcube_label('spellcheckoptions'))), |
| | | 'sig' => array('name' => Q(rcube_label('signatureoptions'))), |
| | | 'spellcheck' => array('name' => Q(rcube_label('spellcheckoptions'))), |
| | | ); |
| | | |
| | | // show checkbox to compose messages in a new window |
| | | if (!isset($no_override['compose_extwin'])) { |
| | | $field_id = 'rcmfdcompose_extwin'; |
| | | $input_compextwin = new html_checkbox(array('name' => '_compose_extwin', 'id' => $field_id, 'value' => 1)); |
| | | |
| | | $blocks['main']['options']['compose_extwin'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('composeextwin'))), |
| | | 'content' => $input_compextwin->show($config['compose_extwin']?1:0), |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['htmleditor'])) { |
| | | $field_id = 'rcmfd_htmleditor'; |
| | |
| | | $select_htmleditor->add(rcube_label('never'), 0); |
| | | $select_htmleditor->add(rcube_label('always'), 1); |
| | | $select_htmleditor->add(rcube_label('htmlonreply'), 2); |
| | | $select_htmleditor->add(rcube_label('htmlonreplyandforward'), 3); |
| | | |
| | | $blocks['main']['options']['htmleditor'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('htmleditor'))), |
| | |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['top_posting'])) { |
| | | $field_id = 'rcmfd_top_posting'; |
| | | $select_replymode = new html_select(array('name' => '_top_posting', 'id' => $field_id, |
| | | 'onchange' => "\$('#rcmfd_sig_above').attr('disabled',this.selectedIndex==0)")); |
| | | if (!isset($no_override['reply_mode'])) { |
| | | $field_id = 'rcmfd_reply_mode'; |
| | | $select_replymode = new html_select(array('name' => '_reply_mode', 'id' => $field_id)); |
| | | $select_replymode->add(rcube_label('replyempty'), -1); |
| | | $select_replymode->add(rcube_label('replybottomposting'), 0); |
| | | $select_replymode->add(rcube_label('replytopposting'), 1); |
| | | |
| | | $blocks['main']['options']['top_posting'] = array( |
| | | $blocks['main']['options']['reply_mode'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('whenreplying'))), |
| | | 'content' => $select_replymode->show($config['top_posting']?1:0), |
| | | 'content' => $select_replymode->show(intval($config['reply_mode'])), |
| | | ); |
| | | } |
| | | |
| | |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['sig_above'])) { |
| | | $field_id = 'rcmfd_sig_above'; |
| | | $select_sigabove = new html_select(array('name' => '_sig_above', 'id' => $field_id, 'disabled' => !$config['top_posting'])); |
| | | $select_sigabove->add(rcube_label('belowquote'), 0); |
| | | $select_sigabove->add(rcube_label('abovequote'), 1); |
| | | |
| | | $blocks['sig']['options']['sig_above'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('replysignaturepos'))), |
| | | 'content' => $select_sigabove->show($config['sig_above']?1:0), |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['strip_existing_sig'])) { |
| | | $field_id = 'rcmfd_strip_existing_sig'; |
| | | $input_stripexistingsig = new html_checkbox(array('name' => '_strip_existing_sig', 'id' => $field_id, 'value' => 1)); |
| | |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['forward_attachment'])) { |
| | | $field_id = 'rcmfd_forward_attachment'; |
| | | $select = new html_select(array('name' => '_forward_attachment', 'id' => $field_id)); |
| | | $select->add(rcube_label('inline'), 0); |
| | | $select->add(rcube_label('asattachment'), 1); |
| | | |
| | | $blocks['main']['options']['forward_attachment'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('forwardmode'))), |
| | | 'content' => $select->show(intval($config['forward_attachment'])), |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['default_font'])) { |
| | | $field_id = 'rcmfd_default_font'; |
| | | $fonts = rcube_fontdefs(); |
| | | $default_font = $config['default_font'] ? $config['default_font'] : 'Verdana'; |
| | | $field_id = 'rcmfd_default_font'; |
| | | $fonts = rcube_fontdefs(); |
| | | $selected = $config['default_font']; |
| | | |
| | | $select = '<select name="_default_font" id="'.$field_id.'">'; |
| | | $select .= '<option value=""' . (!$selected ? ' selected="selected"' : '') . '>---</option>'; |
| | | foreach ($fonts as $fname => $font) |
| | | $select .= '<option value="'.$fname.'"' |
| | | . ($fname == $default_font ? ' selected="selected"' : '') |
| | | . ($fname == $selected ? ' selected="selected"' : '') |
| | | . ' style=\'font-family: ' . $font . '\'>' |
| | | . Q($fname) . '</option>'; |
| | | $select .= '</select>'; |
| | |
| | | ); |
| | | |
| | | if (!isset($no_override['default_addressbook']) |
| | | && ($books = $RCMAIL->get_address_sources(true)) |
| | | && ($books = $RCMAIL->get_address_sources(true, true)) |
| | | ) { |
| | | $field_id = 'rcmfd_default_addressbook'; |
| | | $select_abook = new html_select(array('name' => '_default_addressbook', 'id' => $field_id)); |
| | | |
| | | foreach ($books as $book) { |
| | | $select_abook->add($book['name'], $book['id']); |
| | | $select_abook->add(html_entity_decode($book['name'], ENT_COMPAT, 'UTF-8'), $book['id']); |
| | | } |
| | | |
| | | $blocks['main']['options']['default_addressbook'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('defaultaddressbook'))), |
| | | 'title' => html::label($field_id, Q(rcube_label('defaultabook'))), |
| | | 'content' => $select_abook->show($config['default_addressbook']), |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['autocomplete_single'])) { |
| | | $field_id = 'rcmfd_autocomplete_single'; |
| | | $checkbox = new html_checkbox(array('name' => '_autocomplete_single', 'id' => $field_id, 'value' => 1)); |
| | | // show addressbook listing mode selection |
| | | if (!isset($no_override['addressbook_name_listing'])) { |
| | | $field_id = 'rcmfd_addressbook_name_listing'; |
| | | $select_listing = new html_select(array('name' => '_addressbook_name_listing', 'id' => $field_id)); |
| | | $select_listing->add(rcube_label('name'), 0); |
| | | $select_listing->add(rcube_label('firstname') . ' ' . rcube_label('surname'), 1); |
| | | $select_listing->add(rcube_label('surname') . ' ' . rcube_label('firstname'), 2); |
| | | $select_listing->add(rcube_label('surname') . ', ' . rcube_label('firstname'), 3); |
| | | |
| | | $blocks['main']['options']['autocomplete_single'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('autocompletesingle'))), |
| | | 'content' => $checkbox->show($config['autocomplete_single']?1:0), |
| | | $blocks['main']['options']['list_name_listing'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('listnamedisplay'))), |
| | | 'content' => $select_listing->show($config['addressbook_name_listing']), |
| | | ); |
| | | } |
| | | |
| | | // show addressbook sort column |
| | | if (!isset($no_override['addressbook_sort_col'])) { |
| | | $field_id = 'rcmfd_addressbook_sort_col'; |
| | | $select_sort = new html_select(array('name' => '_addressbook_sort_col', 'id' => $field_id)); |
| | | $select_sort->add(rcube_label('name'), 'name'); |
| | | $select_sort->add(rcube_label('firstname'), 'firstname'); |
| | | $select_sort->add(rcube_label('surname'), 'surname'); |
| | | |
| | | $blocks['main']['options']['sort_col'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('listsorting'))), |
| | | 'content' => $select_sort->show($config['addressbook_sort_col']), |
| | | ); |
| | | } |
| | | |
| | |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['autocomplete_single'])) { |
| | | $field_id = 'rcmfd_autocomplete_single'; |
| | | $checkbox = new html_checkbox(array('name' => '_autocomplete_single', 'id' => $field_id, 'value' => 1)); |
| | | |
| | | $blocks['main']['options']['autocomplete_single'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('autocompletesingle'))), |
| | | 'content' => $checkbox->show($config['autocomplete_single']?1:0), |
| | | ); |
| | | } |
| | | |
| | | break; |
| | | |
| | | // Special IMAP folders |
| | |
| | | 'main' => array('name' => Q(rcube_label('mainoptions'))), |
| | | ); |
| | | |
| | | |
| | | if (!isset($no_override['show_actual_foldernames'])) { |
| | | $field_id = 'show_actual_foldernames'; |
| | | $input_show_actual_foldernames = |
| | | new html_checkbox(array('name' => '_show_actual_foldernames', |
| | | 'id' => $field_id, 'value' => 1)); |
| | | |
| | | $blocks['main']['options']['show_actul_foldernames'] = array( |
| | | 'title' => html::label($field_id, |
| | | Q(rcube_label('show_actual_foldernames'))), |
| | | 'content' => $input_show_actual_foldernames->show($config['show_actual_foldernames']?1:0), |
| | | ); |
| | | } |
| | | // Configure special folders |
| | | if (!isset($no_override['default_folders'])) { |
| | | // load folders list only when needed |
| | |
| | | ); |
| | | } |
| | | |
| | | if (!isset($no_override['delete_junk'])) { |
| | | $field_id = 'rcmfd_delete_junk'; |
| | | $input_delete_junk = new html_checkbox(array('name' => '_delete_junk', 'id' => $field_id, 'value' => 1)); |
| | | |
| | | $blocks['main']['options']['delete_junk'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('deletejunk'))), |
| | | 'content' => $input_delete_junk->show($config['delete_junk']?1:0), |
| | | ); |
| | | } |
| | | |
| | | // Trash purging on logout |
| | | if (!isset($no_override['logout_purge'])) { |
| | | $field_id = 'rcmfd_logout_purge'; |
| | |
| | | */ |
| | | function rcmail_update_folder_row($name, $oldname=null, $subscribe=false, $class_name=null) |
| | | { |
| | | global $RCMAIL, $CONFIG, $OUTPUT; |
| | | global $RCMAIL, $OUTPUT; |
| | | |
| | | $default_folders = (array) $RCMAIL->config->get('default_folders'); |
| | | $protect_folders = $RCMAIL->config->get('protect_default_folders'); |
| | | |
| | | $storage = $RCMAIL->get_storage(); |
| | | $delimiter = $storage->get_hierarchy_delimiter(); |
| | | $name_utf8 = rcube_charset_convert($name, 'UTF7-IMAP'); |
| | | $protected = ($CONFIG['protect_default_folders'] == true && in_array($name, $CONFIG['default_folders'])); |
| | | $protected = $protect_folders && in_array($name, $default_folders); |
| | | |
| | | $foldersplit = explode($delimiter, $storage->mod_folder($name)); |
| | | $level = count($foldersplit) - 1; |