Patches from Michael Long
authorstekkel <stekkel@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 10 Feb 2006 22:16:07 +0000 (22:16 +0000)
committerstekkel <stekkel@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 10 Feb 2006 22:16:07 +0000 (22:16 +0000)
* implementing imap status cache in order to reduce
the amount of status calls generated from the newmail and filter plugin.
* enable the cumulative message account in left_main.php again

Patches reviewed by me. I fixed a few small things in newmail and I added RECENT status
calls in imap_mailbox.php in order to make the "only check recent mail"
option work.

git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@10697 7612ce4b-ef26-0410-bec9-ea0150e637f0

functions/imap_general.php
functions/imap_mailbox.php
plugins/filters/filters.php
plugins/newmail/functions.php
plugins/newmail/newmail_opt.php
plugins/newmail/setup.php
src/left_main.php

index 7551cba..14672a6 100755 (executable)
@@ -1040,13 +1040,8 @@ function sqimap_encode_mailbox_name($what)
  * @deprecated
  */
 function sqimap_get_num_messages ($imap_stream, $mailbox) {
-    $read_ary = sqimap_run_command ($imap_stream, 'EXAMINE ' . sqimap_encode_mailbox_name($mailbox), false, $result, $message);
-    for ($i = 0; $i < count($read_ary); $i++) {
-        if (ereg("[^ ]+ +([^ ]+) +EXISTS", $read_ary[$i], $regs)) {
-            return $regs[1];
-        }
-    }
-    return false; //"BUG! Couldn't get number of messages in $mailbox!";
+    $aStatus = sqimap_status_messages($imap_stream,$mailbox,array('MESSAGES'));
+    return $aStatus['MESSAGES'];
 }
 
 /**
@@ -1141,11 +1136,22 @@ function sqimap_status_messages ($imap_stream, $mailbox,
         }
         $i++;
     }
-    return array('MESSAGES' => $messages,
+
+    $status=array('MESSAGES' => $messages,
                  'UNSEEN'=>$unseen,
                  'RECENT' => $recent,
                  'UIDNEXT' => $uidnext,
                  'UIDVALIDITY' => $uidvalidity);
+
+    if (!empty($messages)) { $hook_status['MESSAGES']=$messages; }
+    if (!empty($unseen)) { $hook_status['UNSEEN']=$unseen; }
+    if (!empty($recent)) { $hook_status['RECENT']=$recent; }
+    if (!empty($hook_status)) { 
+         $hook_status['MAILBOX']=$mailbox;
+         $hook_status['CALLER']='sqimap_status_messages';
+         do_hook_function('folder_status',$hook_status);
+    }
+    return $status;
 }
 
 
index 5f81aeb..684b34b 100755 (executable)
@@ -39,7 +39,7 @@ class mailboxes {
     var $mailboxname_full = '', $mailboxname_sub= '', $is_noselect = false, $is_noinferiors = false,
         $is_special = false, $is_root = false, $is_inbox = false, $is_sent = false,
         $is_trash = false, $is_draft = false,  $mbxs = array(),
-        $unseen = false, $total = false;
+        $unseen = false, $total = false, $recent = false;
 
     function addMbx($mbx, $delimiter, $start, $specialfirst) {
         $ary = explode($delimiter, $mbx->mailboxname_full);
@@ -1092,7 +1092,6 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false,$imap_stream) {
     $trail_del = false;
     $start = 0;
 
-
     if (isset($folder_prefix) && ($folder_prefix != '')) {
         $start = substr_count($folder_prefix,$delimiter);
         if (strrpos($folder_prefix, $delimiter) == (strlen($folder_prefix)-1)) {
@@ -1205,13 +1204,13 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
                 $mbx = $oMbx->mailboxname_full;
                 if ($unseen_type == 2 ||
                    ($move_to_trash && $oMbx->mailboxname_full == $trash_folder)) {
-                   $query = 'STATUS ' . sqimap_encode_mailbox_name($mbx) . ' (MESSAGES UNSEEN)';
+                   $query = 'STATUS ' . sqimap_encode_mailbox_name($mbx) . ' (MESSAGES UNSEEN RECENT)';
                 } else {
-                   $query = 'STATUS ' . sqimap_encode_mailbox_name($mbx) . ' (UNSEEN)';
+                   $query = 'STATUS ' . sqimap_encode_mailbox_name($mbx) . ' (UNSEEN RECENT)';
                 }
                 sqimap_prepare_pipelined_query($query,$tag,$aQuery,false);
             } else {
-                $oMbx->unseen = $oMbx->total = false;
+                $oMbx->unseen = $oMbx->total = $oMbx->recent = false;
                 $tag = false;
             }
             $oMbx->tag = $tag;
@@ -1231,6 +1230,10 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
                 if (preg_match('/MESSAGES\s+([0-9]+)/i', $sResponse, $regs)) {
                     $oMbx->total = $regs[1];
                 }
+                if (preg_match('/RECENT\s+([0-9]+)/i', $sResponse, $regs)) {
+                    $oMbx->recent = $regs[1];
+                }
+
            }
            unset($oMbx->tag);
         }
@@ -1245,6 +1248,7 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
                     $aStatus = sqimap_status_messages($imap_stream,$oMbx->mailboxname_full);
                     $oMbx->unseen = $aStatus['UNSEEN'];
                     $oMbx->total  = $aStatus['MESSAGES'];
+                    $oMbx->recent = $aStatus['RECENT'];
                 } else {
                     $oMbx->unseen = sqimap_unseen_messages($imap_stream,$oMbx->mailboxname_full);
                 }
@@ -1260,6 +1264,21 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
             }
         }
     }
+
+    $cnt = count($aMbxs);
+    for($i=0;$i<$cnt;++$i) {
+         $oMbx =& $aMbxs[$i];
+         unset($hook_status);
+         if (!empty($oMbx->unseen)) { $hook_status['UNSEEN']=$oMbx->unseen; }
+         if (!empty($oMbx->total)) { $hook_status['MESSAGES']=$oMbx->total; }
+         if (!empty($oMbx->recent)) { $hook_status['RECENT']=$oMbx->recent; }
+         if (!empty($hook_status))
+         {
+              $hook_status['MAILBOX']=$oMbx->mailboxname_full;
+              $hook_status['CALLER']='sqimap_get_status_mbx_tree'; // helps w/ debugging
+              do_hook_function('folder_status',$hook_status);
+         }
+    }
 }
 
 /**
index 7470d78..ea01c2d 100644 (file)
@@ -14,9 +14,9 @@
 if (! defined('SM_PATH')) define('SM_PATH','../../');
 
 /** load globals */
