1 ) {
$where = $aMsg['SEARCH'][0];
$what = $aMsg['SEARCH'][1];
} else {
$where = false;
$what = false;
}
$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;
}
if ($GLOBALS['alt_index_colors']) {
if (!isset($row_count)) {
$row_count = 0;
}
$row_count++;
if ($row_count % 2) {
if (!isset($color[12])) {
$color[12] = '#EAEAEA';
}
$color_string = $color[12];
}
}
$urlMailbox = urlencode($mailbox);
$bSentFolder = handleAsSent($mailbox);
if ((!$bSentFolder) && ($show_recipient_instead)) {
// If the From address is the same as $email_address, then handle as Sent
$from_array = parseAddress($sFrom, 1);
if (!isset($email_address)) {
global $datadir, $username;
$email_address = getPref($datadir, $username, 'email_address');
}
$bHandleAsSent = ((isset($from_array[0][0])) && ($from_array[0][0] == $email_address));
} else {
$bHandleAsSent = $bSentFolder;
}
// If this is a Sent message, display To address instead of From
if ($bHandleAsSent) {
$sFrom = $sTo;
}
// Passing 1 below results in only 1 address being parsed, thus defeating the following code
$sFrom = parseAddress($sFrom/*,1*/);
/*
* This is done in case you're looking into Sent folders,
* because you can have multiple receivers.
*/
$senderNames = $sFrom;
$senderName = '';
$senderAddress = '';
if (sizeof($senderNames)){
foreach ($senderNames as $senderNames_part) {
if ($senderName != '') {
$senderName .= ', ';
$senderAddress .= ', ';
}
$sender_address_part = htmlspecialchars($senderNames_part[0]);
$sender_name_part = str_replace(' ',' ', decodeHeader($senderNames_part[1]));
if ($sender_name_part) {
$senderName .= $sender_name_part;
$senderAddress .= $sender_name_part . ' <' . $sender_address_part . '>';
} else {
$senderName .= $sender_address_part;
$senderAddress .= $sender_address_part;
}
}
}
// If Sent, prefix with To: but only if not Sent folder
if ($bHandleAsSent ^ $bSentFolder) {
$senderName = _("To:") . ' ' . $senderName;
$senderAddress = _("To:") . ' ' . $senderAddress;
}
if ($truncate_sender > 0) {
$senderName = truncateWithEntities($senderName, $truncate_sender);
}
$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 = '';
}
if ($where && $what) {
$searchstr = '&where='.$where.'&what='.$what;
} 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);
$sCc = parseAddress($sCc);
foreach ($message_highlight_list as $message_highlight_list_part) {
if (trim($message_highlight_list_part['value']) != '') {
$high_val = strtolower($message_highlight_list_part['value']);
$match_type = strtoupper($message_highlight_list_part['match_type']);
if($match_type == 'TO_CC') {
$match = array('TO', 'CC');
} else {
$match = array($match_type);
}
foreach($match as $match_type) {
switch($match_type) {
case('TO'):
case('CC'):
case('FROM'):
foreach ($$matches[$match_type] as $address) {
$address[0] = decodeHeader($address[0], true, false);
$address[1] = decodeHeader($address[1], true, false);
if (strstr('^^' . strtolower($address[0]), $high_val) ||
strstr('^^' . strtolower($address[1]), $high_val)) {
$hlt_color = $message_highlight_list_part['color'];
break 4;
}
}
break;
default:
$headertest = strtolower(decodeHeader($$matches[$match_type], true, false));
if (strstr('^^' . $headertest, $high_val)) {
$hlt_color = $message_highlight_list_part['color'];
break 3;
}
break;
}
}
}
}
} /* end Message highlight code */
if (!isset($hlt_color)) {
$hlt_color = $color_string;
}
$col = 0;
$sSubject = str_replace(' ', ' ', decodeHeader($sSubject));
if (isset($indent_array[$iId])) { /* Thread sort */
$subject = processSubject($sSubject, $indent_array[$iId]);
} else {
$subject = processSubject($sSubject, 0);
}
echo html_tag( 'tr','','','','VALIGN="top"') . "\n";
if (sizeof($index_order)) {
foreach ($index_order as $index_order_part) {
switch ($index_order_part) {
case 1: /* checkbox */
echo html_tag( 'td',
addCheckBox("msg[$t]", $checkall, $iId),
'center',
$hlt_color );
break;
case 2: /* from */
if ($senderAddress != $senderName) {
$senderAddress = strtr($senderAddress, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
$title = ' title="' . str_replace('"', "''", $senderAddress) . '"';
} else {
$title = '';
}
echo html_tag( 'td',
$italic . $bold . $flag . $fontstr . $senderName .
$fontstr_end . $flag_end . $bold_end . $italic_end,
'left',
$hlt_color, $title );
break;
case 3: /* date */
if ($sDate == '') {
$sDate = _("Unknown date");
}
echo html_tag( 'td',
$bold . $flag . $fontstr . $sDate .
$fontstr_end . $flag_end . $bold_end,
'center',
$hlt_color,
'nowrap' );
break;
case 4: /* subject */
$td_str = $bold;
if ($thread_sort_messages == 1) {
if (isset($indent_array[$iId])) {
$td_str .= str_repeat(" ",$indent_array[$iId]);
}
}
$td_str .= '";
if (isset($aFlags['\\flagged']) && $aFlags['\\flagged'] == true) {
$td_str .= ' ';
}
if ($default_use_priority) {
if ( ($iPrio == 1) || ($iPrio == 2) ) {
$td_str .= ' ';
}
else if ($iPrio == 5) {
$td_str .= ' ';
}
else {
$td_str .= ' ';
}
}
if ($sType1 == 'mixed') {
$td_str .= '';
} else {
$td_str .= '';
}
$msg_icon = '';
if (!isset($aFlags['\\seen']) || ($aFlags['\\seen']) == false) {
$msg_alt = '(' . _("New") . ')';
$msg_title = '(' . _("New") . ')';
$msg_icon .= SM_PATH . 'images/themes/' . $icon_theme . '/msg_new';
} else {
$msg_alt = '(' . _("Read") . ')';
$msg_title = '(' . _("Read") . ')';
$msg_icon .= SM_PATH . 'images/themes/' . $icon_theme . '/msg_read';
}
if (isset($aFlags['\\deleted']) && ($aFlags['\\deleted']) == true) {
$msg_icon .= '_deleted';
}
if (isset($aFlags['\\answered']) && ($aFlags['\\answered']) == true) {
$msg_alt = '(' . _("Answered") . ')';
$msg_title = '(' . _("Answered") . ')';
$msg_icon .= '_reply';
}
$td_str .= '';
$td_str .= '';
echo html_tag( 'td',
$td_str,
'right',
$hlt_color,
'nowrap' );
}
// plain text message markers
//
else {
$stuff = false;
$td_str = "";
if (isset($aFlags['\\answered']) && $aFlags['\\answered'] == true) {
$td_str .= _("A");
$stuff = true;
}
if ($sType1 == 'mixed') {
$td_str .= '+';
$stuff = true;
}
if ($default_use_priority) {
if ( ($iPrio == 1) || ($iPrio == 2) ) {
$td_str .= "!";
$stuff = true;
}
if ($iPrio == 5) {
$td_str .= "?";
$stuff = true;
}
}
if (isset($aFlags['\\deleted']) && $aFlags['\\deleted'] == true) {
$td_str .= "D";
$stuff = true;
}
if (!$stuff) {
$td_str .= ' ';
}
$td_str .= '';
echo html_tag( 'td',
$td_str,
'center',
$hlt_color,
'nowrap' );
}
break;
case 6: /* size */
echo html_tag( 'td',
$bold . $fontstr . show_readable_size($iSize) .
$fontstr_end . $bold_end,
'right',
$hlt_color );
break;
}
++$col;
}
}
/* html for separationlines between rows */
if ($last) {
echo ''."\n";
} else {
echo '' . "\n" . ' |
' . "\n";
}
}
/**
* Does the $sort $_GET var to field mapping
*
* @param int $sort Field to sort on
* @param bool $bServerSort Server sorting is true
* @param mixed $key UNDOCUMENTED
* @return string $sSortField Field tosort on
*/
function getSortField($sort,$bServerSort) {
switch($sort) {
case SQSORT_NONE:
$sSortField = 'UID';
break;
case SQSORT_DATE_ASC:
case SQSORT_DATE_DEC:
$sSortField = 'DATE';
break;
case SQSORT_FROM_ASC:
case SQSORT_FROM_DEC:
$sSortField = 'FROM';
break;
case SQSORT_SUBJ_ASC:
case SQSORT_SUBJ_DEC:
$sSortField = 'SUBJECT';
break;
case SQSORT_SIZE_ASC:
case SQSORT_SIZE_DEC:
$sSortField = ($bServerSort) ? 'SIZE' : 'RFC822.SIZE';
break;
case SQSORT_TO_ASC:
case SQSORT_TO_DEC:
$sSortField = 'TO';
break;
case SQSORT_CC_ASC:
case SQSORT_CC_DEC:
$sSortField = 'CC';
break;
case SQSORT_INT_DATE_ASC:
case SQSORT_INT_DATE_DEC:
$sSortField = ($bServerSort) ? 'ARRIVAL' : 'INTERNALDATE';
break;
default: $sSortField = 'DATE';
break;
}
return $sSortField;
}
function get_sorted_msgs_list($imapConnection,$sort,$mode,&$error) {
$bDirection = ($sort % 2);
$error = false;
switch ($mode) {
case 'THREAD':
$id = get_thread_sort($imapConnection);
if ($id === false) {
$error = '' .
_("Thread sorting is not supported by your IMAP server.") . '
' .
_("Please report this to the system administrator.").
'';
}
break;
case 'SERVER':
$sSortField = getSortField($sort,true);
$id = sqimap_get_sort_order($imapConnection, $sSortField, $bDirection);
if ($id === false) {
$error = '' .
_( "Server-side sorting is not supported by your IMAP server.") . '
' .
_("Please report this to the system administrator.").
'';
}
break;
default:
$sSortField = getSortField($sort,false);
$id = get_squirrel_sort($imapConnection, $sSortField, $bDirection);
break;
}
return $id;
}
/**
* 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 $msgs, $server_sort_array;
// 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;
/* if there's no messages in this folder */
if ($aMailbox['EXISTS'] == 0) {
$string = '' . _("THIS FOLDER IS EMPTY") . '';
echo '
';
echo ' ';
echo ' ';
echo ' ';
echo ' ';
echo ' ' . html_tag( 'td', $string."\n", 'left')
. ' ';
echo ' ';
echo '
| ';
echo ' |
';
echo '
';
return;
}
if ($aMailbox['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
*/
$start_msg = $aMailbox['PAGEOFFSET'];
if($aMailbox['PAGEOFFSET'] > $aMailbox['EXISTS']) {
$start_msg -= $aMailbox['LIMIT'];
if($start_msg < 1) {
$start_msg = 1;
}
}
$aMailbox['SEARCH'] = array(); // Alex maybe you can change this so that you can use it from a search
// 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
$internaldate = getPref($data_dir, $username, 'internal_date_sort');
if ($internaldate) {
$aFetchItems[] = 'INTERNALDATE';
}
if ($aMailbox['SORT'] === SQSORT_NONE) {
/**
* 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';
}
/* 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 ($aMailbox['SORT'] !== SQSORT_NONE && isset($aMailbox['UIDSET']) && //['SORT_ARRAY']) &&
$aMailbox['UIDSET'] ) {//is_array($mbxresponse['SORT_ARRAY'])) {
$id = $aMailbox['UIDSET'];//$mbxresponse['SORT_ARRAY'];
if (sqsession_is_registered('msgs')) {
sqsession_unregister('msgs');
}
$id_slice = array_slice($id,$start_msg-1,$aMailbox['LIMIT']);
if (count($id_slice)) {
$msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$aMailbox['LIMIT']);
} else {
return false;
}
// FIX ME, move to msgs cache bound to a mailbox
sqsession_register($msgs, 'msgs');
} else {
if (sqsession_is_registered('server_sort_array')) {
sqsession_unregister('server_sort_array');
}
if ($aMailbox['SORT'] !== SQSORT_NONE) {
$id = get_sorted_msgs_list($imapConnection,$aMailbox['SORT'],$aMailbox['SORT_METHOD'],$error);
if ($id !== false) {
$id_slice = array_slice($id,$aMailbox['OFFSET'], $aMailbox['LIMIT']);
if (count($id_slice)) {
$msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$aMailbox['LIMIT'],
$aHeaderFields,$aFetchItems);
} else {
return false;
}
}
} else {
//create id range
$iRangeEnd = (($aMailbox['EXISTS'] - $aMailbox['OFFSET']) > $aMailbox['LIMIT']) ?
$aMailbox['EXISTS'] - $aMailbox['OFFSET'] +1 - $aMailbox['LIMIT']:
$aMailbox['EXISTS'] - $aMailbox['OFFSET'];
$iRangeStart = (($aMailbox['EXISTS'] - $aMailbox['OFFSET']) > $aMailbox['LIMIT']) ?
$aMailbox['EXISTS']-$aMailbox['OFFSET'] +1:1;
$id_slice = range($iRangeStart, $iRangeEnd);
$msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$aMailbox['LIMIT'],
$aHeaderFields,$aFetchItems);
$msgs = array_reverse($msgs,true /* preserve key */);
// generate id array
$id = array_keys($msgs);
$aMailbox['OFFSET'] = 0;
}
// FIX ME, use an id list bound to a mailbox
if ($id !== false) {
sqsession_register($id, 'server_sort_array');
}
sqsession_register($msgs, 'msgs');
}
$aMailbox['UIDSET'] =& $id;
$aMailbox['MSG_HEADERS'] =& $msgs;
} /* if exists > 0 */
$res = getEndMessage($aMailbox['PAGEOFFSET'], $aMailbox['LIMIT'], $aMailbox['EXISTS']);
// $start_msg = $res[0];
$end_msg = $res[1];
$paginator_str = get_paginator_str($aMailbox['NAME'], $aMailbox['PAGEOFFSET'], $end_msg,
$aMailbox['EXISTS'], $aMailbox['LIMIT'], $aMailbox['SORT']);
$msg_cnt_str = get_msgcnt_str($aMailbox['PAGEOFFSET'], $aMailbox['PAGEOFFSET']+$aMailbox['LIMIT'],$aMailbox['EXISTS']);
do_hook('mailbox_index_before');
?>
$aHeaders[$aId[$i]],
'INDX' => $t,
'OFFSET' => $iOffset,
'PAGEOFFSET' => $iPageOffset,
'SORT' => $sort,
'SEARCH' => $aSearch,
'MAILBOX' => $sMailbox,
'LAST' => $bLast
);
printMessageInfo($aMsg);
++$t;
} else {
break;
}
}
}
/**
* Displays the standard message list header.
*
* To finish the table, you need to do a "";
*
* @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,
$aMailbox,
$msg_cnt_str = '',
$paginator = ' '
) {
global $color, $base_uri, $show_flag_buttons, $PHP_SELF;
$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($aMailbox['NAME']);
if (preg_match('/^(.+)\?.+$/',$php_self,$regs)) {
$source_url = $regs[1];
} else {
$source_url = $php_self;
}
if (!isset($msg)) {
$msg = '';
}
if (!strpos($php_self,'?')) {
$location = $php_self.'?mailbox=INBOX&startMessage=1';
} else {
$location = $php_self;
}
$moveFields = addHidden('msg', $msg).
addHidden('mailbox', $aMailbox['NAME']).
addHidden('startMessage', $aMailbox['PAGEOFFSET']).
addHidden('location', $location);
/* build thread sorting links */
if ($aMailbox['ALLOW_THREAD']) {
if ($aMailbox['SORT_METHOD'] == 'THREAD') {
$set_thread = 2;
$thread_name = _("Unthread View");
} else {
$set_thread = 1;
$thread_name = _("Thread View");
}
$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_]/", '_', $aMailbox['NAME']);
$form_name = "FormMsgs" . $safe_name;
echo '