| | |
| | | | program/steps/mail/func.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2013, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2014, The Roundcube Dev Team | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | |
| | | |
| | | $a_threading = $RCMAIL->config->get('message_threading', array()); |
| | | $message_sort_col = $RCMAIL->config->get('message_sort_col'); |
| | | $message_sort_order = $RCMAIL->config->get('message_sort_col'); |
| | | $message_sort_order = $RCMAIL->config->get('message_sort_order'); |
| | | |
| | | // set default sort col/order to session |
| | | if (!isset($_SESSION['sort_col'])) { |
| | |
| | | } |
| | | |
| | | // remove mbox part from _uid |
| | | if (($_uid = get_input_value('_uid', RCUBE_INPUT_GPC)) && preg_match('/^\d+-[^,]+$/', $_uid)) { |
| | | list($_uid, $mbox) = explode('-', $_uid); |
| | | if (($_uid = rcube_utils::get_input_value('_uid', RCUBE_INPUT_GPC)) && !is_array($_uid) && preg_match('/^\d+-.+/', $_uid)) { |
| | | list($_uid, $mbox) = explode('-', $_uid, 2); |
| | | if (isset($_GET['_uid'])) $_GET['_uid'] = $_uid; |
| | | if (isset($_POST['_uid'])) $_POST['_uid'] = $_uid; |
| | | $_REQUEST['_uid'] = $_uid; |
| | | unset($_uid); |
| | | |
| | | if (empty($_REQUEST['_mbox']) && !empty($mbox)) { |
| | | // override mbox |
| | | if (!empty($mbox)) { |
| | | $_GET['_mbox'] = $mbox; |
| | | $_POST['_mbox'] = $mbox; |
| | | $RCMAIL->storage->set_folder(($_SESSION['mbox'] = $mbox)); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | $OUTPUT->set_env('search_mods', rcmail_search_mods()); |
| | | |
| | | if (!empty($_SESSION['search_scope'])) |
| | | $OUTPUT->set_env('search_scope', $_SESSION['search_scope']); |
| | | } |
| | | |
| | | $threading = (bool) $RCMAIL->storage->get_threading(); |
| | |
| | | if (!$OUTPUT->ajax_call) { |
| | | $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', |
| | | 'movingmessage', 'copyingmessage', 'deletingmessage', 'markingmessage', |
| | | 'copy', 'move', 'quota', 'replyall', 'replylist', 'importwait'); |
| | | 'copy', 'move', 'quota', 'replyall', 'replylist'); |
| | | } |
| | | |
| | | $pagetitle = $RCMAIL->localize_foldername($RCMAIL->storage->mod_folder($mbox_name), true); |
| | |
| | | 'upload' => 'attachments.inc', |
| | | 'group-expand' => 'autocomplete.inc', |
| | | )); |
| | | |
| | | |
| | | /** |
| | | * Returns message UID(s) and IMAP folder(s) from GET/POST data |
| | | * |
| | | * @return array List of message UIDs per folder |
| | | */ |
| | | function rcmail_get_uids() |
| | | { |
| | | // message UID (or comma-separated list of IDs) is provided in |
| | | // the form of <ID>-<MBOX>[,<ID>-<MBOX>]* |
| | | |
| | | $_uid = get_input_value('_uid', RCUBE_INPUT_GPC); |
| | | $_mbox = (string)get_input_value('_mbox', RCUBE_INPUT_GPC); |
| | | |
| | | if (is_array($uid)) { |
| | | return $uid; |
| | | } |
| | | |
| | | // create a per-folder UIDs array |
| | | $result = array(); |
| | | foreach (explode(',', $_uid) as $uid) { |
| | | list($uid, $mbox) = explode('-', $uid, 2); |
| | | if (empty($mbox)) |
| | | $mbox = $_mbox; |
| | | $result[$mbox][] = $uid; |
| | | } |
| | | |
| | | return $result; |
| | | } |
| | | |
| | | |
| | | /** |
| | |
| | | $OUTPUT->set_env('sort_col', $_SESSION['sort_col']); |
| | | $OUTPUT->set_env('sort_order', $_SESSION['sort_order']); |
| | | $OUTPUT->set_env('messages', array()); |
| | | $OUTPUT->set_env('coltypes', $a_show_cols); |
| | | $OUTPUT->set_env('listcols', $a_show_cols); |
| | | |
| | | $OUTPUT->include_script('list.js'); |
| | | |
| | |
| | | /** |
| | | * return javascript commands to add rows to the message list |
| | | */ |
| | | function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null) |
| | | function rcmail_js_message_list($a_headers, $insert_top=false, $a_show_cols=null) |
| | | { |
| | | global $RCMAIL, $OUTPUT; |
| | | |
| | |
| | | $head_replace = true; |
| | | } |
| | | |
| | | // add 'folder' column to list on multi-folder searches |
| | | $search_set = $RCMAIL->storage->get_search_set(); |
| | | $multifolder = $search_set && $search_set[1]->multi; |
| | | if ($multifolder && !in_array('folder', $a_show_cols)) { |
| | | $a_show_cols[] = 'folder'; |
| | | $head_replace = true; |
| | | } |
| | | |
| | | $mbox = $RCMAIL->storage->get_folder(); |
| | | |
| | | // make sure 'threads' and 'subject' columns are present |
| | |
| | | array_unshift($a_show_cols, 'subject'); |
| | | if (!in_array('threads', $a_show_cols)) |
| | | array_unshift($a_show_cols, 'threads'); |
| | | |
| | | $_SESSION['list_attrib']['columns'] = $a_show_cols; |
| | | |
| | | // Make sure there are no duplicated columns (#1486999) |
| | | $a_show_cols = array_unique($a_show_cols); |
| | |
| | | |
| | | $OUTPUT->command('set_message_coltypes', $a_show_cols, $thead, $smart_col); |
| | | |
| | | if ($multifolder && $_SESSION['search_scope'] == 'all') { |
| | | $OUTPUT->command('select_folder', ''); |
| | | } |
| | | |
| | | $OUTPUT->set_env('multifolder_listing', $multifolder); |
| | | |
| | | if (empty($a_headers)) { |
| | | return; |
| | | } |
| | |
| | | foreach ($a_headers as $header) { |
| | | if (empty($header)) |
| | | continue; |
| | | |
| | | // make message UIDs unique by appending the folder name |
| | | if ($multifolder) { |
| | | $header->uid .= '-'.$header->folder; |
| | | $header->flags['skip_mbox_check'] = true; |
| | | if ($header->parent_uid) |
| | | $header->parent_uid .= '-'.$header->folder; |
| | | } |
| | | |
| | | $a_msg_cols = array(); |
| | | $a_msg_flags = array(); |
| | |
| | | $list_menu = ''; |
| | | } |
| | | |
| | | $cells = array(); |
| | | $cells = $coltypes = array(); |
| | | |
| | | // get name of smart From/To column in folder context |
| | | if (array_search('fromto', $a_show_cols) !== false) { |
| | |
| | | } |
| | | |
| | | foreach ($a_show_cols as $col) { |
| | | $label = ''; |
| | | $sortable = false; |
| | | |
| | | // get column name |
| | | switch ($col) { |
| | | case 'flag': |
| | | $col_name = '<span class="flagged"> </span>'; |
| | | $col_name = html::span('flagged', ' '); |
| | | break; |
| | | case 'attachment': |
| | | case 'priority': |
| | | case 'status': |
| | | $col_name = '<span class="' . $col .'"> </span>'; |
| | | $col_name = html::span($col, ' '); |
| | | break; |
| | | case 'threads': |
| | | $col_name = $list_menu; |
| | | break; |
| | | case 'fromto': |
| | | $col_name = rcube::Q($RCMAIL->gettext($smart_col)); |
| | | $label = $RCMAIL->gettext($smart_col); |
| | | $col_name = rcube::Q($label); |
| | | break; |
| | | default: |
| | | $col_name = rcube::Q($RCMAIL->gettext($col)); |
| | | $label = $RCMAIL->gettext($col); |
| | | $col_name = rcube::Q($label); |
| | | } |
| | | |
| | | // make sort links |
| | | if (in_array($col, $a_sort_cols)) { |
| | | $sortable = true; |
| | | $col_name = html::a(array( |
| | | 'href' => "./#sort", |
| | | 'onclick' => 'return '.rcmail_output::JS_OBJECT_NAME.".command('sort','".$col."',this)", |
| | | 'title' => $RCMAIL->gettext('sortby') |
| | | 'href' => "./#sort", |
| | | 'class' => 'sortcol', |
| | | 'rel' => $col, |
| | | 'title' => $RCMAIL->gettext('sortby') |
| | | ), $col_name); |
| | | } |
| | | else if ($col_name[0] != '<') { |
| | |
| | | |
| | | // put it all together |
| | | $cells[] = array('className' => $class_name, 'id' => "rcm$col", 'html' => $col_name); |
| | | $coltypes[$col] = array('className' => $class_name, 'id' => "rcm$col", 'label' => $label, 'sortable' => $sortable); |
| | | } |
| | | |
| | | $RCMAIL->output->set_env('coltypes', $coltypes); |
| | | return $cells; |
| | | } |
| | | |
| | |
| | | $max = $RCMAIL->storage->count(NULL, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL'); |
| | | |
| | | if ($max == 0) |
| | | $out = $RCMAIL->gettext('mailboxempty'); |
| | | $out = $RCMAIL->storage->get_search_set() ? $RCMAIL->gettext('nomessages') : $RCMAIL->gettext('mailboxempty'); |
| | | else |
| | | $out = $RCMAIL->gettext(array('name' => $RCMAIL->storage->get_threading() ? 'threadsfromto' : 'messagesfromto', |
| | | 'vars' => array('from' => $start_msg, |
| | |
| | | { |
| | | $parts = array(); |
| | | foreach ($p as $key => $val) { |
| | | $parts[] = $key . '=' . ($key == 'folder' ? base64_encode($val) : $val); |
| | | $encode = $key == 'folder' || strpos($val, ';') !== false; |
| | | $parts[] = $key . '=' . ($encode ? 'B::' . base64_encode($val) : $val); |
| | | } |
| | | |
| | | return join('; ', $parts); |
| | |
| | | |
| | | foreach (preg_split('/;\s+/', $str) as $part) { |
| | | list($key, $val) = explode('=', $part, 2); |
| | | if ($key == 'folder') { |
| | | if (strpos($val, 'B::') === 0) { |
| | | $val = base64_decode(substr($val, 3)); |
| | | } |
| | | else if ($key == 'folder') { |
| | | $val = base64_decode($val); |
| | | } |
| | | |
| | |
| | | $ctypes = array('application/', 'multipart/m', 'multipart/signed', 'multipart/report'); |
| | | |
| | | // Build search string of "with attachment" filter |
| | | $attachment = str_repeat(' OR', count($ctypes)-1); |
| | | $attachment = trim(str_repeat(' OR', count($ctypes)-1)); |
| | | foreach ($ctypes as $type) { |
| | | $attachment .= ' HEADER Content-Type ' . rcube_imap_generic::escape($type); |
| | | } |
| | |
| | | $content); |
| | | |
| | | $RCMAIL->output->add_gui_object('importform', $attrib['id'].'Frm'); |
| | | $RCMAIL->output->add_label('selectimportfile','importwait'); |
| | | |
| | | return html::div($attrib, $out); |
| | | } |
| | | |
| | | /** |
| | | * Add groups from the given address source to the address book widget |
| | | */ |
| | | function rcmail_compose_contact_groups($abook, $source_id, $search = null, $search_mode = 0) |
| | | { |
| | | global $RCMAIL, $OUTPUT; |
| | | |
| | | $jsresult = array(); |
| | | foreach ($abook->list_groups($search, $search_mode) as $group) { |
| | | $abook->reset(); |
| | | $abook->set_group($group['ID']); |
| | | $group_prop = $abook->get_group($group['ID']); |
| | | |
| | | // group (distribution list) with email address(es) |
| | | if ($group_prop['email']) { |
| | | foreach ((array)$group_prop['email'] as $email) { |
| | | $row_id = 'G'.$group['ID']; |
| | | $jsresult[$row_id] = format_email_recipient($email, $group['name']); |
| | | $OUTPUT->command('add_contact_row', $row_id, array( |
| | | 'contactgroup' => html::span(array('title' => $email), rcube::Q($group['name']))), 'group'); |
| | | } |
| | | } |
| | | // make virtual groups clickable to list their members |
| | | else if ($group_prop['virtual']) { |
| | | $row_id = 'G'.$group['ID']; |
| | | $OUTPUT->command('add_contact_row', $row_id, array( |
| | | 'contactgroup' => html::a(array( |
| | | 'href' => '#list', |
| | | 'rel' => $group['ID'], |
| | | 'title' => $RCMAIL->gettext('listgroup'), |
| | | 'onclick' => sprintf("return %s.command('pushgroup',{'source':'%s','id':'%s'},this,event)", |
| | | rcmail_output::JS_OBJECT_NAME, $source_id, $group['ID']), |
| | | ), rcube::Q($group['name']) . ' ' . html::span('action', '»'))), |
| | | 'group', |
| | | array('ID' => $group['ID'], 'name' => $group['name'], 'virtual' => true)); |
| | | } |
| | | // show group with count |
| | | else if (($result = $abook->count()) && $result->count) { |
| | | $row_id = 'E'.$group['ID']; |
| | | $jsresult[$row_id] = $group['name']; |
| | | $OUTPUT->command('add_contact_row', $row_id, array( |
| | | 'contactgroup' => rcube::Q($group['name'] . ' (' . intval($result->count) . ')')), 'group'); |
| | | } |
| | | } |
| | | |
| | | $abook->reset(); |
| | | $abook->set_group(0); |
| | | |
| | | return $jsresult; |
| | | } |