X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fmailbox_display.php;h=1f86622e91bea0c121d0a37b211781d543448de4;hb=19d01c6b200dfd6317e4a933325d903ba2901726;hp=fd0e495507216082a4bb7a027133e21c8238600e;hpb=31841a9ece7cc2ae90bf52dd92db68142172a47b;p=squirrelmail.git diff --git a/functions/mailbox_display.php b/functions/mailbox_display.php index fd0e4955..1f86622e 100644 --- a/functions/mailbox_display.php +++ b/functions/mailbox_display.php @@ -19,6 +19,7 @@ require_once(SM_PATH . 'functions/html.php'); require_once(SM_PATH . 'class/html.class.php'); require_once(SM_PATH . 'functions/imap_mailbox.php'); require_once(SM_PATH . 'functions/imap_messages.php'); +require_once(SM_PATH . 'functions/imap_asearch.php'); require_once(SM_PATH . 'functions/mime.php'); require_once(SM_PATH . 'functions/forms.php'); @@ -27,6 +28,14 @@ require_once(SM_PATH . 'functions/forms.php'); */ define('PG_SEL_MAX', 10); +/** +* The number of pages to cache msg headers +*/ +define('SQM_MAX_PAGES_IN_CACHE',5); + +/** +* Sort constants used for sorting of messages +*/ define('SQSORT_NONE',0); define('SQSORT_DATE_ASC',1); define('SQSORT_DATE_DEC',2); @@ -42,6 +51,17 @@ define('SQSORT_CC_ASC',11); define('SQSORT_CC_DEC',12); define('SQSORT_INT_DATE_ASC',13); define('SQSORT_INT_DATE_DEC',14); + +define('SQSORT_THREAD',32); + + +define('MBX_PREF_SORT',0); +define('MBX_PREF_LIMIT',1); +define('MBX_PREF_AUTO_EXPUNGE',2); +define('MBX_PREF_INTERNALDATE',3); +define('SQM_MAX_MBX_IN_CACHE',3); +// define('MBX_PREF_FUTURE',unique integer key); + /** * @param mixed $start UNDOCUMENTED */ @@ -60,60 +80,65 @@ function elapsed($start) { } /** -* Displays message listing +* Displays message header row in messages list * -* @param mixed $t UNDOCUMENTED -* @param bool $not_last UNDOCUMENTED -* @param mixed $key UNDOCUMENTED -* @param string $mailbox mail folder -* @param mixed $start_msg UNDOCUMENTED -* @param mixed $where UNDOCUMENTED -* @param mixed $what UNDOCUMENTED +* @param array $aMsg contains all message related parameters +* @return void */ -function printMessageInfo($t, $last=false, $msg, $mailbox, - $start_msg, $where, $what) { +function printMessageInfo($aMsg) { + // FIX ME, remove these globals as well by adding an array as argument for the user settings + // specificly meant for header display global $checkall, - $color, $td_str, + $color, $default_use_priority, $message_highlight_list, $index_order, - $indent_array, /* indent subject by */ - $pos, /* Search postion (if any) */ - $thread_sort_messages, /* thread sorting on/off */ - $row_count, - $truncate_sender, /* number of characters for From/To field (<= 0 for unchanged) */ + $truncate_sender, /* number of characters for From/To field (<= 0 for unchanged) */ $email_address, - $show_recipient_instead, /* show recipient name instead of default identity */ - $use_icons, /* indicates to use icons or text markers */ - $icon_theme; /* icons theming */ + $show_recipient_instead, /* show recipient name instead of default identity */ + $use_icons, /* indicates to use icons or text markers */ + $icon_theme; /* icons theming */ $color_string = $color[4]; // initialisation: - $sSubject = (isset($msg['SUBJECT']) && $msg['SUBJECT'] != '') ? $msg['SUBJECT'] : _("(no subject)"); - $sFrom = (isset($msg['FROM'])) ? $msg['FROM'] : _("Unknown sender"); - $sTo = (isset($msg['TO'])) ? $msg['TO'] : _("Unknown recipient"); - $sCc = (isset($msg['CC'])) ? $msg['CC'] : ''; - $aFlags = (isset($msg['FLAGS'])) ? $msg['FLAGS'] : array(); - $iPrio = (isset($msg['PRIORITY'])) ? $msg['PRIORITY'] : 3; - $iSize = (isset($msg['SIZE'])) ? $msg['SIZE'] : 0; - $sType0 = (isset($msg['TYPE0'])) ? $msg['TYPE0'] : 'text'; - $sType1 = (isset($msg['TYPE1'])) ? $msg['TYPE1'] : 'plain'; - $sDate = (isset($msg['DATE'])) ? getDateString(getTimeStamp(explode(' ',$msg['DATE']))) : ''; - $iId = (isset($msg['ID'])) ? $msg['ID'] : false; - - sqgetGlobalVar('indent_array',$indent_array,SQ_SESSION); - if (!$iId) { - return; - } + $mailbox = $aMsg['MAILBOX']; + $msg = $aMsg['HEADER']; + $t = $aMsg['INDX']; + $start_msg = $aMsg['PAGEOFFSET']; + $last = $aMsg['LAST']; + if (isset($aMsg['SEARCH']) && count($aMsg['SEARCH']) >1 ) { + $where = $aMsg['SEARCH'][0]; + $what = $aMsg['SEARCH'][1]; + } else { + $where = false; + $what = false; + } + $iIndent = $aMsg['INDENT']; + + $sSubject = (isset($msg['SUBJECT']) && $msg['SUBJECT'] != '') ? $msg['SUBJECT'] : _("(no subject)"); + $sFrom = (isset($msg['FROM'])) ? $msg['FROM'] : _("Unknown sender"); + $sTo = (isset($msg['TO'])) ? $msg['TO'] : _("Unknown recipient"); + $sCc = (isset($msg['CC'])) ? $msg['CC'] : ''; + $aFlags = (isset($msg['FLAGS'])) ? $msg['FLAGS'] : array(); + $iPrio = (isset($msg['PRIORITY'])) ? $msg['PRIORITY'] : 3; + $iSize = (isset($msg['SIZE'])) ? $msg['SIZE'] : 0; + $sType0 = (isset($msg['TYPE0'])) ? $msg['TYPE0'] : 'text'; + $sType1 = (isset($msg['TYPE1'])) ? $msg['TYPE1'] : 'plain'; + if (isset($msg['INTERNALDATE'])) { + $sDate = getDateString(getTimeStamp(explode(' ',$msg['INTERNALDATE']))); + } else { + $sDate = (isset($msg['DATE'])) ? getDateString(getTimeStamp(explode(' ',$msg['DATE']))) : ''; + } + $iId = (isset($msg['UID'])) ? $msg['UID'] : false; + + if (!$iId) { + return; + } if ($GLOBALS['alt_index_colors']) { - if (!isset($row_count)) { - $row_count = 0; - } - $row_count++; - if ($row_count % 2) { + if (!($t % 2)) { if (!isset($color[12])) { $color[12] = '#EAEAEA'; } @@ -123,6 +148,10 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, $urlMailbox = urlencode($mailbox); + // FIXME, foldertype should be set in right_main.php + // in other words, handle as sent is obsoleted from now. + // We replace that by providing an array to aMailbox with the to shown headers + // that way we are free to show the user different layouts for different folders $bSentFolder = handleAsSent($mailbox); if ((!$bSentFolder) && ($show_recipient_instead)) { // If the From address is the same as $email_address, then handle as Sent @@ -132,9 +161,9 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, $email_address = getPref($datadir, $username, 'email_address'); } $bHandleAsSent = ((isset($from_array[0][0])) && ($from_array[0][0] == $email_address)); - } - else + } else { $bHandleAsSent = $bSentFolder; + } // If this is a Sent message, display To address instead of From if ($bHandleAsSent) { $sFrom = $sTo; @@ -172,38 +201,47 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, $senderAddress = _("To:") . ' ' . $senderAddress; } - if ($truncate_sender > 0) - $senderName = truncateWithEntities($senderName, $truncate_sender); - - echo html_tag( 'tr','','','','VALIGN="top"') . "\n"; - - if (isset($aFlags['\\flagged']) && ($aFlags['\\flagged'] == true)) { - $flag = ""; - $flag_end = ''; - } else { - $flag = ''; - $flag_end = ''; + // this is a column property which can apply to multiple columns. Do not use vars for one column + // only. instead we should use something like this: + // 1ed column $aMailbox['columns']['SUBJECT'] value: aray with properties ... + // 2ed column $aMailbox['columns']['FROM'] value: aray with properties ... + // NB in case of the sentfolder this could be the TO field + // properties array example: + // 'truncate' => length (0 is no truncate) + // 'prefix => if (x in b then do that ) + if ($truncate_sender > 0) { + $senderName = truncateWithEntities($senderName, $truncate_sender); } - if (!isset($aFlags['\\seen']) || ($aFlags['\\seen'] == false)) { - $bold = ''; - $bold_end = ''; - } else { - $bold = ''; - $bold_end = ''; + + $flag = $flag_end = $bold = $bold_end = $fontstr = $fontstr_end = $italic = $italic_end = ''; + $bold = ''; + $bold_end = ''; + + foreach ($aFlags as $sFlag => $value) { + switch ($sFlag) { + case '\\flagged': + if ($value) { + $flag = ""; + $flag_end = ''; + } + break; + case '\\seen': + if ($value) { + $bold = ''; + $bold_end = ''; + } + break; + case '\\deleted': + if ($value) { + $fontstr = ""; + $fontstr_end = ''; + } + break; + } } if ($bHandleAsSent) { $italic = ''; $italic_end = ''; - } else { - $italic = ''; - $italic_end = ''; - } - if (isset($aFlags['\\deleted']) && $aFlags['\\deleted']) { - $fontstr = ""; - $fontstr_end = ''; - } else { - $fontstr = ''; - $fontstr_end = ''; } if ($where && $what) { @@ -211,7 +249,9 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, } else { $searchstr = ''; } - + /* + * Message highlight code + */ $matches = array('TO' => 'sTo', 'CC' => 'sCc', 'FROM' => 'sFrom', 'SUBJECT' => 'sSubject'); if (is_array($message_highlight_list) && count($message_highlight_list)) { $sTo = parseAddress($sTo); @@ -251,18 +291,17 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, } } } - } + } /* end Message highlight code */ if (!isset($hlt_color)) { $hlt_color = $color_string; } $col = 0; $sSubject = str_replace(' ', ' ', decodeHeader($sSubject)); - if (isset($indent_array[$iId])) { - $subject = processSubject($sSubject, $indent_array[$iId]); - } else { - $subject = processSubject($sSubject, 0); - } + $subject = processSubject($sSubject, $iIndent); + + echo html_tag( 'tr','','','','VALIGN="top"') . "\n"; + if (sizeof($index_order)) { foreach ($index_order as $index_order_part) { switch ($index_order_part) { @@ -276,9 +315,9 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, if ($senderAddress != $senderName) { $senderAddress = strtr($senderAddress, array_flip(get_html_translation_table(HTML_SPECIALCHARS))); $title = ' title="' . str_replace('"', "''", $senderAddress) . '"'; - } - else + } else { $title = ''; + } echo html_tag( 'td', $italic . $bold . $flag . $fontstr . $senderName . $fontstr_end . $flag_end . $bold_end . $italic_end, @@ -298,13 +337,11 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, break; case 4: /* subject */ $td_str = $bold; - if ($thread_sort_messages == 1) { - if (isset($indent_array[$iId])) { - $td_str .= str_repeat("    ",$indent_array[$iId]); - } + if ($iIndent) { + $td_str .= str_repeat("    ",$iIndent); } $td_str .= ''."\n"; } else { @@ -428,13 +465,256 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, } } + +function setUserPref($username, $pref, $value) { + global $data_dir; + setPref($data_dir,$username,$pref,$value); +} + /** -* Does the $sort $_GET var to field mapping + * Selects a mailbox for header retrieval. + * Cache control for message headers is embedded. + * + * @param resource $imapConnection imap socket handle + * @param string $mailbox mailbox to select and retrieve message headers from + * @param array $aConfig array with system config settings and incoming vars + * @param array $aProps mailbox specific properties + * @return array $aMailbox mailbox array with all relevant information + * @author Marc Groot Koerkamp + */ +function sqm_api_mailbox_select($imapConnection,$mailbox,$aConfig,$aProps) { + /** + * NB: retrieve this from the session before accessing this function + * and make sure you write it back at the end of the script after + * the aMailbox var is added so that the headers are added to the cache + */ + global $mailbox_cache; + /** + * In case the properties arrays are empty set the defaults. + */ + $aDefaultMbxPref = array (); +// MBX_PREF_SORT => 0, +// MBX_PREF_LIMIT => 15, +// MBX_PREF_AUTO_EXPUNGE => 0, +// MBX_PREF_INTERNALDATE => 0 +// ); + /* array_merge doesn't work with integers as keys */ +// foreach ($aDefaultMbxPref as $key => $value) { +// if (!isset($aProps[$key])) { +// $aProps[$key] = $value; +// } +// } + $aDefaultConfigProps = array( +// 'allow_thread_sort' => 0, + 'allow_server_sort' => sqimap_capability($imapConnection,'SORT'), +// 'charset' => 'US-ASCII', + 'user' => false, /* no pref storage if false */ + 'setindex' => 0, +// 'search' => 'ALL', + 'max_cache_size' => SQM_MAX_MBX_IN_CACHE + ); + + $aConfig = array_merge($aDefaultConfigProps,$aConfig); + $iSetIndx = $aConfig['setindex']; + + $aMbxResponse = sqimap_mailbox_select($imapConnection, $mailbox); + + if ($mailbox_cache) { + if (isset($mailbox_cache[$mailbox])) { + $aCachedMailbox = $mailbox_cache[$mailbox]; + } else { + $aCachedMailbox = false; + } + /* cleanup cache */ + if (count($mailbox_cache) > $aConfig['max_cache_size'] -1) { + $aTime = array(); + foreach($mailbox_cache as $cachedmailbox => $aVal) { + $aTime[$aVal['TIMESTAMP']] = $cachedmailbox; + } + if (ksort($aTime,SORT_NUMERIC)) { + for ($i=0,$iCnt=count($mailbox_cache);$i<($iCnt-$aConfig['max_cache_size']);++$i) { + $sOldestMbx = array_shift($aTime); + /** + * Remove only the UIDSET and MSG_HEADERS from cache because those can + * contain large amounts of data. + */ + if (isset($mailbox_cache[$sOldestMbx]['UIDSET'])) { + $mailbox_cache[$sOldestMbx]['UIDSET']= false; + } + if (isset($mailbox_cache[$sOldestMbx]['MSG_HEADERS'])) { + $mailbox_cache[$sOldestMbx]['MSG_HEADERS'] = false; + } + } + } + } + + } else { + $aCachedMailbox = false; + } + + /** + * Deal with imap servers that do not return the required UIDNEXT or + * UIDVALIDITY response + * from a SELECT call (since rfc 3501 it's required). + */ + if (!isset($aMbxResponse['UIDNEXT']) || !isset($aMbxResponse['UIDVALIDITY'])) { + $aStatus = sqimap_status_messages($imapConnection,$mailbox, + array('UIDNEXT','UIDVALIDITY')); + $aMbxResponse['UIDNEXT'] = $aStatus['UIDNEXT']; + $aMbxResponse['UIDVALIDTY'] = $aStatus['UIDVALIDITY']; + } + + $aMailbox['UIDSET'][$iSetIndx] = false; + $aMailbox['ID'] = false; + $aMailbox['SETINDEX'] = $iSetIndx; + + if ($aCachedMailbox) { + /** + * Validate integrity of cached data + */ + if ($aCachedMailbox['EXISTS'] == $aMbxResponse['EXISTS'] && + $aMbxResponse['EXISTS'] && + $aCachedMailbox['UIDVALIDITY'] == $aMbxResponse['UIDVALIDITY'] && + $aCachedMailbox['UIDNEXT'] == $aMbxResponse['UIDNEXT'] && + isset($aCachedMailbox['SEARCH'][$iSetIndx]) && + (!isset($aConfig['search']) || /* always set search from the searchpage */ + $aCachedMailbox['SEARCH'][$iSetIndx] == $aConfig['search'])) { + if (isset($aCachedMailbox['MSG_HEADERS'])) { + $aMailbox['MSG_HEADERS'] = $aCachedMailbox['MSG_HEADERS']; + } + $aMailbox['ID'] = $aCachedMailbox['ID']; + if (isset($aCachedMailbox['UIDSET'][$iSetIndx]) && $aCachedMailbox['UIDSET'][$iSetIndx]) { + if (isset($aProps[MBX_PREF_SORT]) && $aProps[MBX_PREF_SORT] != $aCachedMailbox['SORT'] ) { + $newsort = $aProps[MBX_PREF_SORT]; + $oldsort = $aCachedMailbox['SORT']; + /** + * If it concerns a reverse sort we do not need to invalidate + * the cached sorted UIDSET, a reverse is sufficient. + */ + if ((($newsort % 2) && ($newsort + 1 == $oldsort)) || + (!($newsort % 2) && ($newsort - 1 == $oldsort))) { + $aMailbox['UIDSET'][$iSetIndx] = array_reverse($aCachedMailbox['UIDSET'][$iSetIndx]); + } else { + $server_sort_array = false; + $aMailbox['MSG_HEADERS'] = false; + $aMailbox['ID'] = false; + } + // store the new sort value in the mailbox pref + if ($aConfig['user']) { + // FIXME, in ideal situation, we write back the + // prefs at the end of the script + setUserPref($aConfig['user'],"pref_$mailbox",serialize($aProps)); + } + } else { + $aMailbox['UIDSET'][$iSetIndx] = $aCachedMailbox['UIDSET'][$iSetIndx]; + } + } + } + } + /** + * Restore the offset in the paginator if no new offset is provided. + */ + if (isset($aMailbox['UIDSET'][$iSetIndx]) && !isset($aConfig['offset']) && $aCachedMailbox['OFFSET']) { + $aMailbox['OFFSET'] = $aCachedMailbox['OFFSET']; + $aMailbox['PAGEOFFSET'] = $aCachedMailbox['PAGEOFFSET']; + } else { + $aMailbox['OFFSET'] = (isset($aConfig['offset']) && $aConfig['offset']) ? $aConfig['offset'] -1 : 0; + $aMailbox['PAGEOFFSET'] = (isset($aConfig['offset']) && $aConfig['offset']) ? $aConfig['offset'] : 1; + } + + /** + * Restore the showall value no new showall value is provided. + */ + if (isset($aMailbox['UIDSET'][$iSetIndx]) && !isset($aConfig['showall']) && + isset($aCachedMailbox['SHOWALL'][$iSetIndx]) && $aCachedMailbox['SHOWALL'][$iSetIndx]) { + $aMailbox['SHOWALL'][$iSetIndx] = $aCachedMailbox['SHOWALL'][$iSetIndx]; + } else { + $aMailbox['SHOWALL'][$iSetIndx] = (isset($aConfig['showall']) && $aConfig['showall']) ? 1 : 0; + } + + if (!isset($aProps[MBX_PREF_SORT]) && isset($aCachedMailbox['SORT'])) { + $aMailbox['SORT'] = $aCachedMailbox['SORT']; + } else { + $aMailbox['SORT'] = (isset($aProps[MBX_PREF_SORT])) ? $aProps[MBX_PREF_SORT] : 0; + } + + if (!isset($aProps[MBX_PREF_LIMIT]) && isset($aCachedMailbox['LIMIT'])) { + $aMailbox['LIMIT'] = $aCachedMailbox['LIMIT']; + } else { + $aMailbox['LIMIT'] = (isset($aProps[MBX_PREF_LIMIT])) ? $aProps[MBX_PREF_LIMIT] : 15; + } + + if (!isset($aProps[MBX_PREF_INTERNALDATE]) && isset($aCachedMailbox['INTERNALDATE'])) { + $aMailbox['INTERNALDATE'] = $aCachedMailbox['INTERNALDATE']; + } else { + $aMailbox['INTERNALDATE'] = (isset($aProps[MBX_PREF_INTERNALDATE])) ? $aProps[MBX_PREF_INTERNALDATE] : false; + } + + if (!isset($aProps[MBX_PREF_AUTO_EXPUNGE]) && isset($aCachedMailbox['AUTO_EXPUNGE'])) { + $aMailbox['AUTO_EXPUNGE'] = $aCachedMailbox['AUTO_EXPUNGE']; + } else { + $aMailbox['AUTO_EXPUNGE'] = (isset($aProps[MBX_PREF_AUTO_EXPUNGE])) ? $aProps[MBX_PREF_AUTO_EXPUNGE] : false; + } + + if (!isset($aConfig['allow_thread_sort']) && isset($aCachedMailbox['ALLOW_THREAD'])) { + $aMailbox['ALLOW_THREAD'] = $aCachedMailbox['ALLOW_THREAD']; + } else { + $aMailbox['ALLOW_THREAD'] = (isset($aConfig['allow_thread_sort'])) ? $aConfig['allow_thread_sort'] : false; + } + + if (!isset($aConfig['search']) && isset($aCachedMailbox['SEARCH'][$iSetIndx])) { + $aMailbox['SEARCH'][$iSetIndx] = $aCachedMailbox['SEARCH'][$iSetIndx]; + } else { + $aMailbox['SEARCH'][$iSetIndx] = (isset($aConfig['search'])) ? $aConfig['search'] : 'ALL'; + } + + if (!isset($aConfig['charset']) && isset($aCachedMailbox['CHARSET'][$iSetIndx])) { + $aMailbox['CHARSET'][$iSetIndx] = $aCachedMailbox['CHARSET'][$iSetIndx]; + } else { + $aMailbox['CHARSET'][$iSetIndx] = (isset($aConfig['charset'])) ? $aConfig['charset'] : 'US-ASCII'; + } + + $aMailbox['NAME'] = $mailbox; + $aMailbox['EXISTS'] = $aMbxResponse['EXISTS']; + $aMailbox['SEEN'] = (isset($aMbxResponse['SEEN'])) ? $aMbxResponse['SEEN'] : $aMbxResponse['EXISTS']; + $aMailbox['RECENT'] = (isset($aMbxResponse['RECENT'])) ? $aMbxResponse['RECENT'] : 0; + $aMailbox['UIDVALIDITY'] = $aMbxResponse['UIDVALIDITY']; + $aMailbox['UIDNEXT'] = $aMbxResponse['UIDNEXT']; + $aMailbox['PERMANENTFLAGS'] = $aMbxResponse['PERMANENTFLAGS']; + $aMailbox['RIGHTS'] = $aMbxResponse['RIGHTS']; + + + + /* decide if we are thread sorting or not */ + if (!$aMailbox['ALLOW_THREAD']) { + if ($aMailbox['SORT'] & SQSORT_THREAD) { + $aMailbox['SORT'] -= SQSORT_THREAD; + } + } + if ($aMailbox['SORT'] & SQSORT_THREAD) { + $aMailbox['SORT_METHOD'] = 'THREAD'; + $aMailbox['THREAD_INDENT'] = $aCachedMailbox['THREAD_INDENT']; + } else if (isset($aConfig['allow_server_sort']) && $aConfig['allow_server_sort']) { + $aMailbox['SORT_METHOD'] = 'SERVER'; + $aMailbox['THREAD_INDENT'] = false; + } else { + $aMailbox['SORT_METHOD'] = 'SQUIRREL'; + $aMailbox['THREAD_INDENT'] = false; + } + + /* set a timestamp for cachecontrol */ + $aMailbox['TIMESTAMP'] = time(); + return $aMailbox; +} + + + +/** +* Does the $srt $_GET var to field mapping * -* @param int $sort Field to sort on +* @param int $srt Field to sort on * @param bool $bServerSort Server sorting is true -* @param mixed $key UNDOCUMENTED -* @return string $sSortField Field tosort on +* @return string $sSortField Field to sort on */ function getSortField($sort,$bServerSort) { switch($sort) { @@ -469,155 +749,288 @@ function getSortField($sort,$bServerSort) { case SQSORT_INT_DATE_DEC: $sSortField = ($bServerSort) ? 'ARRIVAL' : 'INTERNALDATE'; break; - default: $sSortField = 'DATE'; + case SQSORT_THREAD: break; + default: $sSortField = 'UID'; + break; + } return $sSortField; } -function get_sorted_msgs_list($imapConnection,$sort,$mode,&$error) { - $bDirection = ($sort % 2); +function get_sorted_msgs_list($imapConnection,&$aMailbox,&$error) { + $iSetIndx = (isset($aMailbox['SETINDEX'])) ? $aMailbox['SETINDEX'] : 0; + $bDirection = ($aMailbox['SORT'] % 2); $error = false; - switch ($mode) { - case 'thread': - $id = get_thread_sort($imapConnection); - if ($id === false) { + if (!$aMailbox['SEARCH'][$iSetIndx]) { + $aMailbox['SEARCH'][$iSetIndx] = 'ALL'; + } + switch ($aMailbox['SORT_METHOD']) { + case 'THREAD': + $aRes = get_thread_sort($imapConnection,$aMailbox['SEARCH'][$iSetIndx]); + if ($aRes === false) { $error = '
' . - _("Thread sorting is not supported by your IMAP server.") . '
' . - _("Please report this to the system administrator."). - '
'; + _("Thread sorting is not supported by your IMAP server.") . '
' . + _("Please report this to the system administrator.") . + ''; + $aMailbox['SORT'] -= SQSORT_THREAD; + } else { + $aMailbox['UIDSET'][$iSetIndx] = $aRes[0]; + $aMailbox['THREAD_INDENT'][$iSetIndx] = $aRes[1]; } break; - case 'server_sort': - $sSortField = getSortField($sort,true); - $id = sqimap_get_sort_order($imapConnection, $sSortField, $bDirection); + case 'SERVER': + $sSortField = getSortField($aMailbox['SORT'],true); + $id = sqimap_get_sort_order($imapConnection, $sSortField, $bDirection, $aMailbox['SEARCH'][$iSetIndx]); if ($id === false) { $error = '
' . - _( "Server-side sorting is not supported by your IMAP server.") . '
' . - _("Please report this to the system administrator."). + _("Server-side sorting is not supported by your IMAP server.") . '
' . + _("Please report this to the system administrator.") . '
'; + } else { + $aMailbox['UIDSET'][$iSetIndx] = $id; } break; default: - $sSortField = getSortField($sort,false); - $id = get_squirrel_sort($imapConnection, $sSortField, $bDirection); + $id = NULL; + if ($aMailbox['SEARCH'][$iSetIndx] != 'ALL') { + $id = sqimap_run_search($imapConnection, $aMailbox['SEARCH'][$iSetIndx], $aMailbox['CHARSET'][$iSetIndx]); + } + $sSortField = getSortField($aMailbox['SORT'],false); + $aMailbox['UIDSET'][$iSetIndx] = get_squirrel_sort($imapConnection, $sSortField, $bDirection, $id); break; } - return $id; + return $error; } -/** -* This function loops through a group of messages in the mailbox -* and shows them to the user. -* -* @param mixed $imapConnection -* @param string $mailbox mail folder -* @param mixed $num_msgs -* @param mixed $start_msg -* @param mixed $sort -* @param mixed $color -* @param mixed $show_num -* @param mixed $use_cache -* @param mixed $mode -*/ -function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, - $start_msg, $sort, $color, $show_num, - $use_cache, $mode='',$mbxresponse) { - global $msgs, $msort, $auto_expunge, $thread_sort_messages,$server_sort_array, - $allow_server_sort, $server_sort_order; - /* if there's no messages in this folder */ - if ($mbxresponse['EXISTS'] == 0) { - $string = '' . _("THIS FOLDER IS EMPTY") . ''; - echo ' '; - echo ' '; - echo '
'; - echo ' '; - echo ' '; - echo '

'; - echo ' '; - echo ' ' . html_tag( 'td', $string."\n", 'left') - . ''; - echo '
'; - echo '
'; - return; + + + +function fetchMessageHeaders($imapConnection, &$aMailbox) { + + /** + * Retrieve the UIDSET. + * Setindex is used to be able to store multiple uid sets. That will make it + * possible to display the mailbox multiple times in different sort order + * or to store serach results separate from normal mailbox view. + */ + $iSetIndx = (isset($aMailbox['SETINDEX'])) ? $aMailbox['SETINDEX'] : 0; + + $iLimit = ($aMailbox['SHOWALL'][$iSetIndx]) ? $aMailbox['EXISTS'] : $aMailbox['LIMIT']; + /** + * Adjust the start_msg + */ + $start_msg = $aMailbox['PAGEOFFSET']; + if($aMailbox['PAGEOFFSET'] > $aMailbox['EXISTS']) { + $start_msg -= $aMailbox['LIMIT']; + if($start_msg < 1) { + $start_msg = 1; + } } - if ($mbxresponse['EXISTS'] > 0) { - /* if $start_msg is lower than $num_msgs, we probably deleted all messages - * in the last page. We need to re-adjust the start_msg - */ - if($start_msg > $num_msgs) { - $start_msg -= $show_num; - if($start_msg < 1) { - $start_msg = 1; + if (is_array($aMailbox['UIDSET'])) { + $aUid =& $aMailbox['UIDSET'][$iSetIndx]; + } else { + $aUid = false; + } + + // initialize the fields we want to retrieve: + $aHeaderFields = array('Date', 'To', 'Cc', 'From', 'Subject', 'X-Priority', 'Content-Type'); + $aFetchItems = array('FLAGS', 'RFC822.SIZE'); + + // Are we sorting on internaldate then retrieve the internaldate value as well + if ($aMailbox['INTERNALDATE']) { + $aFetchItems[] = 'INTERNALDATE'; + } + + + /** + * A uidset with sorted uid's is available. We can use the cache + */ + if (($aMailbox['SORT'] != SQSORT_NONE || $aMailbox['SEARCH'][$iSetIndx] != 'ALL') && + isset($aUid) && $aUid ) { + + // limit the cache to SQM_MAX_PAGES_IN_CACHE + if (!$aMailbox['SHOWALL'][$iSetIndx]) { + $iMaxMsgs = $iLimit * SQM_MAX_PAGES_IN_CACHE; + $iCacheSize = count($aMailbox['MSG_HEADERS']); + if ($iCacheSize > $iMaxMsgs) { + $iReduce = $iCacheSize - $iMaxMsgs; + foreach ($aMailbox['MSG_HEADERS'] as $iUid => $value) { + if ($iReduce) { + unset($aMailbox['MSG_HEADERS'][$iUid]); + } else { + break; + } + --$iReduce; + } } } - /* This code and the next if() block check for - * server-side sorting methods. The $id array is - * formatted and $sort is set to 6 to disable - * SM internal sorting - */ - - if ($thread_sort_messages == 1) { - $mode = 'thread'; - } else if ($allow_server_sort == 1) { - $mode = 'server_sort'; - } else { - $mode = ''; + $id_slice = array_slice($aUid,$start_msg-1,$iLimit); + /* do some funky cache checks */ + $aUidCached = array_keys($aMailbox['MSG_HEADERS']); + $aUidNotCached = array_values(array_diff($id_slice,$aUidCached)); + /** + * $aUidNotCached contains an array with UID's which need to be fetched to + * complete the needed message headers. + */ + if (count($aUidNotCached)) { + $aMsgs = sqimap_get_small_header_list($imapConnection,$aUidNotCached, + $aHeaderFields,$aFetchItems); + // append the msgs to the existend headers + $aMailbox['MSG_HEADERS'] += $aMsgs; } - if (isset($mbxresponse['SORT_ARRAY']) && is_array($mbxresponse['SORT_ARRAY'])) { - $id = $mbxresponse['SORT_ARRAY']; - if (sqsession_is_registered('msgs')) { - sqsession_unregister('msgs'); - } - $id_slice = array_slice($id,$start_msg-1, $show_num); - if (count($id_slice)) { - $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$show_num); + } else { + /** + * Initialize the sorted UID list and fetch the visible message headers + */ + if ($aMailbox['SORT'] != SQSORT_NONE || $aMailbox['SEARCH'][$iSetIndx] != 'ALL') {// || $aMailbox['SORT_METHOD'] & SQSORT_THREAD 'THREAD') { + + $error = false; + if ($aMailbox['SEARCH'][$iSetIndx] && $aMailbox['SORT'] == 0) { + $aUid = sqimap_run_search($imapConnection, $aMailbox['SEARCH'][$iSetIndx], $aMailbox['CHARSET'][$iSetIndx]); } else { - return false; - } - sqsession_register($msgs, 'msgs'); - } else { - if (sqsession_is_registered('server_sort_array')) { - sqsession_unregister('server_sort_array'); + $error = get_sorted_msgs_list($imapConnection,$aMailbox,$error); + $aUid = $aMailbox['UIDSET'][$iSetIndx]; } - $id = get_sorted_msgs_list($imapConnection,$sort,$mode,$error); - if ($id !== false) { - sqsession_register($id, 'server_sort_array'); - $id_slice = array_slice($id,$start_msg-1, $show_num); + if ($error === false) { + $id_slice = array_slice($aUid,$aMailbox['OFFSET'], $iLimit); if (count($id_slice)) { - $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$show_num); + $aMailbox['MSG_HEADERS'] = sqimap_get_small_header_list($imapConnection,$id_slice, + $aHeaderFields,$aFetchItems); } else { return false; } - sqsession_register($msgs, 'msgs'); + } else { - echo $error; - return false; + // FIX ME, format message and fallback to squirrel sort + if ($error) { + echo $error; + } + } + } else { + // limit the cache to SQM_MAX_PAGES_IN_CACHE + if (!$aMailbox['SHOWALL'][$iSetIndx] && isset($aMailbox['MSG_HEADERS']) && is_array($aMailbox['MSG_HEADERS'])) { + $iMaxMsgs = $iLimit * SQM_MAX_PAGES_IN_CACHE; + $iCacheSize = count($aMailbox['MSG_HEADERS']); + if ($iCacheSize > $iMaxMsgs) { + $iReduce = $iCacheSize - $iMaxMsgs; + foreach ($aMailbox['MSG_HEADERS'] as $iUid => $value) { + if ($iReduce) { + $iId = $aMailbox['MSG_HEADERS'][$iUid]['ID']; + unset($aMailbox['MSG_HEADERS'][$iUid]); + unset($aMailbox['ID'][$iId]); + } else { + break; + } + --$iReduce; + } + } + } + + /** + * retrieve messages by sequence id's and fetch the UID to retrieve + * the UID. for sorted lists this is not needed because a UID FETCH + * automaticly add the UID value in fetch results + **/ + $aFetchItems[] = 'UID'; + + //create id range + $iRangeStart = $aMailbox['EXISTS'] - $aMailbox['OFFSET']; + $iRangeEnd = ($iRangeStart > $iLimit) ? + ($iRangeStart - $iLimit+1):1; + + $id_slice = range($iRangeStart, $iRangeEnd); + /** + * Non sorted mailbox with cached message headers + */ + if (isset($aMailbox['ID']) && is_array($aMailbox['ID'])) { + // the fetched id => uid relation + $aId = $aMailbox['ID']; + $aIdCached = array(); + foreach ($aId as $iId => $iUid) { + if (isset($aMailbox['MSG_HEADERS'][$iUid])) { + if ($iId <= $iRangeStart && $iId >= $iRangeEnd) { + $aIdCached[] = $iId; + } + } + } + $aIdNotCached = array_diff($id_slice,$aIdCached); + } else { + $aIdNotCached = $id_slice; + } + + if (count($aIdNotCached)) { + $aMsgs = sqimap_get_small_header_list($imapConnection,$aIdNotCached, + $aHeaderFields,$aFetchItems); + // append the msgs to the existend headers + if (isset($aMailbox['MSG_HEADERS']) && is_array($aMailbox['MSG_HEADERS'])) { + $aMailbox['MSG_HEADERS'] += $aMsgs; + } else { + $aMailbox['MSG_HEADERS'] = $aMsgs; + } + // update the ID array + foreach ($aMsgs as $iUid => $aMsg) { + if (isset($aMsg['ID'])) { + $aMailbox['ID'][$aMsg['ID']] = $iUid; + } + } } + /** + * In unsorted state we show newest messages first which means + * that the UIDSET which represents the order of the messages + * should contain a high to low ordered UID list + */ + $aSortedUidList = array(); + foreach ($id_slice as $iId) { + if (isset($aMailbox['ID'][$iId])) { + $aSortedUidList[] = $aMailbox['ID'][$iId]; + } + } + $aMailbox['UIDSET'][$iSetIndx] = $aSortedUidList; + $aMailbox['OFFSET'] = 0; } - } /* if exists > 0 */ + } + return true; +} + +/** +* This function loops through a group of messages in the mailbox +* and shows them to the user. +* +* @param mixed $imapConnection +* @param array $aMailbox associative array with mailbox related vars +*/ +function showMessagesForMailbox($imapConnection, &$aMailbox) { + global $color; - $res = getEndMessage($start_msg, $show_num, $num_msgs); - $start_msg = $res[0]; - $end_msg = $res[1]; + // to retrieve the internaldate pref: (I know this is not the right place to do that, move up in front + // and use a properties array as function argument to provide user preferences + global $data_dir, $username; - $paginator_str = get_paginator_str($mailbox, $start_msg, $end_msg, - $num_msgs, $show_num, $sort); + if (!fetchMessageHeaders($imapConnection, $aMailbox)) { + return false; + } + $iSetIndx = $aMailbox['SETINDEX']; + $iLimit = ($aMailbox['SHOWALL'][$iSetIndx]) ? $aMailbox['EXISTS'] : $aMailbox['LIMIT']; + $iEnd = ($aMailbox['PAGEOFFSET'] + ($iLimit - 1) < $aMailbox['EXISTS']) ? + $aMailbox['PAGEOFFSET'] + $iLimit - 1 : $aMailbox['EXISTS']; - $msg_cnt_str = get_msgcnt_str($start_msg, $end_msg, $num_msgs); + $paginator_str = get_paginator_str($aMailbox['NAME'], $aMailbox['PAGEOFFSET'], + $aMailbox['EXISTS'], $aMailbox['LIMIT'], $aMailbox['SHOWALL'][$iSetIndx]); + + $msg_cnt_str = get_msgcnt_str($aMailbox['PAGEOFFSET'], $iEnd,$aMailbox['EXISTS']); do_hook('mailbox_index_before'); ?> @@ -630,9 +1043,8 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, @@ -641,56 +1053,68 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
- +
$aHeaders[$aId[$i]], + 'INDX' => $t, + 'OFFSET' => $iOffset, + 'PAGEOFFSET' => $iPageOffset, + 'SORT' => $sort, + 'SEARCH' => $aSearch, + 'MAILBOX' => $sMailbox, + 'INDENT' => $indent, + 'LAST' => $bLast + ); + printMessageInfo($aMsg); ++$t; } else { break; @@ -703,30 +1127,22 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg, * * To finish the table, you need to do a ""; * -* @param mixed $imapConnection -* @param array $mbxresponse the array with the results of SELECT against the current mailbox -* @param string $mailbox the current mailbox -* @param mixed $sort the current sorting method (-1 for no sorting available [searches]) -* @param mixed $msg_cnt_str -* @param mixed $paginator -* @param mixed $start_msg +* @param resource $imapConnection +* @param array $aMailbox associative array with mailbox related information +* @param string $msg_cnt_str +* @param string $paginator Paginator string */ function mail_message_listing_beginning ($imapConnection, - $mbxresponse, - $mailbox = '', $sort = -1, - $msg_cnt_str = '', - $paginator = ' ', - $start_msg = 1) { - global $color, $auto_expunge, $base_uri, $show_flag_buttons, - $allow_server_sort, $server_sort_order, - $PHP_SELF, $allow_thread_sort, $thread_sort_messages; + $aMailbox, + $msg_cnt_str = '', + $paginator = ' ' + ) { + global $color, $show_flag_buttons, $PHP_SELF; + global $lastTargetMailbox, $boxes; $php_self = $PHP_SELF; - /* fix for incorrect $PHP_SELF */ - if (strpos($php_self, 'move_messages.php')) { - $php_self = str_replace('move_messages.php', 'right_main.php', $php_self); - } - $urlMailbox = urlencode($mailbox); + + $urlMailbox = urlencode($aMailbox['NAME']); if (preg_match('/^(.+)\?.+$/',$php_self,$regs)) { $source_url = $regs[1]; @@ -738,52 +1154,70 @@ function mail_message_listing_beginning ($imapConnection, $msg = ''; } - if (!strpos($php_self,'?')) { - $location = $php_self.'?mailbox=INBOX&startMessage=1'; - } else { - $location = $php_self; - } - $moveFields = addHidden('msg', $msg). - addHidden('mailbox', $mailbox). - addHidden('startMessage', $start_msg). - addHidden('location', $location); + addHidden('mailbox', $aMailbox['NAME']). + addHidden('startMessage', $aMailbox['PAGEOFFSET']); /* build thread sorting links */ - if ($allow_thread_sort == TRUE) { - if ($thread_sort_messages == 1 ) { - $set_thread = 2; - $thread_name = _("Unthread View"); - } elseif ($thread_sort_messages == 0) { - $set_thread = 1; - $thread_name = _("Thread View"); - } - $thread_link_str = '[
' . $thread_name - . ']'; - } - else + $sort = $aMailbox['SORT']; + if ($aMailbox['ALLOW_THREAD']) { + if ($aMailbox['SORT'] & SQSORT_THREAD) { + $sort -= SQSORT_THREAD; + $thread_name = _("Unthread View"); + } else { + $thread_name = _("Thread View"); + $sort = $aMailbox['SORT'] + SQSORT_THREAD; + } + $thread_link_str = '[' . $thread_name + . ']'; + } else { $thread_link_str =''; - + } /* * This is the beginning of the message list table. * It wraps around all messages */ - $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $mailbox); + $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $aMailbox['NAME']); $form_name = "FormMsgs" . $safe_name; - echo '
' ."\n" + echo '' ."\n" . $moveFields; + + $button_str = ''; + // display flag buttons only if supported + if ($show_flag_buttons && + in_array('\\flagged',$aMailbox['PERMANENTFLAGS'], true) ) { + $button_str .= getButton('SUBMIT', 'markUnflagged', _("Unflag")); + $button_str .= getButton('SUBMIT', 'markFlagged', _("Flag")); + $button_str .= " \n"; + } + if (in_array('\\seen',$aMailbox['PERMANENTFLAGS'], true)) { + $button_str .= getButton('SUBMIT', 'markUnread', _("Unread")); + $button_str .= getButton('SUBMIT', 'markRead', _("Read")); + $button_str .= " \n"; + } + $button_str .= getButton('SUBMIT', 'attache',_("Forward")) . + " \n"; + if (in_array('\\deleted',$aMailbox['PERMANENTFLAGS'], true)) { + $button_str .= getButton('SUBMIT', 'delete',_("Delete")); + $button_str .= '' . _("Bypass Trash"); + $button_str .= " \n"; + } + if (!$aMailbox['AUTO_EXPUNGE'] && $aMailbox['RIGHTS'] != 'READ-ONLY') { + $button_str .= getButton('SUBMIT', 'expungeButton',_("Expunge")) .' ' . _("mailbox") . "\n"; + $button_str .= ' '; + } ?> @@ -792,44 +1226,23 @@ function mail_message_listing_beginning ($imapConnection, @@ -890,16 +1294,19 @@ if ($num_msgs) { } /** -* FIXME: Undocumented function +* Prints the table header for the messages list view * -* @param string $mailbox -* @param mixed $sort -* @param mixed $color -* @param bool $showsort -* @param mixed $start_msg +* @param array $aMailbox */ -function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { - global $index_order, $internal_date_sort; +function printHeader($aMailbox) { + global $index_order, $internal_date_sort, $color; + + if ($aMailbox['SORT_METHOD'] != 'THREAD') { + $showsort = true; + } else { + $showsort = false; + } + echo html_tag( 'tr' ,'' , 'center', $color[5] ); /* calculate the width of the subject column based on the @@ -913,23 +1320,23 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { foreach ($index_order as $item) { switch ($item) { case 1: /* checkbox */ - echo html_tag( 'td',get_selectall_link($start_msg, $sort, $mailbox) , '', '', 'width="1%"' ); + echo html_tag( 'td',get_selectall_link($aMailbox) , '', '', 'width="1%"' ); break; case 5: /* flags */ echo html_tag( 'td','' , '', '', 'width="1%"' ); break; case 2: /* from */ - if (handleAsSent($mailbox)) { + if (handleAsSent($aMailbox['NAME'])) { echo html_tag( 'td' ,'' , 'left', '', 'width="25%"' ) . '' . _("To") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_TO_ASC, SQSORT_TO_DEC); + ShowSortButton($aMailbox, SQSORT_TO_ASC, SQSORT_TO_DEC); } } else { echo html_tag( 'td' ,'' , 'left', '', 'width="25%"' ) . '' . _("From") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_FROM_ASC, SQSORT_FROM_DEC); + ShowSortButton($aMailbox, SQSORT_FROM_ASC, SQSORT_FROM_DEC); } } echo "\n"; @@ -939,9 +1346,9 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { . '' . _("Date") . ''; if ($showsort) { if ($internal_date_sort) { - ShowSortButton($sort, $mailbox, SQSORT_INT_DATE_ASC, SQSORT_INT_DATE_DEC); + ShowSortButton($aMailbox, SQSORT_INT_DATE_ASC, SQSORT_INT_DATE_DEC); } else { - ShowSortButton($sort, $mailbox, SQSORT_DATE_ASC, SQSORT_DATE_DEC); + ShowSortButton($aMailbox, SQSORT_DATE_ASC, SQSORT_DATE_DEC); } } echo "\n"; @@ -950,7 +1357,7 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { echo html_tag( 'td' ,'' , 'left', '', 'width="'.$subjectwidth.'%"' ) . '' . _("Subject") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_SUBJ_ASC, SQSORT_SUBJ_DEC); + ShowSortButton($aMailbox, SQSORT_SUBJ_ASC, SQSORT_SUBJ_DEC); } echo "\n"; break; @@ -958,7 +1365,7 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { echo html_tag( 'td', '', 'center','','width="5%" nowrap') . '' . _("Size") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_SIZE_ASC, SQSORT_SIZE_DEC); + ShowSortButton($aMailbox, SQSORT_SIZE_ASC, SQSORT_SIZE_DEC); } echo "\n"; break; @@ -971,19 +1378,18 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { /** * This function shows the sort button. Isn't this a good comment? * -* @param mixed $sort -* @param string $mailbox -* @param mixed $Down -* @param mixed $Up +* @param array $aMailbox +* @param integer $Down +* @param integer $Up */ -function ShowSortButton($sort, $mailbox, $Down, $Up ) { +function ShowSortButton($aMailbox, $Down, $Up ) { global $PHP_SELF; /* Figure out which image we want to use. */ - if ($sort != $Up && $sort != $Down) { + if ($aMailbox['SORT'] != $Up && $aMailbox['SORT'] != $Down) { $img = 'sort_none.png'; $which = $Up; - } elseif ($sort == $Up) { + } elseif ($aMailbox['SORT'] == $Up) { $img = 'up_pointer.png'; $which = $Down; } else { @@ -998,27 +1404,25 @@ function ShowSortButton($sort, $mailbox, $Down, $Up ) { } /* Now that we have everything figured out, show the actual button. */ - echo ' sort'; + . _("Click here to change the sorting of the message list") .'" />'; } /** * FIXME: Undocumented function * -* @param mixed $start_msg -* @param mixed $sort -* @param string $mailbox +* @param array $aMailbox */ -function get_selectall_link($start_msg, $sort, $mailbox) { - global $checkall, $what, $where, $javascript_on; - global $PHP_SELF, $PG_SHOWNUM; +function get_selectall_link($aMailbox) { + global $checkall, $javascript_on; + global $PHP_SELF; $result = ''; if ($javascript_on) { - $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $mailbox); + $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $aMailbox['NAME']); $func_name = "CheckAll" . $safe_name; $form_name = "FormMsgs" . $safe_name; $result = '
- - - + ' . $paginator . $thread_link_str . '', 'left') . "\n"; ?> + + ' . $msg_cnt_str . '', 'right') . "\n"; ?>
- - '; - //echo $thread_link_str; //previous behaviour - getMbxList($imapConnection); - echo getButton('SUBMIT', 'moveButton',_("Move")) . "\n - "; + if (in_array('\\deleted',$aMailbox['PERMANENTFLAGS'], true)) { + ?> + +   +   + + + @@ -838,29 +1251,20 @@ function mail_message_listing_beginning ($imapConnection,
- ' . _("Bypass Trash"); - echo ' '; - } - if (!$auto_expunge && $mbxresponse['RIGHTS'] != 'READ-ONLY') { - echo getButton('SUBMIT', 'expungeButton',_("Expunge")) .' ' . _("mailbox") . "\n"; - echo ' '; - } - do_hook('mailbox_display_buttons'); - ?> + + + + +
- @@ -872,8 +1276,8 @@ if ($num_msgs) {
- - + ' . $paginator_str . '', 'left'); ?> + ' . $msg_cnt_str . '', 'right'); ?>