Files
server/usr/share/psa-horde/imp/lib/Basic/Mailbox.php
2026-01-07 20:52:11 +01:00

1020 lines
39 KiB
PHP

<?php
/**
* Copyright 1999-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @category Horde
* @copyright 1999-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Basic view mailbox page.
*
* @author Chuck Hagenbuch <chuck@horde.org>
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 1999-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Basic_Mailbox extends IMP_Basic_Base
{
const FLAG_FILTER_PREFIX = "flag\0";
/**
*/
protected function _init()
{
global $injector, $notification, $page_output, $prefs, $registry, $session;
$mailbox = $this->indices->mailbox;
/* Call the mailbox redirection hook, if requested. */
try {
$redirect = $injector->getInstance('Horde_Core_Hooks')->callHook(
'mbox_redirect',
'imp',
array($mailbox)
);
if (!empty($redirect)) {
Horde::url($redirect, true)->redirect();
}
} catch (Horde_Exception_HookNotSet $e) {}
$mailbox_url = Horde::url('basic.php')->add('page', 'mailbox');
$mailbox_imp_url = $mailbox->url('mailbox')->add('newmail', 1);
$imp_flags = $injector->getInstance('IMP_Flags');
$imp_imap = $mailbox->imp_imap;
$imp_search = $injector->getInstance('IMP_Search');
/* Run through the action handlers */
if (($actionID = $this->vars->actionID) &&
($actionID != 'message_missing')) {
try {
$session->checkToken($this->vars->token);
} catch (Horde_Exception $e) {
$notification->push($e);
$actionID = null;
}
}
/* We know we are going to be exclusively dealing with this mailbox,
* so select it on the IMAP server (saves some STATUS calls). Open
* R/W to clear the RECENT flag. This call will catch invalid
* mailboxes. */
$imp_imap->openMailbox($mailbox, Horde_Imap_Client::OPEN_READWRITE);
$imp_mailbox = $mailbox->list_ob;
/* Determine if mailbox is readonly. */
$readonly = $mailbox->readonly;
switch ($actionID) {
case 'change_sort':
$mailbox->setSort($this->vars->sortby, $this->vars->sortdir);
break;
case 'blacklist':
$injector->getInstance('IMP_Filter')->blacklistMessage($this->indices);
break;
case 'whitelist':
$injector->getInstance('IMP_Filter')->whitelistMessage($this->indices);
break;
case 'spam_report':
$injector->getInstance('IMP_Factory_Spam')->create(IMP_Spam::SPAM)->report($this->indices);
break;
case 'innocent_report':
$injector->getInstance('IMP_Factory_Spam')->create(IMP_Spam::INNOCENT)->report($this->indices);
break;
case 'message_missing':
$notification->push(_("Requested message not found."), 'horde.error');
break;
case 'fwd_digest':
case 'redirect_messages':
case 'template_edit':
if (count($this->indices)) {
$compose_actions = array(
'fwd_digest' => 'fwd_digest',
'redirect_messages' => 'redirect_compose',
'template_edit' => 'template_edit'
);
$clink = new IMP_Compose_Link($this->vars);
$options = array_merge(array(
'actionID' => $compose_actions[$actionID],
'muid' => strval($this->indices)
), $clink->args);
if ($prefs->getValue('compose_popup')) {
$page_output->addInlineScript(array(
Horde::popupJs(IMP_Basic_Compose::url(), array('novoid' => true, 'params' => array_merge(array('popup' => 1), $options)))
), true);
} else {
IMP_Basic_Compose::url()->add($options)->redirect();
}
}
break;
case 'delete_messages':
$injector->getInstance('IMP_Message')->delete($this->indices, array(
'mailboxob' => $imp_mailbox
));
break;
case 'undelete_messages':
$injector->getInstance('IMP_Message')->undelete($this->indices);
break;
case 'move_messages':
case 'copy_messages':
if (isset($this->vars->targetMbox) &&
count($this->indices) &&
(!$readonly || $actionID == 'copy_messages')) {
$targetMbox = IMP_Mailbox::formFrom($this->vars->targetMbox);
if (!empty($this->vars->newMbox) && ($this->vars->newMbox == 1)) {
$targetMbox = IMP_Mailbox::get($this->vars->targetMbox)->namespace_append;
$newMbox = true;
} else {
$targetMbox = IMP_Mailbox::formFrom($this->vars->targetMbox);
$newMbox = false;
}
$injector->getInstance('IMP_Message')->copy($targetMbox, ($actionID == 'move_messages') ? 'move' : 'copy', $this->indices, array(
'create' => $newMbox,
'mailboxob' => $imp_mailbox
));
}
break;
case 'flag_messages':
if (!$readonly && $this->vars->flag && count($this->indices)) {
$flag = $imp_flags->parseFormId($this->vars->flag);
$injector->getInstance('IMP_Message')->flag(array(
($flag['set'] ? 'add' : 'remove') => array($flag['flag'])
), $this->indices);
}
break;
case 'filter_messages':
if (!$readonly) {
$filter = IMP_Mailbox::formFrom($this->vars->filter);
$q_ob = null;
if (strpos($filter, self::FLAG_FILTER_PREFIX) === 0) {
/* Flag filtering. */
$flag_filter = $imp_flags->parseFormId(substr($filter, strpos($filter, "\0") + 1));
try {
$q_ob = $imp_search->createQuery(array(
new IMP_Search_Element_Flag(
$flag_filter['flag'],
$flag_filter['set']
)),
array(
'mboxes' => array($mailbox),
'type' => IMP_Search::CREATE_QUERY
)
);
} catch (InvalidArgumentException $e) {}
} else {
/* Pre-defined filters. */
try {
$q_ob = $imp_search->applyFilter($filter, array($mailbox));
} catch (InvalidArgumentException $e) {}
}
if ($q_ob) {
IMP_Mailbox::get($q_ob)->url('mailbox')->redirect();
exit;
}
}
break;
case 'hide_deleted':
$mailbox->setHideDeletedMsgs(!$prefs->getValue('delhide'));
break;
case 'expunge_mailbox':
$injector->getInstance('IMP_Message')->expungeMailbox(array(strval($mailbox) => 1), array(
'mailboxob' => $imp_mailbox
));
break;
case 'filter':
$mailbox->filter();
break;
case 'empty_mailbox':
$injector->getInstance('IMP_Message')->emptyMailbox(array(strval($mailbox)));
break;
case 'view_messages':
$mailbox->url(IMP_Basic_Thread::url(), null, false)->add(array(
'mode' => 'msgview',
'muid' => strval($this->indices)
))->redirect();
break;
}
/* Token to use in requests. */
$token = $session->getToken();
$search_mbox = $mailbox->search;
/* Deal with filter options. */
if (!$readonly &&
IMP_Filter::canApplyFilters() &&
!$mailbox->filterOnDisplay() &&
($mailbox->inbox ||
($prefs->getValue('filter_any_mailbox') && !$search_mbox))) {
$filter_url = $mailbox_imp_url->copy()->add(array(
'actionID' => 'filter',
'token' => $token
));
}
/* Generate folder options list. */
if ($imp_imap->access(IMP_Imap::ACCESS_FOLDERS)) {
$iterator = new IMP_Ftree_IteratorFilter(
$injector->getInstance('IMP_Ftree')
);
$iterator->add($iterator::NONIMAP);
$folder_options = new IMP_Ftree_Select(array(
'heading' => _("Messages to"),
'inc_notepads' => true,
'inc_tasklists' => true,
'iterator' => $iterator,
'new_mbox' => true
));
}
/* Build the list of messages in the mailbox. */
$pageOb = $imp_mailbox->buildMailboxPage($this->vars->mpage, $this->vars->start);
$show_preview = $prefs->getValue('preview_enabled');
$mbox_info = $imp_mailbox->getMailboxArray(range($pageOb['begin'], $pageOb['end']), array(
'headers' => true,
'preview' => (int)$show_preview,
'type' => $prefs->getValue('atc_flag')
));
/* Determine sorting preferences. */
$sortpref = $mailbox->getSort();
$thread_sort = ($sortpref->sortby == Horde_Imap_Client::SORT_THREAD);
/* Determine if we are going to show the Hide/Purge Deleted Message
* links. */
if (!($use_trash = $prefs->getValue('use_trash')) &&
!$mailbox->vinbox) {
$showdelete = array(
'hide' => true,
'purge' => $mailbox->access_expunge
);
} else {
$showdelete = array(
'hide' => false,
'purge' => false
);
}
if ($showdelete['hide'] && !$prefs->isLocked('delhide')) {
if ($prefs->getValue('delhide')) {
$deleted_prompt = _("Show Deleted");
} else {
$deleted_prompt = _("Hide Deleted");
}
}
/* Generate paging links. */
if ($pageOb['pagecount']) {
if ($pageOb['page'] == 1) {
$url_first = $url_prev = null;
$pages_first = 'navfirstgreyImg';
$pages_prev = 'navleftgreyImg';
} else {
$url_first = $mailbox_imp_url->copy()->add('mpage', 1);
$pages_first = 'navfirstImg';
$url_prev = $mailbox_imp_url->copy()->add('mpage', $pageOb['page'] - 1);
$pages_prev = 'navleftImg';
}
if ($pageOb['page'] == $pageOb['pagecount']) {
$url_last = $url_next = null;
$pages_last = 'navlastgreyImg';
$pages_next = 'navrightgreyImg';
} else {
$url_next = $mailbox_imp_url->copy()->add('mpage', $pageOb['page'] + 1);
$pages_next = 'navrightImg';
$url_last = $mailbox_imp_url->copy()->add('mpage', $pageOb['pagecount']);
$pages_last = 'navlastImg';
}
}
/* Generate RSS link. */
if ($mailbox->inbox) {
$rss_box = '';
} else {
$ns_info = $mailbox->namespace_info;
if (is_null($ns_info)) {
$rss_box = null;
} else {
$rss_box = str_replace(
rawurlencode($ns_info->delimiter),
'/',
rawurlencode($ns_info->delimiter . (($ns_info->type == $ns_info::NS_PERSONAL) ? $ns_info->stripNamespace($mailbox) : $mailbox))
);
}
}
if (!is_null($rss_box)) {
$page_output->addLinkTag(array(
'href' => Horde::url('rss.php', true, -1) . $rss_box
));
}
/* If user wants the mailbox to be refreshed, set time here. */
$refresh_url = $mailbox_imp_url->copy()->add('mpage', $pageOb['page']);
if (isset($filter_url)) {
$filter_url->add('mpage', $pageOb['page']);
}
/* Determine if we are showing previews. */
$preview_tooltip = $show_preview
? $prefs->getValue('preview_show_tooltip')
: false;
if (!$preview_tooltip) {
$strip_preview = $prefs->getValue('preview_strip_nl');
}
$unread = $imp_mailbox->unseenMessages(Horde_Imap_Client::SEARCH_RESULTS_COUNT);
$page_output->addInlineJsVars(array(
'ImpMailbox.pop3' => intval(!$mailbox->is_imap),
'ImpMailbox.text' => array(
'delete_messages' => _("Are you sure you wish to PERMANENTLY delete these messages?"),
'delete_all' => _("Are you sure you wish to delete all mail in this mailbox?"),
'delete_vfolder' => _("Are you sure you want to delete this Virtual Folder Definition?"),
'innocent_report' => _("Are you sure you wish to report this message as innocent?"),
'moveconfirm' => _("Are you sure you want to move the message(s)? (Some message information might get lost, like message headers, text formatting or attachments!)"),
'newmbox' => _("You are copying/moving to a new mailbox.") . "\n" . _("Please enter a name for the new mailbox:") . "\n",
'no' => _("No"),
'selectone' => _("You must select at least one message first."),
'selectonlyone' => _("You must select only one message for this action."),
'spam_report' => _("Are you sure you wish to report this message as spam?"),
'submit' => _("You must select at least one message first."),
'target_mbox' => _("You must select a target mailbox first.")
),
'ImpMailbox.unread' => intval($unread)
));
$pagetitle = $this->title = $mailbox->label;
if ($mailbox->editvfolder) {
$query_text = wordwrap($imp_search[$mailbox]->querytext);
$pagetitle .= ' [' . Horde::linkTooltip('#', $query_text, '', '', '', $query_text) . _("Virtual Folder") . '</a>]';
$this->title .= ' [' . _("Virtual Folder") . ']';
} elseif ($mailbox->editquery) {
$query_text = wordwrap($imp_search[$mailbox]->querytext);
$pagetitle = Horde::linkTooltip('#', $query_text, '', '', '', $query_text) . $pagetitle . '</a>';
} else {
$pagetitle = $this->title = htmlspecialchars($this->title);
}
/* Generate mailbox summary string. */
$subinfo = new IMP_View_Subinfo(array('mailbox' => $mailbox));
$subinfo->value = $pagetitle . ' (';
if (empty($pageOb['end'])) {
$subinfo->value .= _("No Messages");
} else {
$subinfo->value .= ($pageOb['pagecount'] > 1)
? sprintf(_("%d Messages"), $pageOb['msgcount']) . ' / ' . sprintf(_("Page %d of %d"), $pageOb['page'], $pageOb['pagecount'])
: sprintf(_("%d Messages"), $pageOb['msgcount']);
}
$subinfo->value .= ')';
$injector->getInstance('Horde_View_Topbar')->subinfo = $subinfo->render();
$page_output->addScriptFile('hordecore.js', 'horde');
$page_output->addScriptFile('mailbox.js');
$page_output->addScriptPackage('Horde_Core_Script_Package_Dialog');
$page_output->metaRefresh($prefs->getValue('refresh_time'), $refresh_url);
/* Prepare the header template. */
$view = new Horde_View(array(
'templatePath' => IMP_TEMPLATES . '/basic/mailbox'
));
$view->addHelper('FormTag');
$view->addHelper('Horde_Core_View_Helper_Accesskey');
$view->addHelper('Tag');
$hdr_view = clone $view;
$hdr_view->readonly = $readonly;
$hdr_view->refresh_url = $refresh_url;
if (isset($filter_url)) {
$hdr_view->filter_url = $filter_url;
}
if ($mailbox->access_search) {
if (!$search_mbox) {
$hdr_view->search_url = $mailbox->url(IMP_Basic_Searchbasic::url());
} else {
if ($mailbox->editvfolder) {
$edit_search = _("Edit Virtual Folder");
} elseif ($mailbox->query) {
if ($mailbox->editquery) {
$edit_search = _("Edit Search Query");
} else {
/* Basic search results. */
$search_mailbox = IMP_Mailbox::get($imp_search[$mailbox]->mboxes[0]);
$hdr_view->search_url = $search_mailbox->url(IMP_Basic_Searchbasic::url());
$hdr_view->searchclose = $search_mailbox->url('mailbox');
}
}
if (isset($edit_search)) {
$hdr_view->edit_search_url = $imp_search->editUrl($mailbox);
$hdr_view->edit_search_title = $edit_search;
}
}
}
if ($mailbox->access_empty) {
$hdr_view->empty = $mailbox_imp_url->copy()->add(array(
'actionID' => 'empty_mailbox',
'token' => $token
));
}
$this->output = $hdr_view->render('header');
/* If no messages, exit immediately. */
if (empty($pageOb['end'])) {
if ($pageOb['anymsg'] && isset($deleted_prompt)) {
/* Show 'Show Deleted' prompt if mailbox has no viewable
* message but has hidden, deleted messages. */
$del_view = clone $view;
$del_view->hide = Horde::widget(array(
'url' => $refresh_url->copy()->add(array(
'actionID' => 'hide_deleted',
'token' => $token
)),
'class' => 'hideAction',
'title' => $deleted_prompt
));
if ($mailbox->access_expunge) {
$del_view->purge = Horde::widget(array(
'url' => $refresh_url->copy()->add(array(
'actionID' => 'expunge_mailbox',
'token' => $token
)),
'class' => 'purgeAction',
'title' => _("Pur_ge Deleted")
));
}
$this->output .= $del_view->render('actions_deleted');
}
$empty_view = clone $view;
$empty_view->search_mbox = $search_mbox;
$this->output .= $empty_view->render('empty_mailbox');
return;
}
$clink_ob = new IMP_Compose_Link();
$clink = $clink_ob->link();
/* Display the navbar and actions if there is at least 1 message in
* mailbox. */
if ($pageOb['msgcount']) {
/* Prepare the navbar template. */
$n_view = clone $view;
$n_view->id = 1;
$n_view->readonly = $readonly;
$filtermsg = false;
if ($mailbox->access_flags) {
$args = array(
'imap' => true,
'mailbox' => $search_mbox ? null : $mailbox
);
$form_set = $form_unset = array();
foreach ($imp_flags->getList($args) as $val) {
if ($val->canset) {
$form_set[] = array(
'f' => $val->form_set,
'l' => $val->label,
'v' => IMP_Mailbox::formTo(self::FLAG_FILTER_PREFIX . $val->form_set)
);
$form_unset[] = array(
'f' => $val->form_unset,
'l' => $val->label,
'v' => IMP_Mailbox::formTo(self::FLAG_FILTER_PREFIX . $val->form_unset)
);
}
}
$n_view->flaglist_set = $form_set;
$n_view->flaglist_unset = $form_unset;
if (!$search_mbox && $mailbox->access_search) {
$filtermsg = $n_view->flag_filter = true;
}
}
if (!$search_mbox && $mailbox->access_filters) {
$filters = array();
$iterator = IMP_Search_IteratorFilter::create(
IMP_Search_IteratorFilter::FILTER
);
foreach ($iterator as $val) {
$filters[] = array(
'l' => $val->label,
'v' => IMP_Mailbox::formTo($val)
);
}
if (!empty($filters)) {
$filtermsg = true;
$n_view->filters = $filters;
}
}
$n_view->filtermsg = $filtermsg;
if ($imp_imap->access(IMP_Imap::ACCESS_FOLDERS)) {
$n_view->move = Horde::widget(array(
'url' => '#',
'class' => 'moveAction',
'title' => _("Move"),
'nocheck' => true
));
$n_view->copy = Horde::widget(array(
'url' => '#',
'class' => 'copyAction',
'title' => _("Copy"),
'nocheck' => true
));
$n_view->folder_options = $folder_options;
}
$n_view->mailbox_url = $mailbox_url;
$n_view->mailbox = $mailbox->form_to;
if ($pageOb['pagecount'] > 1) {
$n_view->multiple_page = true;
$n_view->pages_first = $pages_first;
$n_view->url_first = $url_first;
$n_view->pages_prev = $pages_prev;
$n_view->url_prev = $url_prev;
$n_view->pages_next = $pages_next;
$n_view->url_next = $url_next;
$n_view->pages_last = $pages_last;
$n_view->url_last = $url_last;
$n_view->page_val = $pageOb['page'];
$n_view->page_size = Horde_String::length($pageOb['pagecount']);
}
$this->output .= $n_view->render('navbar');
/* Prepare the actions template. */
$a_view = clone $view;
if ($mailbox->access_deletemsgs) {
$del_class = ($use_trash && $mailbox->trash)
? 'permdeleteAction'
: 'deleteAction';
$a_view->delete = Horde::widget(array(
'url' => '#',
'class' => $del_class,
'title' => _("_Delete")
));
}
if ($showdelete['purge'] || $mailbox->vtrash) {
$a_view->undelete = Horde::widget(array(
'url' => '#',
'class' => 'undeleteAction',
'title' => _("_Undelete")
));
}
$mboxactions = array();
if ($showdelete['purge']) {
$mailbox_link = $mailbox_imp_url->copy()->add('mpage', $pageOb['page']);
if (isset($deleted_prompt)) {
$mboxactions[] = Horde::widget(array(
'url' => $mailbox_link->copy()->add(array(
'actionID' => 'hide_deleted',
'token' => $token
)),
'class' => 'hideAction',
'title' => $deleted_prompt
));
}
$mboxactions[] = Horde::widget(array(
'url' => $mailbox_link->copy()->add(array(
'actionID' => 'expunge_mailbox',
'token' => $token
)),
'class' => 'purgeAction',
'title' => _("Pur_ge Deleted")
));
}
if (!$sortpref->sortby_locked &&
($sortpref->sortby != Horde_Imap_Client::SORT_SEQUENCE)) {
$mboxactions[] = Horde::widget(array(
'url' => $mailbox_imp_url->copy()->add(array(
'sortby' => Horde_Imap_Client::SORT_SEQUENCE,
'actionID' => 'change_sort',
'token' => $token
)),
'title' => _("Clear Sort")
));
}
if ($mailbox->templates) {
$a_view->templateedit = Horde::widget(array(
'url' => '#',
'class' => 'templateeditAction',
'title' => _("Edit Template")
));
$mboxactions[] = Horde::widget(array(
'url' => $clink->copy()->add(array(
'actionID' => 'template_new'
)),
'title' => _("Create New Template")
));
}
$a_view->mboxactions = $mboxactions;
if ($registry->hasMethod('mail/blacklistFrom')) {
$a_view->blacklist = Horde::widget(array(
'url' => '#',
'class' => 'blacklistAction',
'title' => _("_Blacklist")
));
}
if ($registry->hasMethod('mail/whitelistFrom')) {
$a_view->whitelist = Horde::widget(array(
'url' => '#',
'class' => 'whitelistAction',
'title' => _("_Whitelist")
));
}
if (IMP_Compose::canCompose()) {
$a_view->forward = Horde::widget(array(
'url' => '#',
'class' => 'forwardAction',
'title' => _("Fo_rward")
));
$a_view->redirect = Horde::widget(array(
'url' => '#',
'class' => 'redirectAction',
'title' => _("Redirect")
));
}
if ($mailbox->spam_show) {
$a_view->spam = Horde::widget(array(
'url' => '#',
'class' => 'spamAction',
'title' => _("Report as Spam")
));
}
if ($mailbox->innocent_show) {
$a_view->innocent = Horde::widget(array(
'url' => '#',
'class' => 'innocentAction',
'title' => _("Report as Innocent")
));
}
$a_view->view_messages = Horde::widget(array(
'url' => '#',
'class' => 'viewAction',
'title' => _("View Messages")
));
$this->output .= $a_view->render('actions');
}
/* Define some variables now so we don't have to keep redefining in
* the foreach loop or the templates. */
$lastMbox = '';
$mh_count = 0;
$sortImg = $sortpref->sortdir
? 'sortup'
: 'sortdown';
$headers = array(
Horde_Imap_Client::SORT_TO => array(
'id' => 'mboxto',
'stext' => _("Sort by To Address"),
'text' => _("To")
),
Horde_Imap_Client::SORT_FROM => array(
'id' => 'mboxfrom',
'stext' => _("Sort by From Address"),
'text' => _("Fro_m")
),
Horde_Imap_Client::SORT_THREAD => array(
'id' => 'mboxthread',
'stext' => _("Sort by Thread"),
'text' => _("_Thread")
),
Horde_Imap_Client::SORT_SUBJECT => array(
'id' => 'mboxsubject',
'stext' => _("Sort by Subject"),
'text' => _("Sub_ject")
),
IMP::IMAP_SORT_DATE => array(
'id' => 'mboxdate',
'stext' => _("Sort by Date"),
'text' => _("Dat_e")
),
Horde_Imap_Client::SORT_SIZE => array(
'id' => 'mboxsize',
'stext' => _("Sort by Message Size"),
'text' => _("Si_ze")
)
);
/* If this is the Drafts or Sent-Mail mailbox, sort by To instead of
* From. */
if ($mailbox->special_outgoing) {
unset($headers[Horde_Imap_Client::SORT_FROM]);
} else {
unset($headers[Horde_Imap_Client::SORT_TO]);
}
/* Determine which of Subject/Thread to emphasize. */
if (!$mailbox->access_sortthread || $sortpref->sortby_locked) {
unset($headers[Horde_Imap_Client::SORT_THREAD]);
if ($sortpref->sortby_locked && $thread_sort) {
$sortpref->sortby = Horde_Imap_Client::SORT_SUBJECT;
}
} else {
if ($thread_sort) {
$extra = Horde_Imap_Client::SORT_SUBJECT;
$standard = Horde_Imap_Client::SORT_THREAD;
} else {
$extra = Horde_Imap_Client::SORT_THREAD;
$standard = Horde_Imap_Client::SORT_SUBJECT;
}
$headers[$standard]['altsort'] = Horde::widget(array(
'url' => $mailbox_imp_url->copy()->add(array(
'actionID' => 'change_sort',
'token' => $token,
'sortby' => $extra
)),
'title' => $headers[$extra]['text']
));
unset($headers[$extra]);
}
foreach ($headers as $key => $val) {
$ptr = &$headers[$key];
if ($sortpref->sortby == $key) {
$csl_icon = '<span class="iconImg ' . $sortImg . '"></span>';
if ($sortpref->sortdir_locked) {
$ptr['change_sort_link'] = $csl_icon;
$ptr['change_sort_widget'] = Horde::stripAccessKey($val['text']);
} else {
$tmp = $mailbox_imp_url->copy()->add(array(
'sortby' => $key,
'sortdir' => intval(!$sortpref->sortdir),
'actionID' => 'change_sort',
'token' => $token
));
$ptr['change_sort_link'] = Horde::link($tmp, $val['stext'], null, null, null, $val['stext']) . $csl_icon . '</a>';
$ptr['change_sort_widget'] = Horde::widget(array('url' => $tmp, 'title' => $val['text']));
}
} else {
$ptr['change_sort_link'] = null;
$ptr['change_sort_widget'] = $sortpref->sortby_locked
? Horde::stripAccessKey($val['text'])
: Horde::widget(array(
'url' => $mailbox_imp_url->copy()->add(array(
'actionID' => 'change_sort',
'token' => $token,
'sortby' => $key
)),
'title' => $val['text']
));
}
$ptr['class'] = 'horde-split-left';
}
/* Output the form start. */
$f_view = clone $view;
$f_view->mailbox = $mailbox->form_to;
$f_view->mailbox_url = $mailbox_url;
$f_view->page = $pageOb['page'];
$f_view->token = $token;
$this->output .= $f_view->render('form_start');
/* Prepare the message headers template. */
$mh_view = clone $view;
$mh_view->headers = $headers;
if (!$search_mbox) {
$mh_view->show_checkbox = !$mh_count++;
$this->output .= $mh_view->render('message_headers');
}
/* Initialize repetitively used variables. */
$fromlinkstyle = $prefs->getValue('from_link');
$imp_ui = new IMP_Mailbox_Ui($mailbox);
/* Display message information. */
$msgs = array();
$search_view = clone $view;
$summary_view = clone $view;
while (list(,$ob) = each($mbox_info['overview'])) {
if ($search_mbox) {
if (empty($lastMbox) || ($ob['mailbox'] != $lastMbox)) {
if (!empty($lastMbox)) {
$this->_outputSummaries($msgs, $summary_view);
$msgs = array();
}
$mbox = IMP_Mailbox::get($ob['mailbox']);
$search_view->mbox_link = Horde::link($mbox->url($mailbox_url), sprintf(_("View messages in %s"), $mbox->display), 'smallheader') . $mbox->display_html . '</a>';
$this->output .= $search_view->render('searchmbox');
$mh_view->show_checkbox = !$mh_count++;
$this->output .= $mh_view->render('message_headers');
}
}
$lastMbox = $ob['mailbox'];
/* Initialize the data fields. */
$msg = array(
'bg' => '',
'buid' => $imp_mailbox->getBuid($ob['mailbox'], $ob['uid']),
'class' => '',
'date' => $imp_ui->getDate($ob['envelope']->date),
'preview' => '',
'status' => '',
'size' => IMP::sizeFormat($ob['size'])
);
/* Generate the target link. */
if ($mailbox->drafts || $mailbox->templates) {
$clink_copy = clone $clink_ob;
$clink_copy->args['buid'] = $msg['buid'];
$clink_copy->args['mailbox'] = $mailbox;
$target = $clink_copy->link()->add(array(
'actionID' => ($mailbox->drafts ? 'draft' : 'template')
));
} else {
$target = $mailbox->url('message', $msg['buid']);
}
/* Get all the flag information. */
$flag_parse = $imp_flags->parse(array(
'flags' => $ob['flags'],
'headers' => $ob['headers'],
'runhook' => $ob,
'personal' => $ob['envelope']->to
));
$css_class = $subject_flags = array();
foreach ($flag_parse as $val) {
if ($val instanceof IMP_Flag_User) {
$subject_flags[] = $val;
} else {
if (!$val->bgdefault) {
$msg['bg'] = $val->bgcolor;
}
$css_class[] = $val->css;
$msg['status'] .= $val->span;
}
}
$msg['class'] = implode(' ', $css_class);
/* Show message preview? */
if ($show_preview && isset($ob['preview'])) {
if (empty($ob['preview'])) {
$ptext = '[[' . _("No Preview Text") . ']]';
} else {
$ptext = empty($strip_preview)
? str_replace("\r", '', $ob['preview'])
: preg_replace(array('/\n/', '/(\s)+/'), array(' ', '$1'), str_replace("\r", "\n", $ob['preview']));
if (!$preview_tooltip) {
$ptext = $injector->getInstance('Horde_Core_Factory_TextFilter')->filter($ptext, 'text2html', array(
'parselevel' => Horde_Text_Filter_Text2html::NOHTML
));
}
$maxlen = $prefs->getValue('preview_maxlen');
if (Horde_String::length($ptext) > $maxlen) {
$ptext = Horde_String::truncate($ptext, $maxlen);
} elseif (empty($ob['previewcut'])) {
$ptext .= '[[' . _("END") . ']]';
}
}
$msg['preview'] = $ptext;
}
/* Format the From: Header. */
$getfrom = $imp_ui->getFrom($ob['envelope']);
$msg['from'] = htmlspecialchars($getfrom['from'], ENT_QUOTES, 'UTF-8');
switch ($fromlinkstyle) {
case 0:
$from_tmp = array();
foreach ($getfrom['from_list']->base_addresses as $from_ob) {
$from_tmp[] = call_user_func_array(array('Horde', $preview_tooltip ? 'linkTooltip' : 'link'), array($clink->copy()->add(array('actionID' => 'mailto_link', 'to' => strval($from_ob))), sprintf(_("New Message to %s"), $from_ob->label))) . htmlspecialchars($from_ob->label, ENT_QUOTES, 'UTF-8') . '</a>';
}
if (!empty($from_tmp)) {
$msg['from'] = implode(', ', $from_tmp);
}
break;
default:
$from_uri = $mailbox->url('message', $msg['buid']);
$msg['from'] = Horde::link($from_uri) . $msg['from'] . '</a>';
break;
}
/* Format the Subject: Header. */
$msg['subject'] = $imp_ui->getSubject($ob['envelope']->subject, true);
$msg['subject'] = $preview_tooltip
? substr(Horde::linkTooltip($target, $msg['preview'], '', '', '', $msg['preview']), 0, -1) . ' class="mboxSubject">' . $msg['subject'] . '</a>'
: substr(Horde::link($target, $imp_ui->getSubject($ob['envelope']->subject)), 0, -1) . ' class="mboxSubject">' . $msg['subject'] . '</a>' . (!empty($msg['preview']) ? '<br /><small>' . $msg['preview'] . '</small>' : '');
/* Add subject flags. */
foreach ($subject_flags as $val) {
$flag_label = Horde_String::truncate($val->label, 12);
$msg['subject'] = '<span class="' . $val->css . '" style="' . ($val->bgdefault ? '' : 'background:' . htmlspecialchars($val->bgcolor) . ';') . 'color:' . htmlspecialchars($val->fgcolor) . '" title="' . htmlspecialchars($val->label) . '">' . htmlspecialchars($flag_label) . '</span>' . $msg['subject'];
}
/* Set up threading tree now. */
if ($thread_sort) {
$t_ob = $imp_mailbox->getThreadOb($ob['idx']);
$msg['subject'] = ($sortpref->sortdir ? $t_ob->reverse_img : $t_ob->img) . ' ' . $msg['subject'];
}
$msgs[$msg['buid']] = $msg;
}
$this->_outputSummaries($msgs, $summary_view);
$this->output .= '</form>';
/* If there are 20 messages or less, don't show the actions/navbar
* again. */
if (($pageOb['end'] - $pageOb['begin']) >= 20) {
$this->output .= $a_view->render('actions');
$n_view->id = 2;
$this->output .= $n_view->render('navbar');
}
}
/**
* @param array $opts Options:
* - mailbox: (string) The mailbox to link to.
*/
static public function url(array $opts = array())
{
$opts = array_merge(array('mailbox' => 'INBOX'), $opts);
return IMP_Mailbox::get($opts['mailbox'])->url('basic')->add('page', 'mailbox');
}
/**
*/
protected function _outputSummaries($msgs, Horde_View $view)
{
/* Allow user to alter template array. */
try {
$msgs = $GLOBALS['injector']->getInstance('Horde_Core_Hooks')->callHook(
'mailboxarray',
'imp',
array($msgs)
);
} catch (Horde_Exception_HookNotSet $e) {}
$view->messages = $msgs;
$this->output .= $view->render('mailbox');
}
}