Fix broken subject line that I doubt has worked since we went rg=0
[squirrelmail.git] / functions / mailbox_display.php
index 9b55139ce092b9d664fa99e189ee308ba5b7d76a..1d04af2a25e5f21a5785eb9a11c43c55058c43f6 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
@@ -76,7 +76,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $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','','','','VALIGN="top"') . "\n";
 
@@ -118,7 +118,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $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']) != '') {
                 $high_val   = strtolower($message_highlight_list_part['value']);
@@ -155,7 +155,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $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 );
@@ -175,14 +175,14 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $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("    ",$indent_array[$msg['ID']]);
                     }
                 }
                 $td_str .= '<a href="read_body.php?mailbox='.$urlMailbox
                         .  '&amp;passed_id='. $msg["ID"]
                         .  '&amp;startMessage='.$start_msg.$searchstr.'"';
-                do_hook("subject_link");
+                $td_str .= ' ' .concat_hook_function('subject_link');
                 if ($subject != $msg['SUBJECT']) {
                     $title = get_html_translation_table(HTML_SPECIALCHARS);
                     $title = array_flip($title);
@@ -455,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;
     }
@@ -475,67 +482,7 @@ function calc_msort($msgs, $sort) {
 }
 
 function fillMessageArray($imapConnection, $id, $count) {
-    $msgs_list = sqimap_get_small_header_list($imapConnection, $id);
-    $messages = array();
-    if (sizeof($msgs_list)) {
-        foreach ($msgs_list as $hdr) {
-            $unique_id[] = $hdr->uid;
-            $from[] = $hdr->from;
-            $date[] = $hdr->date;
-            $subject[] = $hdr->subject;
-            $to[] = $hdr->to;
-            $priority[] = $hdr->priority;
-            $cc[] = $hdr->cc;
-            $size[] = $hdr->size;
-            $type[] = $hdr->type0;
-            $flag_deleted[] = $hdr->flag_deleted;
-            $flag_answered[] = $hdr->flag_answered;
-            $flag_seen[] = $hdr->flag_seen;
-            $flag_flagged[] = $hdr->flag_flagged;
-        }
-    }
-
-    for($j = 0; $j < $count; ++$j) {
-        if (isset($date[$j])) {
-            $date[$j] = str_replace('  ', ' ', $date[$j]);
-            $tmpdate  = explode(' ', trim($date[$j]));
-        } else {
-            $tmpdate = $date = array('', '', '', '', '', '');
-        }
-        $messages[$j]['TIME_STAMP'] = getTimeStamp($tmpdate);
-        $messages[$j]['DATE_STRING'] =
-        getDateString($messages[$j]['TIME_STAMP']);
-        $messages[$j]['ID'] = $unique_id[$j];
-        $messages[$j]['FROM'] = decodeHeader($from[$j]);
-        $messages[$j]['FROM-SORT'] =
-        strtolower(sqimap_find_displayable_name(decodeHeader($from[$j])));
-        $messages[$j]['SUBJECT'] = decodeHeader($subject[$j]);
-        $messages[$j]['SUBJECT-SORT'] = strtolower(decodeHeader($subject[$j]));
-        $messages[$j]['TO'] = decodeHeader($to[$j]);
-        $messages[$j]['PRIORITY'] = $priority[$j];
-        $messages[$j]['CC'] = $cc[$j];
-        $messages[$j]['SIZE'] = $size[$j];
-        $messages[$j]['TYPE0'] = $type[$j];
-        $messages[$j]['FLAG_DELETED'] = $flag_deleted[$j];
-        $messages[$j]['FLAG_ANSWERED'] = $flag_answered[$j];
-        $messages[$j]['FLAG_SEEN'] = $flag_seen[$j];
-        $messages[$j]['FLAG_FLAGGED'] = $flag_flagged[$j];
-
-        /*
-         * fix SUBJECT-SORT to remove Re:
-         *     vedr|sv  (Danish)
-         *     re|aw (English)
-         *
-         * TODO: i18n should be incorporated here. E.g. we catch the ones
-         * we know about, but also define in i18n what the localized
-         * "Re: " is for this or that locale.
-         */
-        if (preg_match("/^(vedr|sv|re|aw):\s*(.*)$/si",
-            $messages[$j]['SUBJECT-SORT'], $matches)){
-            $messages[$j]['SUBJECT-SORT'] = $matches[2];
-        }
-    }
-    return $messages;
+    return sqimap_get_small_header_list($imapConnection, $id);
 }
 
 
@@ -554,7 +501,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);
     }
 
@@ -578,7 +525,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',
@@ -662,13 +609,18 @@ function mail_message_listing_beginning ($imapConnection,
     if (!isset($msg)) {
         $msg = '';
     }
-    $moveURL = "move_messages.php?msg=$msg&amp;mailbox=$urlMailbox"
-             . "&amp;startMessage=$start_msg";
+    $moveFields = '<input type="hidden" name="msg" value="'.htmlspecialchars($msg).'">' .
+                 '<input type="hidden" name="mailbox" value="'.htmlspecialchars($mailbox).'">' .
+                 '<input type="hidden" name="startMessage" value="'.htmlspecialchars($start_msg).'">';
+
+//    $moveURL = "move_messages.php?msg=$msg&amp;mailbox=$urlMailbox"
+//             . "&amp;startMessage=$start_msg";
     /*
      * This is the beginning of the message list table.
      * It wraps around all messages
      */
-    echo "<FORM name=\"messageList\" method=post action=\"$moveURL\">\n"
+    echo '<form name="messageList" method="post" action="move_messages.php">' ."\n"
+       . $moveFields
         . html_tag( 'table' ,
             html_tag( 'tr',
                 html_tag( 'td' ,
@@ -712,7 +664,7 @@ function mail_message_listing_beginning ($imapConnection,
 
     echo getButton('SUBMIT', 'markRead',_("Read"));
     echo getButton('SUBMIT', 'markUnread',_("Unread"));
-    echo getButton('SUBMIT', 'delete',_("Delete")) ."&nbsp\n";
+    echo getButton('SUBMIT', 'delete',_("Delete")) ."&nbsp;\n";
     if (!strpos($php_self,'mailbox')) {
         $location = $php_self.'?mailbox=INBOX&amp;startMessage=1';
     } else {
@@ -784,8 +736,17 @@ 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( '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%"' );
@@ -812,7 +773,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);
@@ -1152,18 +1113,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
@@ -1177,7 +1144,7 @@ function processSubject($subject) {
         $ent_offset  = $ent_loc_end+1;
     }
 
-    if ($ent_strlen <= 55){
+    if ($ent_strlen <= $trim_at){
         return $subject;
     }
 
@@ -1225,16 +1192,15 @@ function getEndMessage($start_msg, $show_num, $num_msgs) {
 }
 
 function handleAsSent($mailbox) {
-    global $sent_folder, $draft_folder, $handleAsSent_result;
-
+    global $handleAsSent_result;
     /* First check if this is the sent or draft folder. */
-    $handleAsSent_result = (($mailbox == $sent_folder)
-                             || ($mailbox == $draft_folder));
+    $handleAsSent_result = isSentMailbox($mailbox) || isDraftMailbox($mailbox);
 
     /* Then check the result of the handleAsSent hook. */
     do_hook('check_handleAsSent_result', $mailbox);
 
     /* And return the result. */
-    return ($handleAsSent_result);
+    return $handleAsSent_result;
 }
 ?>