| | |
| | | |
| | | /** |
| | | * Convert the given string into a valid HTML identifier |
| | | * Same functionality as done in app.js with this.identifier_expr |
| | | * |
| | | * Same functionality as done in app.js with rcube_webmail.html_identifier() |
| | | */ |
| | | function html_identifier($str) |
| | | function html_identifier($str, $encode=false) |
| | | { |
| | | return asciiwords($str, true, '_'); |
| | | if ($encode) |
| | | return rtrim(strtr(base64_encode($str), '+/', '-_'), '='); |
| | | else |
| | | return asciiwords($str, true, '_'); |
| | | } |
| | | |
| | | /** |
| | |
| | | * Convert the given date to a human readable form |
| | | * This uses the date formatting properties from config |
| | | * |
| | | * @param mixed Date representation (string or timestamp) |
| | | * @param mixed Date representation (string or timestamp) |
| | | * @param string Date format to use |
| | | * @param bool Enables date convertion according to user timezone |
| | | * |
| | | * @return string Formatted date string |
| | | */ |
| | | function format_date($date, $format=NULL) |
| | | function format_date($date, $format=NULL, $convert=true) |
| | | { |
| | | global $RCMAIL, $CONFIG; |
| | | |
| | | $ts = NULL; |
| | | |
| | | if (!empty($date)) |
| | | $ts = rcube_strtotime($date); |
| | |
| | | if (empty($ts)) |
| | | return ''; |
| | | |
| | | // get user's timezone offset |
| | | $tz = $RCMAIL->config->get_timezone(); |
| | | if ($convert) { |
| | | // get user's timezone offset |
| | | $tz = $RCMAIL->config->get_timezone(); |
| | | |
| | | // convert time to user's timezone |
| | | $timestamp = $ts - date('Z', $ts) + ($tz * 3600); |
| | | // convert time to user's timezone |
| | | $timestamp = $ts - date('Z', $ts) + ($tz * 3600); |
| | | |
| | | // get current timestamp in user's timezone |
| | | $now = time(); // local time |
| | | $now -= (int)date('Z'); // make GMT time |
| | | $now += ($tz * 3600); // user's time |
| | | $now_date = getdate($now); |
| | | |
| | | $today_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday'], $now_date['year']); |
| | | $week_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday']-6, $now_date['year']); |
| | | // get current timestamp in user's timezone |
| | | $now = time(); // local time |
| | | $now -= (int)date('Z'); // make GMT time |
| | | $now += ($tz * 3600); // user's time |
| | | } |
| | | else { |
| | | $now = time(); |
| | | $timestamp = $ts; |
| | | } |
| | | |
| | | // define date format depending on current time |
| | | if (!$format) { |
| | | $now_date = getdate($now); |
| | | $today_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday'], $now_date['year']); |
| | | $week_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday']-6, $now_date['year']); |
| | | |
| | | if ($CONFIG['prettydate'] && $timestamp > $today_limit && $timestamp < $now) { |
| | | $format = $RCMAIL->config->get('date_today', $RCMAIL->config->get('time_format', 'H:i')); |
| | | $today = true; |
| | |
| | | if ($p['noselection']) |
| | | $select->add($p['noselection'], ''); |
| | | |
| | | rcmail_render_folder_tree_select($a_mailboxes, $mbox, $p['maxlength'], $select, $p['realnames'], 0, $p['exceptions']); |
| | | rcmail_render_folder_tree_select($a_mailboxes, $mbox, $p['maxlength'], $select, $p['realnames'], 0, $p); |
| | | |
| | | return $select; |
| | | } |
| | |
| | | $path .= $prefix.$currentFolder; |
| | | |
| | | if (!isset($arrFolders[$currentFolder])) { |
| | | // Check \Noselect option (if options are in cache) |
| | | if (!$virtual && ($opts = $RCMAIL->imap->mailbox_options($path))) { |
| | | $virtual = in_array('\\Noselect', $opts); |
| | | } |
| | | |
| | | $arrFolders[$currentFolder] = array( |
| | | 'id' => $path, |
| | | 'name' => rcube_charset_convert($currentFolder, 'UTF7-IMAP'), |
| | |
| | | $realnames = (bool)$attrib['realnames']; |
| | | $msgcounts = $RCMAIL->imap->get_cache('messagecount'); |
| | | |
| | | $idx = 0; |
| | | $out = ''; |
| | | foreach ($arrFolders as $key => $folder) { |
| | | $title = null; |
| | | $title = null; |
| | | $folder_class = rcmail_folder_classname($folder['id']); |
| | | $collapsed = strpos($CONFIG['collapsed_folders'], '&'.rawurlencode($folder['id']).'&') !== false; |
| | | $unread = $msgcounts ? intval($msgcounts[$folder['id']]['UNSEEN']) : 0; |
| | | |
| | | if (($folder_class = rcmail_folder_classname($folder['id'])) && !$realnames) { |
| | | if ($folder_class && !$realnames) { |
| | | $foldername = rcube_label($folder_class); |
| | | } |
| | | else { |
| | |
| | | } |
| | | |
| | | // make folder name safe for ids and class names |
| | | $folder_id = html_identifier($folder['id']); |
| | | $folder_id = html_identifier($folder['id'], true); |
| | | $classes = array('mailbox'); |
| | | |
| | | // set special class for Sent, Drafts, Trash and Junk |
| | | if ($folder['id'] == $CONFIG['sent_mbox']) |
| | | $classes[] = 'sent'; |
| | | else if ($folder['id'] == $CONFIG['drafts_mbox']) |
| | | $classes[] = 'drafts'; |
| | | else if ($folder['id'] == $CONFIG['trash_mbox']) |
| | | $classes[] = 'trash'; |
| | | else if ($folder['id'] == $CONFIG['junk_mbox']) |
| | | $classes[] = 'junk'; |
| | | else if ($folder['id'] == 'INBOX') |
| | | $classes[] = 'inbox'; |
| | | else |
| | | $classes[] = '_'.asciiwords($folder_class ? $folder_class : strtolower($folder['id']), true); |
| | | if ($folder_class) |
| | | $classes[] = $folder_class; |
| | | |
| | | if ($folder['id'] == $mbox_name) |
| | | $classes[] = 'selected'; |
| | | |
| | | $collapsed = strpos($CONFIG['collapsed_folders'], '&'.rawurlencode($folder['id']).'&') !== false; |
| | | $unread = $msgcounts ? intval($msgcounts[$folder['id']]['UNSEEN']) : 0; |
| | | |
| | | if ($folder['virtual']) |
| | | $classes[] = 'virtual'; |
| | |
| | | } |
| | | |
| | | $out .= "</li>\n"; |
| | | $idx++; |
| | | } |
| | | |
| | | return $out; |
| | |
| | | * @access private |
| | | * @return string |
| | | */ |
| | | function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, &$select, $realnames=false, $nestLevel=0, $exceptions=array()) |
| | | function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, &$select, $realnames=false, $nestLevel=0, $opts=array()) |
| | | { |
| | | global $RCMAIL; |
| | | |
| | | $out = ''; |
| | | |
| | | foreach ($arrFolders as $key => $folder) { |
| | | if (empty($exceptions) || !in_array($folder['id'], $exceptions)) { |
| | | if (!$realnames && ($folder_class = rcmail_folder_classname($folder['id']))) |
| | | $foldername = rcube_label($folder_class); |
| | | else { |
| | | $foldername = $folder['name']; |
| | | |
| | | // shorten the folder name to a given length |
| | | if ($maxlength && $maxlength>1) |
| | | $foldername = abbreviate_string($foldername, $maxlength); |
| | | } |
| | | |
| | | $select->add(str_repeat(' ', $nestLevel*4) . $foldername, $folder['id']); |
| | | } |
| | | else if ($nestLevel) |
| | | // skip exceptions (and its subfolders) |
| | | if (!empty($opts['exceptions']) && in_array($folder['id'], $opts['exceptions'])) { |
| | | continue; |
| | | } |
| | | |
| | | // skip folders in which it isn't possible to create subfolders |
| | | if (!empty($opts['skip_noinferiors']) && ($attrs = $RCMAIL->imap->mailbox_attributes($folder['id'])) |
| | | && in_array('\\Noinferiors', $attrs) |
| | | ) { |
| | | continue; |
| | | } |
| | | |
| | | if (!$realnames && ($folder_class = rcmail_folder_classname($folder['id']))) |
| | | $foldername = rcube_label($folder_class); |
| | | else { |
| | | $foldername = $folder['name']; |
| | | |
| | | // shorten the folder name to a given length |
| | | if ($maxlength && $maxlength>1) |
| | | $foldername = abbreviate_string($foldername, $maxlength); |
| | | } |
| | | |
| | | $select->add(str_repeat(' ', $nestLevel*4) . $foldername, $folder['id']); |
| | | |
| | | if (!empty($folder['folders'])) |
| | | $out .= rcmail_render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, |
| | | $select, $realnames, $nestLevel+1, $exceptions); |
| | | $select, $realnames, $nestLevel+1, $opts); |
| | | } |
| | | |
| | | return $out; |
| | |
| | | */ |
| | | function rcube_html_editor($mode='') |
| | | { |
| | | global $RCMAIL, $CONFIG; |
| | | global $RCMAIL; |
| | | |
| | | $hook = $RCMAIL->plugins->exec_hook('html_editor', array('mode' => $mode)); |
| | | |
| | |
| | | |
| | | $lang = strtolower($_SESSION['language']); |
| | | |
| | | // TinyMCE uses 'tw' for zh_TW (which is wrong, because tw is a code of Twi language) |
| | | $lang = ($lang == 'zh_tw') ? 'tw' : substr($lang, 0, 2); |
| | | // TinyMCE uses two-letter lang codes, with exception of Chinese |
| | | if (strpos($lang, 'zh_') === 0) |
| | | $lang = str_replace('_', '-', $lang); |
| | | else |
| | | $lang = substr($lang, 0, 2); |
| | | |
| | | if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$lang.'.js')) |
| | | $lang = 'en'; |
| | |
| | | 'mode' => $mode, |
| | | 'skin_path' => '$__skin_path', |
| | | 'lang' => $lang, |
| | | 'spellcheck' => intval($CONFIG['enable_spellcheck']), |
| | | 'spelldict' => intval($CONFIG['spellcheck_dictionary']), |
| | | 'spellcheck' => intval($RCMAIL->config->get('enable_spellcheck')), |
| | | 'spelldict' => intval($RCMAIL->config->get('spellcheck_dictionary')), |
| | | ))), 'foot'); |
| | | } |
| | | |