-global $UseSeparateImapConnection, 
-    $AllowSpamFilters, $SpamFilters_YourHop, $SpamFilters_ShowCommercial, 
-    $SpamFilters_DNScache, $SpamFilters_BulkQuery, $SpamFilters_SharedCache, 
+global $UseSeparateImapConnection,
+    $AllowSpamFilters, $SpamFilters_YourHop, $SpamFilters_ShowCommercial,
+    $SpamFilters_DNScache, $SpamFilters_BulkQuery, $SpamFilters_SharedCache,
     $SpamFilters_CacheTTL;
 
 /** load default config */
@@ -59,6 +59,7 @@ function filters_init_hooks () {
     $squirrelmail_plugin_hooks['special_mailbox']['filters'] = 'filters_special_mailbox';
     $squirrelmail_plugin_hooks['rename_or_delete_folder']['filters'] = 'update_for_folder_hook';
     $squirrelmail_plugin_hooks['webmail_bottom']['filters'] = 'start_filters_hook';
+    $squirrelmail_plugin_hooks['folder_status']['filters'] = 'filters_folder_status';
 }
 
 /**
@@ -85,6 +86,22 @@ function filters_optpage_register_block() {
     }
 }
 
+/* Receive the status of the folder and do something with it */
+function filters_folder_status($statusarr) {
+
+       global $filter_inbox_count;
+       if (empty($filter_inbox_count)) $filter_inbox_count=0;
+
+    //echo "GOT HOOK<br><pre>";
+    //var_dump($statusarr);
+    //echo "</pre><br>\n";
+
+       if ($statusarr['MAILBOX'] == 'INBOX')
+    {
+     if (!empty($statusarr['MESSAGES'])) $filter_inbox_count=$statusarr['MESSAGES'];
+    }
+}
+
 /**
  * Saves the DNS Cache to disk
  * @access private
@@ -187,7 +204,7 @@ function filters_bulkquery($filters, $IPs) {
  */
 function start_filters() {
     global $imapServerAddress, $imapPort, $imap_stream, $imapConnection,
-           $UseSeparateImapConnection, $AllowSpamFilters;
+           $UseSeparateImapConnection, $AllowSpamFilters, $filter_inbox_count;
 
     sqgetGlobalVar('username', $username, SQ_SESSION);
     sqgetGlobalVar('key',      $key,      SQ_COOKIE);
@@ -216,9 +233,8 @@ function start_filters() {
     // Also check if we are forced to use a separate IMAP connection
     if ((!isset($imap_stream) && !isset($imapConnection)) ||
         $UseSeparateImapConnection ) {
-            $stream = sqimap_login($username, $key, $imapServerAddress,
-                                $imapPort, 10);
-            $previously_connected = false;
+        $stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, 10);
+        $previously_connected = false;
     } else if (isset($imapConnection)) {
         $stream = $imapConnection;
         $previously_connected = true;
@@ -226,9 +242,17 @@ function start_filters() {
         $previously_connected = true;
         $stream = $imap_stream;
     }
-    $aStatus = sqimap_status_messages ($stream, 'INBOX', array('MESSAGES'));
 
-    if ($aStatus['MESSAGES']) {
+    if (!isset($filter_inbox_count)) {
+        $aStatus = sqimap_status_messages ($stream, 'INBOX', array('MESSAGES'));
+        if (!empty($aStatus['MESSAGES'])) {
+            $filter_inbox_count=$aStatus['MESSAGES'];
+        } else {
+            $filter_inbox_count=0;
+        }
+    }
+
+    if ($filter_inbox_count > 0) {
         sqimap_mailbox_select($stream, 'INBOX');
         // Filter spam from inbox before we sort them into folders
         if ($AllowSpamFilters) {
index 9f60c21..a9536a0 100644 (file)
@@ -67,7 +67,6 @@ function newmail_sav_function() {
     if ( sqgetGlobalVar('submit_newmail', $submit, SQ_POST) ) {
         $media_enable = '';
         $media_popup = '';
-        $media_allbox = '';
         $media_recent = '';
         $media_changetitle = '';
         $media_sel = '';
@@ -76,7 +75,6 @@ function newmail_sav_function() {
 
         sqgetGlobalVar('media_enable',      $media_enable,      SQ_POST);
         sqgetGlobalVar('media_popup',       $media_popup,       SQ_POST);
-        sqgetGlobalVar('media_allbox',      $media_allbox,      SQ_POST);
         sqgetGlobalVar('media_recent',      $media_recent,      SQ_POST);
         sqgetGlobalVar('media_changetitle', $media_changetitle, SQ_POST);
         sqgetGlobalVar('popup_width',       $popup_width,       SQ_POST);
@@ -90,7 +88,6 @@ function newmail_sav_function() {
 
         setPref($data_dir,$username,'newmail_enable',$media_enable);
         setPref($data_dir,$username,'newmail_popup', $media_popup);
-        setPref($data_dir,$username,'newmail_allbox',$media_allbox);
         setPref($data_dir,$username,'newmail_recent',$media_recent);
         setPref($data_dir,$username,'newmail_changetitle',$media_changetitle);
         setPref($data_dir,$username,'newmail_popup_width',$popup_width);
@@ -139,13 +136,13 @@ function newmail_sav_function() {
  */
 function newmail_pref_function() {
     global $username,$data_dir;
-    global $newmail_media,$newmail_enable,$newmail_popup,$newmail_allbox;
+    global $newmail_media,$newmail_media_enable,$newmail_popup;
     global $newmail_recent, $newmail_changetitle;
     global $newmail_userfile_type, $newmail_userfile_name;
     global $newmail_popup_width, $newmail_popup_height;
 
     $newmail_recent = getPref($data_dir,$username,'newmail_recent');
-    $newmail_enable = getPref($data_dir,$username,'newmail_enable');
+    $newmail_media_enable = getPref($data_dir,$username,'newmail_enable');
     $newmail_media = getPref($data_dir, $username, 'newmail_media', '(none)');
     // remove full location from setting (since SM 1.5.1 plugin uses only filename).
     if ($newmail_media!='(none)')
@@ -154,7 +151,6 @@ function newmail_pref_function() {
     $newmail_popup = getPref($data_dir, $username, 'newmail_popup');
     $newmail_popup_width = getPref($data_dir, $username, 'newmail_popup_width',200);
     $newmail_popup_height = getPref($data_dir, $username, 'newmail_popup_height',130);
-    $newmail_allbox = getPref($data_dir, $username, 'newmail_allbox');
     $newmail_changetitle = getPref($data_dir, $username, 'newmail_changetitle');
 
     $newmail_userfile_type = getPref($data_dir, $username, 'newmail_userfile_type');
@@ -173,61 +169,53 @@ function newmail_set_loadinfo_function() {
     }
 }
 
+
+/* Receive the status of the folder and do something with it */
+function newmail_folder_status($statusarr) {
+    global $newmail_media_enable,$newmail_popup,$newmail_changetitle,$trash_folder,
+           $send_folder,$totalNewArr,$unseen_notify, $newmail_recent;
+
+    //echo "GOT HOOK<br><pre>";
+    //var_dump($statusarr);
+    //echo "</pre><br>\n";
+
+    $mailbox=$statusarr['MAILBOX'];
+    if ($newmail_media_enable == 'on' ||
+        $newmail_popup == 'on' ||
+        $newmail_changetitle == 'on') {
+
+        // Skip folders for Sent and Trash
+        if ($statusarr['MAILBOX'] == $send_folder || $statusarr['MAILBOX'] == $trash_folder) {
+            return 0;
+        }
+
+        if ((($mailbox == 'INBOX') && ($unseen_notify == 2)) || ($unseen_notify == 3)) {
+            if (($newmail_recent == 'on') && (!empty($statusarr['RECENT']))) {
+                $totalNewArr[$mailbox] = $statusarr['RECENT'];
+            } elseif ($newmail_recent != 'on' && !empty($statusarr['UNSEEN'])) {
+                $totalNewArr[$mailbox] = $statusarr['UNSEEN'];
+            }
+        }
+    }
+}
+
 /**
  * Insert needed data in left_main
  */
 function newmail_plugin_function() {
-    global $username, $newmail_media, $newmail_enable, $newmail_popup,
+    global $username, $newmail_media, $newmail_media_enable, $newmail_popup,
         $newmail_recent, $newmail_changetitle, $imapConnection, $PHP_SELF;
     global $newmail_mmedia, $newmail_allowsound;
     global $newmail_userfile_type;
     global $newmail_popup_width, $newmail_popup_height;
+    global $totalNewArr;
 
-    if ($newmail_enable == 'on' ||
+    if ($newmail_media_enable == 'on' ||
         $newmail_popup == 'on' ||
         $newmail_changetitle) {
 
-        // open a connection on the imap port (143)
-
-        $boxes = sqimap_mailbox_list($imapConnection);
-        $delimeter = sqimap_get_delimiter($imapConnection);
-
-        $status = 0;
-        $totalNew = 0;
-
-        for ($i = 0;$i < count($boxes); $i++) {
-
-            $mailbox = $boxes[$i]['formatted'];
-
-            if (! isset($boxes[$i]['unseen'])) {
-                $boxes[$i]['unseen'] = '';
-            }
-            if ($boxes[$i]['flags']) {
-                $noselect = false;
-                for ($h = 0; $h < count($boxes[$i]['flags']); $h++) {
-                    if (strtolower($boxes[$i]["flags"][$h]) == 'noselect') {
-                        $noselect = TRUE;
-                    }
-                }
-                if (! $noselect) {
-                    $status += CheckNewMailboxSound($imapConnection,
-                                                    $mailbox,
-                                                    $boxes[$i]['unformatted'],
-                                                    $delimeter,
-                                                    $boxes[$i]['unseen'],
-                                                    $totalNew);
-                }
-            } else {
-                $status += CheckNewMailboxSound($imapConnection,
-                                                $mailbox,
-                                                $boxes[$i]['unformatted'],
-                                                $delimeter,
-                                                $boxes[$i]['unseen'],
-                                                $totalNew);
-            }
-        }
-
-        // sqimap_logout($imapConnection);
+        if (!empty($totalNewArr)) { $totalNew=array_sum($totalNewArr); }
+        else { $totalNew=0; }
 
         // If we found unseen messages, then we
         // will play the sound as follows:
@@ -238,7 +226,7 @@ function newmail_plugin_function() {
             echo 'window.parent.document.title = "' .
                 sprintf(ngettext("%s New Message","%s New Messages",$totalNew), $totalNew) .
                 "\";\n";
-            echo    "if (BeforeChangeTitle != null)\n".
+            echo "if (BeforeChangeTitle != null)\n".
                 "BeforeChangeTitle();\n".
                 "}\n".
                 "BeforeChangeTitle = window.onload;\n".
@@ -247,7 +235,9 @@ function newmail_plugin_function() {
         }
 
         // create media output if there are new email messages
-        if ($newmail_allowsound && $totalNew > 0 && $newmail_enable == 'on' && $newmail_media != '' ) {
+        if ($newmail_allowsound && $totalNew > 0
+            && $newmail_media_enable == 'on'
+            && $newmail_media != '' ) {
             echo newmail_create_media_tags($newmail_media);
         }
 
@@ -274,45 +264,7 @@ function newmail_plugin_function() {
 
 // ----- end of hooked functions -----
 
-/**
- * Checks if mailbox contains new messages.
- *
- * @param stream $imapConnection
- * @param string $mailbox FIXME: option is not used
- * @param string $real_box unformated mailbox name
- * @param string $delimeter FIXME: option is not used
- * @param string $unseen FIXME: option is not used
- * @param integer $total_new number of new messages
- * @return bool true, if there are new messages
- */
-function CheckNewMailboxSound($imapConnection, $mailbox, $real_box, $delimeter, $unseen, &$total_new) {
-    global $trash_folder, $sent_folder,
-        $unseen_notify, $newmail_allbox,
-        $newmail_recent;
 
-    $mailboxURL = urlencode($real_box);
-
-    // Skip folders for Sent and Trash
-    if ($real_box == $sent_folder ||
-        $real_box == $trash_folder) {
-        return 0;
-    }
-
-    if (($unseen_notify == 2 && $real_box == 'INBOX') ||
-        ($unseen_notify == 3 && ($newmail_allbox == 'on' ||
-                                 $real_box == 'INBOX'))) {
-        $status = sqimap_status_messages( $imapConnection, $real_box);
-        if($newmail_recent == 'on') {
-            $total_new += $status['RECENT'];
-        } else {
-            $total_new += $status['UNSEEN'];
-        }
-        if ($total_new) {
-            return 1;
-        }
-    }
-    return 0;
-}
 
 /**
  * Function tries to detect if file contents match declared file type
@@ -520,7 +472,7 @@ function newmail_media_object($object,$type,$path,$args=array(),$addsuffix=true)
  * @param array $args media object attributes
  * @param bool $addsuffix controls addition of suffix to media object url
  * @return string object html tags and attributes required by selected media type.
- * @todo add ogg and svg support 
+ * @todo add ogg and svg support
  */
 function newmail_media_object_ie($object,$type,$path,$args=array(),$addsuffix) {
     $ret_ie='';
index eb798bf..1839000 100644 (file)
@@ -35,9 +35,7 @@ echo html_tag( 'table', '', 'center', $color[0], 'width="95%" cellpadding="1" ce
                     html_tag( 'tr' ) . "\n" .
                         html_tag( 'td', '', 'left', $color[4] ) . "<br />\n";
 
-echo html_tag( 'p',
-        sprintf(_("The %s option will check ALL of your folders for unseen mail, not just the inbox for notification."), '&quot;'._("Check all boxes, not just INBOX").'&quot;')
-     ) . "\n" .
+echo html_tag( 'p',"The NewMail plugin will follow the Folder Preferences option &quot;Enable Unread Message Notification&quot;") . "\n" .
      html_tag( 'p',
         sprintf(_("Selecting the %s option will enable the showing of a popup window when unseen mail is in your folders (requires JavaScript)."), '&quot;'._("Show popup window on new mail").'&quot;')
      ) . "\n" .
@@ -63,16 +61,6 @@ echo '</td></tr>' .
 echo '<form action="'.sqm_baseuri().'src/options.php" method="post" enctype="multipart/form-data">' . "\n" .
         html_tag( 'table', '', '', '', 'width="100%" cellpadding="5" cellspacing="0" border="0"' ) . "\n";
 
-// Option: media_allbox
-echo html_tag( 'tr' ) .
-        html_tag( 'td', _("Check all boxes, not just INBOX").':', 'right', '', 'style="white-space: nowrap;"' ) .
-            html_tag( 'td', '', 'left' ) .
-                '<input type="checkbox" ';
-if ($newmail_allbox == 'on') {
-    echo 'checked="checked" ';
-}
-echo 'name="media_allbox" /></td></tr>' . "\n";
-
 // Option: media_recent
 echo html_tag( 'tr' ) .
         html_tag( 'td', _("Count only messages that are RECENT").':', 'right', '', 'style="white-space: nowrap;"' ) .
index 4c14947..8b38414 100644 (file)
@@ -35,8 +35,11 @@ if (! defined('SM_PATH')) define('SM_PATH','../../');
  */
 function squirrelmail_plugin_init_newmail() {
     global $squirrelmail_plugin_hooks;
+    $totalNewArr=array();
+    global $totalNewArr;
 
-    $squirrelmail_plugin_hooks['left_main_before']['newmail'] = 'newmail_plugin';
+    $squirrelmail_plugin_hooks['folder_status']['newmail'] = 'newmail_folder_status';
+    $squirrelmail_plugin_hooks['left_main_after']['newmail'] = 'newmail_plugin';
     $squirrelmail_plugin_hooks['optpage_register_block']['newmail'] = 'newmail_optpage_register_block';
     $squirrelmail_plugin_hooks['options_save']['newmail'] = 'newmail_sav';
     $squirrelmail_plugin_hooks['loading_prefs']['newmail'] = 'newmail_pref';
@@ -84,4 +87,4 @@ function newmail_plugin() {
     include_once(SM_PATH . 'plugins/newmail/functions.php');
     newmail_plugin_function();
 }
-?>
\ No newline at end of file
+?>
index e90c594..646d664 100644 (file)
@@ -42,7 +42,7 @@ define('SM_BOX_COLLAPSED',   1);
 function ListBoxes ($boxes, $j=0 ) {
     global $data_dir, $username, $color, $unseen_notify, $unseen_type,
            $move_to_trash, $trash_folder, $collapse_folders, $imapConnection,
-           $use_icons, $icon_theme, $use_special_folder_color;
+           $use_icons, $icon_theme, $use_special_folder_color, $unseen_cum;
 
     // stop condition
     if (empty($boxes)) {
@@ -61,34 +61,38 @@ function ListBoxes ($boxes, $j=0 ) {
 
     /* get unseen/total messages information */
     /* Only need to display info when option is set */
-    if (isset($unseen_notify) && ($unseen_notify > 1) &&
-        (($boxes->unseen !== false) || ($boxes->total !== false))) {
-
-        if ($boxes->unseen !== false)
-            $unseen = $boxes->unseen;
-
-        /*
-            Should only display unseen info if the folder is inbox
-            or you set the option for all folders
-        */
-
-        if ((strtolower($mailbox) == 'inbox') || ($unseen_notify == 3)) {
-            $unseen_string = $unseen;
-
-            /* If users requests, display message count too */
-            if (isset($unseen_type) && ($unseen_type == 2) && ($boxes->total !== false)) {
-                $unseen_string .= '/' . $boxes->total;
+    if (isset($unseen_notify) && ($unseen_notify > 1)) {
+        /* handle Cumulative Unread Message Notification */
+        if ($collapse && $unseen_cum) {
+            foreach ($boxes->mbxs as $cumn_box) {
+                if (!empty($cumn_box->unseen)) $boxes->unseen += $cumn_box->unseen;
+                if (!empty($cumn_box->total)) $boxes->total += $cumn_box->total;
+            }
+        }
+        if (($boxes->unseen !== false) || ($boxes->total !== false)) {
+            if ($boxes->unseen !== false) {
+                $unseen = $boxes->unseen;
             }
-
-            $unseen_string = "<span class=\"leftunseen\">($unseen_string)</span>";
-
             /*
-                Finally allow the script to display the values by setting a boolean.
-                This can only occur if the unseen count is great than 0 (if you have
-                unseen count only), or you have the message count too.
-            */
-            if (($unseen > 0) || (isset($unseen_type) && ($unseen_type ==2))) {
-                $unseen_found = true;
+             * Should only display unseen info if the folder is inbox
+             * or you set the option for all folders
+             */
+            if ((strtolower($mailbox) == 'inbox') || ($unseen_notify == 3)) {
+                $unseen_string = $unseen;
+                /* If users requests, display message count too */
+                if (isset($unseen_type) && ($unseen_type == 2) && ($boxes->total !== false)) {
+                    $unseen_string .= '/' . $boxes->total;
+                }
+                $unseen_string = "<span class=\"leftunseen\">($unseen_string)</span>";
+
+                /*
+                 * Finally allow the script to display the values by setting a boolean.
+                 * This can only occur if the unseen count is great than 0 (if you have
+                 * unseen count only), or you have the message count too.
+                 */
+                if (($unseen > 0) || (isset($unseen_type) && ($unseen_type ==2))) {
+                    $unseen_found = true;
+                }
             }
         }
     }
@@ -96,7 +100,6 @@ function ListBoxes ($boxes, $j=0 ) {
     if (isset($boxes->mbxs[0]) && $collapse_folders) {
         $collapse = getPref($data_dir, $username, 'collapse_folder_' . $mailbox);
         $collapse = ($collapse == '' ? SM_BOX_UNCOLLAPSED : $collapse);
-
         $link = '<a target="left" style="text-decoration:none" ' .'href="left_main.php?';
         if ($collapse) {
             if ($use_icons && $icon_theme != 'none') {
@@ -193,7 +196,7 @@ function ListBoxes ($boxes, $j=0 ) {
 }
 
 function ListAdvancedBoxes ($boxes, $mbx, $j='ID.0000' ) {
-    global $data_dir, $username, $color, $unseen_notify, $unseen_type,
+    global $data_dir, $username, $color, $unseen_notify, $unseen_type, $unseen_cum,
         $move_to_trash, $trash_folder, $collapse_folders, $use_special_folder_color;
 
     if (empty($boxes)) {
@@ -212,36 +215,58 @@ function ListAdvancedBoxes ($boxes, $mbx, $j='ID.0000' ) {
     $mailbox = $boxes->mailboxname_full;
     $mailboxURL = urlencode($mailbox);
 
+     /* get collapse information */
+     if ($collapse_folders) {
+          $form_entry = $j.'F';
+          if (isset($mbx) && isset($mbx[$form_entry])) {
+              $collapse = $mbx[$form_entry];
+              setPref($data_dir, $username, 'collapse_folder_'.$boxes->mailboxname_full ,
+                    $collapse ? SM_BOX_COLLAPSED : SM_BOX_UNCOLLAPSED);
+          } else {
+              $collapse = getPref($data_dir, $username, 'collapse_folder_' . $mailbox);
+              $collapse = ($collapse == '' ? SM_BOX_UNCOLLAPSED : $collapse);
+          }
+          $img_src = ($collapse ? '../images/plus.png' : '../images/minus.png');
+          $collapse_link = '<a href="javascript:void(0)">' .
+                    " <img src=\"$img_src\" border=\"1\" id=$j onclick=\"hidechilds(this)\" style=\"cursor:hand\" /></a>";
+    } else {
+         $collapse_link='';
+    }
+
     /* get unseen/total messages information */
     /* Only need to display info when option is set */
-    if (isset($unseen_notify) && ($unseen_notify > 1) &&
-        (($boxes->unseen !== false) || ($boxes->total !== false))) {
-
-        if ($boxes->unseen !== false)
-            $unseen = $boxes->unseen;
-
-        /*
-            Should only display unseen info if the folder is inbox
-            or you set the option for all folders
-        */
-
-        if ((strtolower($mailbox) == 'inbox') || ($unseen_notify == 3)) {
-            $unseen_string = $unseen;
-
-            /* If users requests, display message count too */
-            if (isset($unseen_type) && ($unseen_type == 2) && ($boxes->total !== false)) {
-                $unseen_string .= '/' . $boxes->total;
+    if (isset($unseen_notify) && ($unseen_notify > 1)) {
+        /* handle Cumulative Unread Message Notification */
+        if ($collapse && $unseen_cum) {
+            foreach ($boxes->mbxs as $cumn_box) {
+                if (!empty($cumn_box->unseen)) $boxes->unseen += $cumn_box->unseen;
+                if (!empty($cumn_box->total)) $boxes->total += $cumn_box->total;
             }
-
-            $unseen_string = "<span class=\"leftunseen\">($unseen_string)</span>";
-
-            /*
-                Finally allow the script to display the values by setting a boolean.
-                This can only occur if the unseen count is great than 0 (if you have
-                unseen count only), or you have the message count too.
-            */
-            if (($unseen > 0) || (isset($unseen_type) && ($unseen_type ==2))) {
-                $unseen_found = true;
+        }
+        if (($boxes->unseen !== false) || ($boxes->total !== false)) {
+            if ($boxes->unseen !== false)     $unseen = $boxes->unseen;
+               /*
+                * Should only display unseen info if the folder is inbox
+                * or you set the option for all folders
+                */
+                if ((strtolower($mailbox) == 'inbox') || ($unseen_notify == 3)) {
+                     $unseen_string = $unseen;
+
+                    /* If users requests, display message count too */
+                    if (isset($unseen_type) && ($unseen_type == 2) && ($boxes->total !== false)) {
+                        $unseen_string .= '/' . $boxes->total;
+                    }
+
+                    $unseen_string = "<font color=\"$color[11]\">($unseen_string)</font>";
+
+                    /*
+                     * Finally allow the script to display the values by setting a boolean.
+                     * This can only occur if the unseen count is great than 0 (if you have
+                     * unseen count only), or you have the message count too.
+                     */
+                     if (($unseen > 0) || (isset($unseen_type) && ($unseen_type ==2))) {
+                         $unseen_found = true;
+                     }
             }
         }
     }
@@ -310,23 +335,7 @@ function ListAdvancedBoxes ($boxes, $mbx, $j='ID.0000' ) {
                                 $end,
                             'left', '', 'class="mbx_sub" id="' .$j. '"' ) . "\n";
         } else {
-            /* get collapse information */
-            if ($collapse_folders) {
-                $form_entry = $j.'F';
-                if (isset($mbx) && isset($mbx[$form_entry])) {
-                    $collapse = $mbx[$form_entry];
-                    setPref($data_dir, $username, 'collapse_folder_'.$boxes->mailboxname_full ,
-                        $collapse ? SM_BOX_COLLAPSED : SM_BOX_UNCOLLAPSED);
-                } else {
-                    $collapse = getPref($data_dir, $username, 'collapse_folder_' . $mailbox);
-                    $collapse = ($collapse == '' ? SM_BOX_UNCOLLAPSED : $collapse);
-                }
-                $img_src = ($collapse ? '../images/plus.png' : '../images/minus.png');
-                $collapse_link = '<a href="javascript:void(0)">' .
-                    " <img src=\"$img_src\" border=\"1\" id=$j onclick=\"hidechilds(this)\" style=\"cursor:hand\" /></a>";
-            } else {
-                 $collapse_link='';
-            }
+
             echo '   ' . html_tag( 'div',
                             $collapse_link . $pre . $folder_img . '&nbsp;'. $boxes->mailboxname_sub . $end ,
                             'left', '', 'class="mbx_par" id="' .$j. 'P"' ) . "\n";