fix for unsafe images links. Somehow the wrong were in de view unsafe images
[squirrelmail.git] / functions / mailbox_display.php
index 83097cad4c398180f024e922f0b5b002bc411822..f5cdda6182c33496985a8a15bc3939e276fcc052 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * mailbox_display.php
  *
- * Copyright (c) 1999-2002 The SquirrelMail Project Team
+ * Copyright (c) 1999-2003 The SquirrelMail Project Team
  * Licensed under the GNU GPL. For full terms see the file COPYING.
  *
  * This contains functions that display mailbox information, such as the
@@ -20,7 +20,7 @@ require_once(SM_PATH . 'functions/imap_mailbox.php');
 /* Default value for page_selector_max. */
 define('PG_SEL_MAX', 10);
 
-function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
+function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
                           $start_msg, $where, $what) {
     global $checkall,
            $color, $msgs, $msort,
@@ -76,9 +76,9 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
        $senderName = sqimap_find_displayable_name($msg['FROM']);
     }
 
-    $subject = processSubject($msg['SUBJECT']);
+    $subject = processSubject($msg['SUBJECT'], $indent_array[$msg['ID']]);
 
-    echo html_tag( 'tr' ) . "\n";
+    echo html_tag( 'tr','','','','VALIGN="top"') . "\n";
 
     if (isset($msg['FLAG_FLAGGED']) && ($msg['FLAG_FLAGGED'] == true)) {
         $flag = "<font color=\"$color[2]\">";
@@ -118,20 +118,19 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
     * AAAAH! Make my eyes stop bleeding!
     * Who wrote this?!
     */
-    if (sizeof($message_highlight_list)){
+    if (is_array($message_highlight_list) && count($message_highlight_list)){
         foreach ($message_highlight_list as $message_highlight_list_part) {
             if (trim($message_highlight_list_part['value']) != '') {
-                if ($message_highlight_list_part['match_type'] == 'to_cc') {
-                    if (strstr('^^' . strtolower($msg['TO']),
-                               strtolower($message_highlight_list_part['value']))
-                        || strstr('^^'.strtolower($msg['CC']),
-                                  strtolower($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') {
+                    if (strstr('^^' . strtolower($msg['TO']), $high_val) ||
+                        strstr('^^' . strtolower($msg['CC']), $high_val)) {
                         $hlt_color = $message_highlight_list_part['color'];
                         continue;
                     }
                 } else {
-                    if (strstr('^^' . strtolower($msg[strtoupper($message_highlight_list_part['match_type'])]),
-                               strtolower($message_highlight_list_part['value']))) {
+                    if (strstr('^^' . strtolower($msg[$match_type]), $high_val)) {
                         $hlt_color = $message_highlight_list_part['color'];
                         continue;
                     }
@@ -143,13 +142,7 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
     if (!isset($hlt_color)) {
         $hlt_color = $color_string;
     }
-
-    $checked = ($checkall == 1) ? ' checked' : '';
-    $row = new html();
-    $row->tag = 'tr';
-    $row->class = 'm_r';
-    $row->id = 'mr'.$t;
-
+    $checked = ($checkall == 1) ? ' CHECKED' : '';
     $col = 0;
     if (sizeof($index_order)) {
         foreach ($index_order as $index_order_part) {
@@ -162,14 +155,18 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
                 break;
             case 2: /* from */
                 echo html_tag( 'td',
-                               $italic . $bold . $flag . $fontstr . $senderName .
+                               $italic . $bold . $flag . $fontstr . htmlentities($senderName) .
                                $fontstr_end . $flag_end . $bold_end . $italic_end,
                                'left',
                                $hlt_color );
                 break;
             case 3: /* date */
+                $date_string = $msg['DATE_STRING'] . '';
+                if ($date_string == '') {
+                    $date_string = _("Unknown date");
+                }
                 echo html_tag( 'td',
-                               $bold . $flag . $fontstr . $msg['DATE_STRING'] .
+                               $bold . $flag . $fontstr . $date_string .
                                $fontstr_end . $flag_end . $bold_end,
                                'center',
                                $hlt_color,
@@ -178,7 +175,7 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
             case 4: /* subject */
                 $td_str = $bold;
                 if ($thread_sort_messages == 1) {
-                    if (isset($indent_array[$msg["ID"]])) {
+                    if (isset($indent_array[$msg['ID']])) {
                         $td_str .= str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;",$indent_array[$msg['ID']]);
                     }
                 }
@@ -243,12 +240,15 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
             ++$col;
         }
     }
-    echo '</tr>'."\n".'<tr><td colspan="'.$col.'" BGCOLOR="'.
-                               $color[0].'" HEIGHT="1"></td></tr>'."\n";
+    if ($not_last) {
+        echo '</tr>' . "\n" . '<tr><td COLSPAN="' . $col . '" BGCOLOR="' .
+             $color[0] . '" HEIGHT="1"></td></tr>' . "\n";
+    } else {
+        echo '</tr>'."\n";
+    }
 }
 
-function getThreadMessages($imapConnection, $start_msg, $show_num, $num_msgs) {
-    $id = get_thread_sort($imapConnection);
+function getServerMessages($imapConnection, $start_msg, $show_num, $num_msgs, $id) {
     if ($id != 'no') {
         if ($start_msg + ($show_num - 1) < $num_msgs) {
             $end_msg = $start_msg + ($show_num-1);
@@ -271,65 +271,51 @@ function getThreadMessages($imapConnection, $start_msg, $show_num, $num_msgs) {
     }
 }
 
+function getThreadMessages($imapConnection, $start_msg, $show_num, $num_msgs) {
+    $id = get_thread_sort($imapConnection);
+    return getServerMessages($imapConnection, $start_msg, $show_num, $num_msgs, $id);
+}
+
 function getServerSortMessages($imapConnection, $start_msg, $show_num,
-                              $num_msgs, $server_sort_order, $mbxresponse) {
-  $id = sqimap_get_sort_order($imapConnection, $server_sort_order,$mbxresponse);
-  if ($id != 'no') {
-     if ($start_msg + ($show_num - 1) < $num_msgs) {
-        $end_msg = $start_msg + ($show_num-1);
-     } else {
-        $end_msg = $num_msgs;
-     }
-     $id = array_slice($id, ($start_msg-1), ($end_msg));
-
-     $end = $start_msg + $show_num - 1;
-     if ($num_msgs < $show_num) {
-        $end_loop = $num_msgs;
-     } else if ($end > $num_msgs) {
-        $end_loop = $num_msgs - $start_msg + 1;
-     } else {
-        $end_loop = $show_num;
-     }
-     return fillMessageArray($imapConnection,$id,$end_loop);
-  } else {
-     return false;
-  }
+                               $num_msgs, $server_sort_order, $mbxresponse) {
+    $id = sqimap_get_sort_order($imapConnection, $server_sort_order,$mbxresponse);
+    return getServerMessages($imapConnection, $start_msg, $show_num, $num_msgs, $id);
 }
 
 function getSelfSortMessages($imapConnection, $start_msg, $show_num,
                               $num_msgs, $sort, $mbxresponse) {
-  $msgs = array();
-  if ($num_msgs >= 1) {
-    $id = sqimap_get_php_sort_order ($imapConnection, $mbxresponse);
-    if ($sort < 6 ) {
-       $end = $num_msgs;
-       $end_loop = $end;
-    } else {
-       /* if it's not sorted */
-       if ($start_msg + ($show_num - 1) < $num_msgs) {
-          $end_msg = $start_msg + ($show_num - 1);
-       } else {
-          $end_msg = $num_msgs;
-       }
-       if ($end_msg < $start_msg) {
-          $start_msg = $start_msg - $show_num;
-          if ($start_msg < 1) {
-             $start_msg = 1;
-          }
-       }
-       $id = array_slice(array_reverse($id), ($start_msg-1), ($end_msg));
-       $end = $start_msg + $show_num - 1;
-       if ($num_msgs < $show_num) {
-          $end_loop = $num_msgs;
-       } else if ($end > $num_msgs) {
-          $end_loop = $num_msgs - $start_msg + 1;
-       } else {
-          $end_loop = $show_num;
-       }
+    $msgs = array();
+    if ($num_msgs >= 1) {
+        $id = sqimap_get_php_sort_order ($imapConnection, $mbxresponse);
+        if ($sort < 6 ) {
+            $end = $num_msgs;
+            $end_loop = $end;
+        } else {
+            /* if it's not sorted */
+            if ($start_msg + ($show_num - 1) < $num_msgs) {
+                $end_msg = $start_msg + ($show_num - 1);
+            } else {
+                $end_msg = $num_msgs;
+            }
+            if ($end_msg < $start_msg) {
+                $start_msg = $start_msg - $show_num;
+                if ($start_msg < 1) {
+                    $start_msg = 1;
+                }
+            }
+            $id = array_slice(array_reverse($id), ($start_msg-1), ($end_msg));
+            $end = $start_msg + $show_num - 1;
+            if ($num_msgs < $show_num) {
+                $end_loop = $num_msgs;
+            } else if ($end > $num_msgs) {
+                $end_loop = $num_msgs - $start_msg + 1;
+            } else {
+                $end_loop = $show_num;
+            }
+        }
+        $msgs = fillMessageArray($imapConnection,$id,$end_loop);
     }
-    $msgs = fillMessageArray($imapConnection,$id,$end_loop);
-  }
-  return $msgs;
+    return $msgs;
 }
 
 
@@ -380,30 +366,26 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
             $mode = '';
         }
 
+        sqsession_unregister('msort');
+        sqsession_unregister('msgs');
         switch ($mode) {
             case 'thread':
-                sqsession_unregister('msort');
-                sqsession_unregister('msgs');
-                $msgs = getThreadMessages($imapConnection, $start_msg, $show_num,
-                                          $num_msgs);
+                $id   = get_thread_sort($imapConnection);
+                $msgs = getServerMessages($imapConnection, $start_msg, $show_num, $num_msgs, $id);
                 if ($msgs === false) {
                     echo '<b><small><center><font color=red>' .
                          _("Thread sorting is not supported by your IMAP server.<br>Please report this to the system administrator.").
                          '</center></small></b>';
                     $thread_sort_messages = 0;
                     $msort = $msgs = array();
-                    sqsession_register($msort, 'msort');
-                    sqsession_register($msgs, 'msgs');
                 } else {
                     $msort= $msgs;
                     $sort = 6;
-                    sqsession_register($msort, 'msort');
-                    sqsession_register($msgs, 'msgs');
                 }
                 break;
             case 'serversort':
-                $msgs = getServerSortMessages($imapConnection, $start_msg, $show_num,
-                                              $num_msgs, $sort, $mbxresponse);
+                $id   = sqimap_get_sort_order($imapConnection, $sort, $mbxresponse);
+                $msgs = getServerMessages($imapConnection, $start_msg, $show_num, $num_msgs, $id);
                 if ($msgs === false) {
                     echo '<b><small><center><font color=red>' .
                          _( "Server-side sorting is not supported by your IMAP server.<br>Please report this to the system administrator.").
@@ -411,28 +393,22 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
                     $sort = $server_sort_order;
                     $allow_server_sort = FALSE;
                     $msort = $msgs = array();
-                    sqsession_register($msort, 'msort');
-                    sqsession_register($msgs, 'msgs');
                     $id = array();
                 } else {
-                    $sort = 6;
                     $msort = $msgs;
-                    sqsession_register($msort, 'msort');
-                    sqsession_register($msgs, 'msgs');
+                    $sort = 6;
                 }
                 break;
             default:
                 if (!$use_cache) {
-                    sqsession_unregister('msgs');
-                    sqsession_unregister('msort');
                     $msgs = getSelfSortMessages($imapConnection, $start_msg, $show_num,
                                                 $num_msgs, $sort, $mbxresponse);
                     $msort = calc_msort($msgs, $sort);
-                    sqsession_register($msort, 'msort');
-                    sqsession_register($msgs, 'msgs');
                 } /* !use cache */
                 break;
         } // switch
+        sqsession_register($msort, 'msort');
+        sqsession_register($msgs,  'msgs');
     } /* if exists > 0 */
 
     $res = getEndMessage($start_msg, $show_num, $num_msgs);
@@ -445,23 +421,28 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
     $msg_cnt_str = get_msgcnt_str($start_msg, $end_msg, $num_msgs);
 
     do_hook('mailbox_index_before');
-
-    mail_message_listing_beginning($imapConnection, $mailbox, $sort,
-                                   $msg_cnt_str, $paginator_str, $start_msg);
-
-
-    echo '<table bgcolor="' . $color[0] . '" border="0" width="100%" cellpadding="1" cellspacing="0"><tr><td>';
+    echo '<table border="0" width="100%" cellpadding="0" cellspacing="0">';
+    echo '<tr><td>';
+
+    mail_message_listing_beginning($imapConnection, $mailbox, $sort, 
+                                  $msg_cnt_str, $paginator_str, $start_msg);
+    echo '</td></tr>';
+    /* line between the button area and the list */
+    echo '<tr><td HEIGHT="5" BGCOLOR="'.$color[4].'"></td></tr>';  
+
+    echo '<tr><td>';
+    echo '    <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">';
+    echo '     <tr><td>';
+    echo '       <table width="100%" cellpadding="1" cellspacing="0" align="center" border="0" bgcolor="'.$color[5].'">';
+    echo '<tr><td>';
     printHeader($mailbox, $srt, $color, !$thread_sort_messages);
 
-    displayMessageArray($imapConnection, $num_msgs, $start_msg,
-                        $msort, $mailbox, $sort, $color, $show_num, 0, 0);
+    displayMessageArray($imapConnection, $num_msgs, $start_msg, 
+                     $msort, $mailbox, $sort, $color, $show_num,0,0);
+    echo '</td></tr></table></td></tr></table>';
 
-    mail_message_listing_end($num_msgs, $paginator_str, $msg_cnt_str, $color);
+    mail_message_listing_end($num_msgs, $paginator_str, $msg_cnt_str, $color); 
     echo '</td></tr></table>';
-
-  /**
-   * TODO: Switch to using $_SESSION[] whenever we ditch the 4.0.x series.
-   */
 }
 
 function calc_msort($msgs, $sort) {
@@ -474,12 +455,19 @@ function calc_msort($msgs, $sort) {
      * 4 = Subject (up)
      * 5 = Subject (dn)
      */
+
     if (($sort == 0) || ($sort == 1)) {
-        $msort = array_cleave ($msgs, 'TIME_STAMP');
+        foreach ($msgs as $item) {
+            $msort[] = $item['TIME_STAMP'];
+        }
     } elseif (($sort == 2) || ($sort == 3)) {
-        $msort = array_cleave ($msgs, 'FROM-SORT');
+        foreach ($msgs as $item) {
+            $msort[] = $item['FROM-SORT'];
+        }
     } elseif (($sort == 4) || ($sort == 5)) {
-        $msort = array_cleave ($msgs, 'SUBJECT-SORT');
+        foreach ($msgs as $item) {
+            $msort[] = $item['SUBJECT-SORT'];
+        }
     } else {
         $msort = $msgs;
     }
@@ -562,8 +550,7 @@ function fillMessageArray($imapConnection, $id, $count) {
 function displayMessageArray($imapConnection, $num_msgs, $start_msg,
                              $msort, $mailbox, $sort, $color,
                              $show_num, $where=0, $what=0) {
-    global $imapServerAddress, $use_mailbox_cache,
-           $index_order, $checkall,
+    global $imapServerAddress, $use_mailbox_cache, $index_order,
            $indent_array, $thread_sort_messages, $allow_server_sort,
            $server_sort_order, $PHP_SELF;
 
@@ -574,7 +561,7 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg,
     $urlMailbox = urlencode($mailbox);
 
     /* get indent level for subject display */
-    if ($thread_sort_messages == 1 ) {
+    if ($thread_sort_messages == 1 && $num_msgs) {
         $indent_array = get_parent_level($imapConnection);
     }
 
@@ -598,7 +585,7 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg,
 
     /* messages display */
 
-    if ($num_msgs == 0) {
+    if (!$num_msgs) {
     /* if there's no messages in this folder */
         echo html_tag( 'tr',
                 html_tag( 'td',
@@ -622,8 +609,8 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg,
             next($msort);
             $k++;
         } while (isset ($key) && ($k < $i));
-        printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
-            $real_startMessage, $where, $what);
+        printMessageInfo($imapConnection, $t, true, $key, $mailbox,
+                         $real_startMessage, $where, $what);
     } else {
         $i = $start_msg;
         reset($msort);
@@ -633,16 +620,17 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg,
             next($msort);
             $k++;
         } while (isset ($key) && ($k < $i));
+        $not_last = true;
         do {
-            printMessageInfo($imapConnection, $t, $i, $key, $mailbox,
-                             $real_startMessage, $where, $what);
+            if (!$i || $i == $endVar-1) $not_last = false;
+                printMessageInfo($imapConnection, $t, $not_last, $key, $mailbox,
+                                 $real_startMessage, $where, $what);
             $key = key($msort);
             $t++;
             $i++;
             next($msort);
         } while ($i && $i < $endVar);
     }
-    echo '</table>';
 }
 
 /*
@@ -687,35 +675,43 @@ function mail_message_listing_beginning ($imapConnection,
      * This is the beginning of the message list table.
      * It wraps around all messages
      */
-
     echo "<FORM name=\"messageList\" method=post action=\"$moveURL\">\n"
-        . html_tag( 'table' ,'' , '', '', 'border="0" width="100%" cellpadding="1"  cellspacing="0"' ) .
+        . html_tag( 'table' ,
             html_tag( 'tr',
                 html_tag( 'td' ,
                     html_tag( 'table' ,
                         html_tag( 'tr',
                             html_tag( 'td', $paginator, 'left' ) .
-                            html_tag( 'td', $msg_cnt_str, 'right' )
+                            html_tag( 'td', $msg_cnt_str, 'right' ) 
                         )
-                    , '', $color[4], 'border="0" width="100%" cellpadding="2"  cellspacing="0"' )
+                    , '', $color[4], 'border="0" width="100%" cellpadding="1"  cellspacing="0"' ) 
                 , 'left', '', '' )
             , '', $color[0] )
-        . html_tag( 'tr' ) . "\n"
-        . html_tag( 'td' ,'' , 'left', $color[0], '' )
-        . html_tag( 'table' ,'' , '', $color[0], 'border="0" width="100%" cellpadding="0"  cellspacing="0"' )
+           , '', '', 'border="0" width="100%" cellpadding="1"  cellspacing="0"' );
+       /* line between header and button area */
+        echo '<tr><td HEIGHT="5" BGCOLOR="'.$color[4].'"></td></tr>';
+
+        echo '<tr><td>';
+        echo html_tag( 'tr' ) . "\n"
+        . html_tag( 'td' ,'' , 'left', '', '' )
+         . html_tag( 'table' ,'' , '', $color[9], 'border="0" width="100%" cellpadding="1"  cellspacing="0"' )
+         . '<tr><td>'
+           . html_tag( 'table' ,'' , '', $color[0], 'border="0" width="100%" cellpadding="1"  cellspacing="0"' )
             . html_tag( 'tr',
-                getSmallStringCell('&nbsp;' . _("Move Selected To"), 'left') .
-                getSmallStringCell(_("Transform Selected Messages"), 'right')
+               getSmallStringCell(_("Move Selected To"), 'left', 'nowrap') .
+               getSmallStringCell(_("Transform Selected Messages"), 'right')
             )
             . html_tag( 'tr' ) ."\n"
             . html_tag( 'td', '', 'left', '', 'valign="middle" nowrap' );
-            getMbxList($imapConnection);
-            echo getButton('SUBMIT', 'moveButton',_("Move")) . "\n";
-            echo getButton('SUBMIT', 'attache',_("Forward")) . "\n";
+            getMbxList($imapConnection);  
+            echo getButton('SUBMIT', 'moveButton',_("Move")) . "\n";   
+            echo getButton('SUBMIT', 'attache',_("Forward")) . "\n";   
 
-    echo "      </TD>\n"
+  echo "      </TD>\n"
          . html_tag( 'td', '', 'right', '', 'nowrap' );
 
+
+
     if (!$auto_expunge) {
         echo getButton('SUBMIT', 'expungeButton',_("Expunge"))
              .'&nbsp;' . _("mailbox") . "\n";
@@ -752,15 +748,10 @@ function mail_message_listing_beginning ($imapConnection,
                  , '', '', '' );
     }
 
-    echo "</TABLE>\n";
-    echo "</table>\n";
+    echo "</TABLE></td></tr></table></td></tr>\n";
 
     do_hook('mailbox_form_before');
 
-    echo '</td></tr>'
-         . html_tag( 'tr' )
-         . html_tag( 'td' ,'' , '', $color[0], '' );
-
     /* if using server sort we highjack the
      * the $sort var and use $server_sort_order
      * instead. but here we reset sort for a bit
@@ -772,8 +763,12 @@ function mail_message_listing_beginning ($imapConnection,
 }
 
 function mail_message_listing_end($num_msgs, $paginator_str, $msg_cnt_str, $color) {
-    if ($num_msgs) {
-        echo html_tag( 'table',
+  if ($num_msgs) {
+    /* space between list and footer */
+    echo '<tr><td HEIGHT="5" BGCOLOR="'.$color[4].'" COLSPAN="1">';  
+
+    echo '</td></tr><tr><td>';
+    echo html_tag( 'table',
             html_tag( 'tr',
                 html_tag( 'td',
                     html_tag( 'table',
@@ -781,12 +776,12 @@ function mail_message_listing_end($num_msgs, $paginator_str, $msg_cnt_str, $colo
                             html_tag( 'td', $paginator_str ) .
                             html_tag( 'td', $msg_cnt_str, 'right' )
                         )
-                    , '', $color[4], 'width="100%" cellpadding="1" cellspacing="1"' )
+                    , '', $color[4], 'width="100%" border="0" cellpadding="1" cellspacing="0"' )
                 )
-            , '', $color[4] )
-        , '', $color[9], 'width="100%" cellpadding="1"  cellspacing="1"' );
-
-    }
+            )
+        , '', $color[9], 'width="100%" border="0" cellpadding="1"  cellspacing="0"' );
+    echo '</td></tr>';
+  }
     /* End of message-list table */
 
     do_hook('mailbox_index_after');
@@ -795,10 +790,18 @@ function mail_message_listing_end($num_msgs, $paginator_str, $msg_cnt_str, $colo
 
 function printHeader($mailbox, $sort, $color, $showsort=true) {
     global $index_order;
-    echo html_tag( 'table' ,'' , '', $color[4], 'border="0" width="100%" cellpadding="1" cellspacing="0"' );
     echo html_tag( 'tr' ,'' , 'center', $color[5] );
-    for ($i = 1; $i <= count($index_order); $i++) {
-        switch ($index_order[$i]) {
+
+    /* calculate the width of the subject column based on the
+     * widths of the other columns */
+    $widths = array(1=>1,2=>25,3=>5,4=>0,5=>1,6=>5);
+    $subjectwidth = 100;
+    foreach($index_order as $item) {
+        $subjectwidth -= $widths[$item]; 
+    }
+
+    foreach ($index_order as $item) {
+        switch ($item) {
         case 1: /* checkbox */
         case 5: /* flags */
             echo html_tag( 'td' ,'&nbsp;' , '', '', 'width="1%"' );
@@ -825,7 +828,7 @@ function printHeader($mailbox, $sort, $color, $showsort=true) {
             echo "</td>\n";
             break;
         case 4: /* subject */
-            echo html_tag( 'td' ,'' , 'left', '', '' )
+            echo html_tag( 'td' ,'' , 'left', '', 'width="'.$subjectwidth.'%"' )
                  . '<b>' . _("Subject") . '</b>';
             if ($showsort) {
                 ShowSortButton($sort, $mailbox, 4, 5);
@@ -1165,18 +1168,24 @@ function get_paginator_str($box, $start_msg, $end_msg, $num_msgs,
     return ($result);
 }
 
-function processSubject($subject) {
+function processSubject($subject, $threadlevel = 0) {
     global $languages, $squirrelmail_language;
     /* Shouldn't ever happen -- caught too many times in the IMAP functions */
     if ($subject == '')
         return _("(no subject)");
 
-    if (strlen($subject) <= 55)
+    $trim_at = 55;
+
+    /* if this is threaded, substract two chars per indentlevel */
+    if($threadlevel > 0 && $threadlevel <= 10)
+        $trim_at -= (2*$threadlevel);
+
+    if (strlen($subject) <= $trim_at)
         return $subject;
 
     $ent_strlen = strlen($subject);
-    $trim_val=50;
-    $ent_offset=0;
+    $trim_val = $trim_at - 5;
+    $ent_offset = 0;
     /*
      * see if this is entities-encoded string
      * If so, Iterate through the whole string, find out
@@ -1190,7 +1199,7 @@ function processSubject($subject) {
         $ent_offset  = $ent_loc_end+1;
     }
 
-    if ($ent_strlen <= 55){
+    if ($ent_strlen <= $trim_at){
         return $subject;
     }
 
@@ -1205,21 +1214,7 @@ function processSubject($subject) {
 function getMbxList($imapConnection) {
     global $lastTargetMailbox;
     echo  '         <small>&nbsp;<tt><select name="targetMailbox">';
-    $boxes = sqimap_mailbox_list($imapConnection);
-    foreach ($boxes as $boxes_part) {
-        if (!in_array('noselect', $boxes_part['flags'])) {
-            $box = $boxes_part['unformatted'];
-            $box2 = str_replace(' ', '&nbsp;', imap_utf7_decode_local($boxes_part['unformatted-disp']));
-            if($box2 == 'INBOX') {
-                $box2 = _("INBOX");
-            }
-            if ($lastTargetMailbox == $box) {
-                echo "       <OPTION VALUE=\"$box\" SELECTED>$box2</OPTION>\n";
-            } else {
-                echo "         <OPTION VALUE=\"$box\">$box2</OPTION>\n";
-            }
-        }
-    }
+    echo sqimap_mailbox_option_list($imapConnection, array(strtolower($lastTargetMailbox)) ); 
     echo '         </SELECT></TT>&nbsp;';
 }