this is a fix for the LSUB with a % when getting the folder list. This makes the...
[squirrelmail.git] / functions / mailbox_display.php
index 07d94a752fc4835dd376b9c0caa4c97cbf2eeb5e..ceed2dc4cc29fe05438c302f126c53768b004016 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 require_once('../functions/strings.php');
+require_once('../functions/imap_utf7_decode_local.php');
 
 /* Default value for page_selector_max. */
 define('PG_SEL_MAX', 10);
@@ -28,8 +29,10 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox, $sort,
     $indent_array,   /* indent subject by */
     $pos,            /* Search postion (if any)  */
     $thread_sort_messages, /* thread sorting on/off */
-    $row_count;
-  $color_string = $color[4];
+    $server_sort_order, /* sort value when using server-sorting */
+    $row_count,
+       $allow_server_sort; /* enable/disable server-side sorting */
+    $color_string = $color[4];
   
   if ($GLOBALS['alt_index_colors']) {
     if (!isset($row_count)) {
@@ -159,8 +162,10 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox, $sort,
       case 4: /* subject */
        echo "   <td bgcolor=\"$hlt_color\">$bold";
        if ($thread_sort_messages == 1) {
-         echo str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;",$indent_array[$msg["ID"]]);
-       }
+      if (isset($indent_array[$msg["ID"]])) {
+           echo str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;",$indent_array[$msg["ID"]]);
+         }
+    }
        echo "<a href=\"read_body.php?mailbox=$urlMailbox&amp;passed_id="
          . $msg["ID"] 
          . "&amp;startMessage=$start_msg&amp;show_more=0$search_stuff\"";
@@ -186,11 +191,11 @@ function printMessageInfo($imapConnection, $t, $i, $key, $mailbox, $sort,
          $stuff = true;
        }
        if ($default_use_priority) {
-         if ( ($msg['PRIORITY'][0] == 1) || ($msg['PRIORITY'][0] == 2) ) {
+         if ( ($msg['PRIORITY'] == 1) || ($msg['PRIORITY'] == 2) ) {
            echo "<font color=\"$color[1]\">!</font>\n";
            $stuff = true;
          }
-         if ($msg['PRIORITY'][0] == 5) {
+         if ($msg['PRIORITY'] == 5) {
            echo "<font color=\"$color[8]\">?</font>\n";
            $stuff = true;
          }
@@ -223,21 +228,71 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
                                $use_cache) {
   global $msgs, $msort,
     $sent_folder, $draft_folder,
-    $message_highlight_list,
-    $auto_expunge, $thread_sort_messages,
-    $data_dir, $username;
-  /* If autoexpunge is turned on, then do it now. */
-  
+    $message_highlight_list, 
+    $auto_expunge, $thread_sort_messages, $allow_server_sort,
+    $data_dir, $username, $server_sort_order;
+
+   /* 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;
+       }
+   }
+
+  /* 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) {
     $id = get_thread_sort($imapConnection);
-    $sort = 6;
-    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));
+  if ($id == 'no') {
+      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; 
+    $id = array();
   }
+  else {
+      $sort = 6;
+      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));
+      }
+  }
+
+  if ($allow_server_sort == TRUE && $thread_sort_messages != 1) {
+    $server_sort_order = $sort;
+    $id = sqimap_get_sort_order($imapConnection, $server_sort_order);
+  if ($id == 'no') {
+    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.</center></small></b>';
+    $sort = $server_sort_order;
+         $allow_server_sort = FALSE;
+         $id = array();
+       }
+       else {
+      $sort = 6;
+      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));
+       }
+  }
+
+  /* If autoexpunge is turned on, then do it now. */
   if ($auto_expunge == true) {
     sqimap_mailbox_expunge($imapConnection, $mailbox, false);
   }
@@ -249,7 +304,7 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
       if ($sort < 6 ) {
        $id = range(1, $num_msgs);
       } 
-      elseif ($thread_sort_messages != 1) {
+      elseif ($thread_sort_messages != 1 && $allow_server_sort != TRUE && $sort == 6) {
        /* if it's not sorted */
        if ($start_msg + ($show_num - 1) < $num_msgs){
          $end_msg = $start_msg + ($show_num - 1);
@@ -271,7 +326,7 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
        $id = array_reverse(range($real_endMessage, $real_startMessage));
       }
       $msgs_list = sqimap_get_small_header_list($imapConnection, $id, $issent);
-      $flags = sqimap_get_flags_list($imapConnection, $id, $issent);
+//      $flags = sqimap_get_flags_list($imapConnection, $id, $issent);
       if (sizeof($msgs_list)){
        foreach ($msgs_list as $hdr) {
          $from[] = $hdr->from;
@@ -282,6 +337,10 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
          $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;
        }
       }
     }
@@ -321,6 +380,11 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
       $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:
@@ -335,7 +399,7 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
                     $messages[$j]['SUBJECT-SORT'], $matches)){
        $messages[$j]['SUBJECT-SORT'] = $matches[2];
       }
-      
+/*      
       $num = 0;
       while ($num < count($flags[$j])) {
        if ($flags[$j][$num] == 'Deleted') {
@@ -349,7 +413,9 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
        }
        $num++;
       }
+*/
       $j++;
+
     }
 
     /*
@@ -413,7 +479,7 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
       }
     }          
     session_register('msort');
-  } elseif ($thread_sort_messages == 1 ) {
+  } elseif ($thread_sort_messages == 1 || $allow_server_sort == TRUE) {
     $msort = $msgs;
     session_unregister('msgs');
     session_register('msort');
@@ -430,125 +496,142 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
 function displayMessageArray($imapConnection, $num_msgs, $start_msg, 
                             &$msgs, $msort, $mailbox, $sort, $color, 
                             $show_num) {
-  global $folder_prefix, $sent_folder, 
-    $imapServerAddress, $data_dir, $username, $use_mailbox_cache, 
-    $index_order, $real_endMessage, $real_startMessage, $checkall, 
-    $indent_array, $thread_sort_messages;
-
-  /* If cache isn't already set, do it now. */
-  if (!session_is_registered('msgs')) {
-    session_register('msgs');
-  }
-  if (!session_is_registered('msort')) {
-    session_register('msort');
-  }
-  
-  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;
+                               
+    global $folder_prefix, $sent_folder, 
+           $imapServerAddress, $data_dir, $username, $use_mailbox_cache, 
+           $index_order, $real_endMessage, $real_startMessage, $checkall, 
+           $indent_array, $thread_sort_messages, $allow_server_sort, 
+           $server_sort_order, $html;
+    
+    /* If cache isn't already set, do it now. */
+    if (!session_is_registered('msgs')) {
+        session_register('msgs');
     }
-  }
-
-  $urlMailbox = urlencode($mailbox);
-
-  do_hook('mailbox_index_before');
-
-  $msg_cnt_str = get_msgcnt_str($start_msg, $end_msg, $num_msgs);
-  $paginator_str = get_paginator_str($urlMailbox, $start_msg, $end_msg, 
-                                    $num_msgs, $show_num, $sort);
-
-  if (!isset($msg)) {
-    $msg = '';
-  }
-
-  /* get indent level for subject display */
-  if ($thread_sort_messages == 1 ) {
-    $indent_array = get_parent_level($imapConnection);
-  }
-  $fstring = "move_messages.php?msg=$msg&amp;mailbox=$urlMailbox"
-    . "&amp;startMessage=$start_msg";
-  mail_message_listing_beginning($imapConnection, $fstring,
-                                $mailbox, $sort, $msg_cnt_str, 
-                                $paginator_str, $start_msg);
-
-  $groupNum = $start_msg % ($show_num - 1);
-  $real_startMessage = $start_msg;
-  if ($sort == 6) {
-    if ($end_msg - $start_msg < $show_num - 1) {
-      $end_msg = $end_msg - $start_msg + 1;
-      $start_msg = 1;
-    } else if ($start_msg > $show_num) {
-      $end_msg = $show_num;
-      $start_msg = 1;
+    if (!session_is_registered('msort')) {
+        session_register('msort');
     }
-  }
-  $endVar = $end_msg + 1;
-  
-  /*
-   * Loop through and display the info for each message. 
-   * ($t is used for the checkbox number)
-   */
-  $t = 0;
-  if ($num_msgs == 0) {
-    /* if there's no messages in this folder */
-    echo "<TR><TD BGCOLOR=\"$color[4]\" COLSPAN=" 
-      . count($index_order) . ">\n"
-      . "  <CENTER><BR><B>". _("THIS FOLDER IS EMPTY") 
-      . "</B><BR>&nbsp;</CENTER>\n"
-      . "</TD></TR>";
-  } elseif ($start_msg == $end_msg) {
-    /* if there's only one message in the box, handle it differently. */
-    if ($sort != 6){
-      $i = $start_msg;
+    
+    if ($start_msg + ($show_num - 1) < $num_msgs){
+        $end_msg = $start_msg + ($show_num - 1);
     } else {
-      $i = 1;
+        $end_msg = $num_msgs;
     }
-    reset($msort);
-    $k = 0;
-    do {
-      $key = key($msort);
-      next($msort);
-      $k++;
-    } while (isset ($key) && ($k < $i));
-    printMessageInfo($imapConnection, $t, $i, $key, $mailbox, $sort, 
-                    $real_startMessage, 0, 0);
-  } else {
-    $i = $start_msg;
-    reset($msort);
-    $k = 0;
-    do {
-      $key = key($msort);
-      next($msort);
-      $k++;
-    } while (isset ($key) && ($k < $i));
-    do {
-      printMessageInfo($imapConnection, $t, $i, $key, $mailbox, 
-                      $sort, $real_startMessage, 0, 0);
-      $key = key($msort);
-      $t++;
-      $i++;
-      next($msort);
-    } while ($i && $i < $endVar);
-  }
-  
-  echo '</table>'
-    . "<table bgcolor=\"$color[9]\" width=\"100%\" border=0 cellpadding=1 "
-    . "cellspacing=1><tr BGCOLOR=\"$color[4]\"><td>"
-    . "<table width=\"100%\" BGCOLOR=\"$color[4]\" border=0 cellpadding=1 "
-    . "cellspacing=0><tr><td>$paginator_str</td>"
-    . "<td align=right>$msg_cnt_str</td></tr></table>"
-    . "</td></tr></table>";
-  /* End of message-list table */
-  
-  do_hook('mailbox_index_after');
-  echo "</TABLE></FORM>\n";
+    
+    if ($end_msg < $start_msg) {
+        $start_msg = $start_msg - $show_num;
+        if ($start_msg < 1) {
+            $start_msg = 1;
+        }
+    }
+    
+    $urlMailbox = urlencode($mailbox);
+    
+    do_hook('mailbox_index_before');
+    
+    $msg_cnt_str = get_msgcnt_str($start_msg, $end_msg, $num_msgs);
+    $paginator_str = get_paginator_str($urlMailbox, $start_msg, $end_msg, 
+                            $num_msgs, $show_num, $sort);
+    
+    if (!isset($msg)) {
+        $msg = '';
+    }
+    
+    /* get indent level for subject display */
+    if ($thread_sort_messages == 1 ) {
+        $indent_array = get_parent_level($imapConnection);
+    }
+    $fstring = "move_messages.php?msg=$msg&amp;mailbox=$urlMailbox"
+             . "&amp;startMessage=$start_msg";
+    mail_message_listing_beginning($imapConnection, $fstring,
+                        $mailbox, $sort, $msg_cnt_str, 
+                        $paginator_str, $start_msg);
+    
+    $groupNum = $start_msg % ($show_num - 1);
+    $real_startMessage = $start_msg;
+    if ($sort == 6) {
+        if ($end_msg - $start_msg < $show_num - 1) {
+          $end_msg = $end_msg - $start_msg + 1;
+          $start_msg = 1;
+        } else if ($start_msg > $show_num) {
+          $end_msg = $show_num;
+          $start_msg = 1;
+        }
+    }
+    $endVar = $end_msg + 1;
+    
+    /*
+    * Loop through and display the info for each message. 
+    * ($t is used for the checkbox number)
+    */
+    $t = 0;
+    if ($num_msgs == 0) {
+        /* if there's no messages in this folder */
+        echo "<TR><TD BGCOLOR=\"$color[4]\" COLSPAN=" 
+           . count($index_order) . ">\n"
+           . "  <CENTER><BR><B>". _("THIS FOLDER IS EMPTY") 
+           . "</B><BR>&nbsp;</CENTER>\n"
+           . "</TD></TR>";
+    } elseif ($start_msg == $end_msg) {
+        /* if there's only one message in the box, handle it differently. */
+        if ($sort != 6){
+            $i = $start_msg;
+        } else {
+            $i = 1;
+        }
+        reset($msort);
+        $k = 0;
+        do {
+            $key = key($msort);
+            next($msort);
+            $k++;
+        } while (isset ($key) && ($k < $i));
+        printMessageInfo($imapConnection, $t, $i, $key, $mailbox, $sort, 
+                            $real_startMessage, 0, 0);
+    } else {
+        $i = $start_msg;
+        reset($msort);
+        $k = 0;
+        do {
+            $key = key($msort);
+            next($msort);
+            $k++;
+        } while (isset ($key) && ($k < $i));
+        do {
+            printMessageInfo($imapConnection, $t, $i, $key, $mailbox, 
+                   $sort, $real_startMessage, 0, 0);
+            $key = key($msort);
+            $t++;
+            $i++;
+            next($msort);
+        } while ($i && $i < $endVar);
+    }
+    
+    echo '</table>';
+    $html->flush(
+         $html->tag( 'table',
+            $html->tag( 'tr',
+                $html->tag( 'td',
+                    $html->tag( 'table',
+                        $html->tag( 'tr', 
+                            $html->tag( 'td', $paginator_str ) .
+                            $html->tag( 'td', $msg_cnt_str, array( 'align' => 'right' ) ) 
+                        )
+                    , array( 'bgcolor'=> $color[4],
+                             'width' => '100%',
+                             'cellpadding' => 1,
+                             'cellspacing' => 1 ) )
+                )
+            , array( 'bgcolor' => $color[4] ) )
+         , array( 'bgcolor' => $color[9],
+                  'width' => '100%',
+                  'cellpadding' => 1,
+                  'cellspacing' => 1 ) )
+    );
+         
+    /* End of message-list table */
+    
+    do_hook('mailbox_index_after');
+    echo "</TABLE></FORM>\n";
 }
 
 /*
@@ -561,6 +644,7 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg,
  * $Message is a message that is centered on top of the list
  * $More is a second line that is left aligned
  */
 function mail_message_listing_beginning ($imapConnection, $moveURL, 
                                         $mailbox = '', $sort = -1,
                                         $msg_cnt_str = '', 
@@ -568,39 +652,27 @@ function mail_message_listing_beginning ($imapConnection, $moveURL,
                                         $start_msg = 1) {
   global $color, $index_order, $auto_expunge, $move_to_trash, $base_uri,
     $checkall, $sent_folder, $draft_folder, $thread_sort_messages, 
-    $allow_thread_sort;
+    $allow_thread_sort, $allow_server_sort, $server_sort_order,
+    $lastTargetMailbox;
+
   $urlMailbox = urlencode($mailbox);
 
   /*
    * 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=\"$moveURL\">\n"
     . "<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLPADDING=\"1\" "
     . "CELLSPACING=\"0\">\n<TR BGCOLOR=\"$color[0]\"><TD>"
     . "    <TABLE BGCOLOR=\"$color[4]\" width=\"100%\" CELLPADDING=\"2\" "
     . "CELLSPACING=\"0\" BORDER=\"0\"><TR>\n"
     . "    <TD ALIGN=LEFT>$paginator\n";
 
-  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';
-    }
-    echo   '|&nbsp;<a href=' . "$base_uri" . 'src/right_main.php?sort=' 
-      . "$sort" . '&start_messages=1&set_thread=' . "$set_thread"
-      . '&mailbox=' . urlencode($mailbox) . '>' . _("$thread_name")
-      . '</a>&nbsp;';
-  }
-
   echo "    <TD ALIGN=RIGHT>$msg_cnt_str</TD>\n"
     . "  </TR></TABLE>\n"
     . '</TD></TR>'
     . "<TR><TD BGCOLOR=\"$color[0]\">\n"
-    . "<TABLE BGCOLOR=\"$color[0]\" COLS=2 BORDER=0 cellpadding=0"
+    . "<TABLE BGCOLOR=\"$color[0]\" BORDER=0 cellpadding=0 "
     . "cellspacing=0 width=\"100%\">\n"
     . "   <TR>\n"
     . "      <TD ALIGN=LEFT VALIGN=MIDDLE NOWRAP>\n"
@@ -619,11 +691,16 @@ function mail_message_listing_beginning ($imapConnection, $moveURL,
   foreach ($boxes as $boxes_part) {
     if (!in_array('noselect', $boxes_part['flags'])) {
       $box = $boxes_part['unformatted'];
-      $box2 = str_replace(' ', '&nbsp;', $boxes_part['unformatted-disp']);
+      $box2 = str_replace(' ', '&nbsp;', imap_utf7_decode_local($boxes_part['unformatted-disp']));
       if( $box2 == 'INBOX' ) {
        $box2 = _("INBOX");
       }
-      echo "         <OPTION VALUE=\"$box\">$box2</option>\n";
+      if ($lastTargetMailbox == $box) {
+        echo "       <OPTION VALUE=\"$box\" SELECTED>$box2</OPTION>\n";
+      }
+      else {
+        echo "         <OPTION VALUE=\"$box\">$box2</OPTION>\n";
+      }
     }
   }
   echo '         </SELECT></TT>&nbsp;'
@@ -641,8 +718,25 @@ function mail_message_listing_beginning ($imapConnection, $moveURL,
     . '<INPUT TYPE="SUBMIT" NAME="markUnread" VALUE="' . _("Unread") . '">'
     . '<INPUT TYPE="SUBMIT" VALUE="' . _("Delete") . '">&nbsp;'
     . "</TD>\n"
-    . "   </TR>\n"
-    . "</TABLE>\n";
+    . "   </TR>\n";
+
+  /* draws 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");
+    }
+    echo   '<tr><td>&nbsp;<a href=' . "$base_uri" . 'src/right_main.php?sort=' 
+      . "$sort" . '&start_messages=1&set_thread=' . "$set_thread"
+      . '&mailbox=' . urlencode($mailbox) . '><small>' . $thread_name
+      . '</a></small>&nbsp;</td></tr>';
+  }
+
+  echo "</TABLE>\n";
   do_hook('mailbox_form_before');
   echo '</TD></TR>'
     . "<TR><TD BGCOLOR=\"$color[0]\">"
@@ -654,7 +748,14 @@ function mail_message_listing_beginning ($imapConnection, $moveURL,
   }
   echo " BGCOLOR=\"$color[0]\">"
     . "<TR BGCOLOR=\"$color[5]\" ALIGN=\"center\">";
-
+  /* if using server sort we highjack the
+   * the $sort var and use $server_sort_order
+   * instead. but here we reset sort for a bit
+   * since its easy
+   */
+  if ($allow_server_sort == TRUE) {
+    $sort = $server_sort_order;
+  }
   /* Print the headers. */
   for ($i=1; $i <= count($index_order); $i++) {
     switch ($index_order[$i]) {
@@ -668,21 +769,21 @@ function mail_message_listing_beginning ($imapConnection, $moveURL,
       } else {
        echo '   <TD WIDTH="25%"><B>' . _("From") . '</B>';
       }
-      if ($thread_sort_messages != 1) {
+      if ($allow_thread_sort != TRUE || $thread_sort_messages != 1) {
        ShowSortButton($sort, $mailbox, 2, 3);
       }
       echo "</TD>\n";
       break;
     case 3: /* date */
       echo '   <TD NOWRAP WIDTH="5%"><B>' . _("Date") . '</B>';
-      if ($thread_sort_messages != 1) {
+      if ($allow_thread_sort != TRUE || $thread_sort_messages != 1) {
        ShowSortButton($sort, $mailbox, 0, 1);
       }
       echo "</TD>\n";
       break;
     case 4: /* subject */
       echo '   <TD><B>' . _("Subject") . '</B> ';
-      if ($thread_sort_messages != 1) {
+      if ($allow_thread_sort != TRUE || $thread_sort_messages != 1) {
        ShowSortButton($sort, $mailbox, 4, 5);
       }
       echo "</TD>\n";
@@ -692,6 +793,12 @@ function mail_message_listing_beginning ($imapConnection, $moveURL,
       break;
     }
   }
+  /* if using server-sorting,
+   * send sort back to 6
+   */
+  if ($allow_server_sort == TRUE) {
+    $sort = 6;
+  }
   echo "</TR>\n";
 }
 
@@ -715,7 +822,7 @@ function ShowSortButton($sort, $mailbox, $Up, $Down) {
   echo ' <a href="right_main.php?newsort=' . $which
     . '&amp;startMessage=1&amp;mailbox=' . urlencode($mailbox)
     . '"><IMG SRC="../images/' . $img
-    . '" BORDER=0 WIDTH=12 HEIGHT=10></a>';
+    . '" BORDER=0 WIDTH=12 HEIGHT=10 ALT="sort"></a>';
 }
 
 function get_selectall_link($start_msg, $sort) {
@@ -757,10 +864,6 @@ function get_selectall_link($start_msg, $sort) {
        . '&amp;what=' . urlencode($what);
     }
     
-    if ($PG_SHOWNUM == 999999) {
-      $result .= '&amp;PG_SHOWNUM=999999';
-    }
-    
     $result .= "\">";
     
     if (isset($checkall) && ($checkall == '1')) {
@@ -968,14 +1071,14 @@ function get_paginator_str($box, $start_msg, $end_msg, $num_msgs,
        }
       }
   } else if ($PG_SHOWNUM == 999999) {
-    $pg_str = "<A HREF=\"right_main.php?use_mailbox_cache=$use"
-      . "&amp;startMessage=1&amp;mailbox=$box\" TARGET=\"right\">"
-      . _("Paginate") . '</A>' . $spc;
+    $pg_str = "<A HREF=\"right_main.php?PG_SHOWALL=0"
+      . "&amp;use_mailbox_cache=$use&amp;startMessage=1&amp;mailbox=$box\" "
+      . "TARGET=\"right\">" ._("Paginate") . '</A>' . $spc;
   }
 
   /* If necessary, compute the 'show all' string. */
   if (($prv_str != '') || ($nxt_str != '')) {
-    $all_str = "<A HREF=\"right_main.php?PG_SHOWNUM=999999"
+    $all_str = "<A HREF=\"right_main.php?PG_SHOWALL=1"
       . "&amp;use_mailbox_cache=$use&amp;startMessage=1&amp;mailbox=$box\" "
       . "TARGET=\"right\">" . _("Show All") . '</A>';
   }