From 0b5539e3dc4e9f1f651defc9633d284ed3a950b5 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 06 Dec 2008 13:52:18 -0500
Subject: [PATCH] - Fix sorting of folders with more than 2 levels (#1485569)

---
 CHANGELOG                        |    4 ++++
 program/include/rcube_imap.php   |   31 +++++++++++++++++++++----------
 program/include/rcube_config.php |    9 +++++----
 3 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 653bf0c..369b1f7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+2008/12/06 (alec)
+----------
+- Fix sorting of folders with more than 2 levels (#1485569)
+
 2008/12/04 (alec)
 ----------
 - Added 'show_images' option, removed 'addrbook_show_images' (#1485597)
diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php
index 1b15949..7903407 100644
--- a/program/include/rcube_config.php
+++ b/program/include/rcube_config.php
@@ -75,12 +75,13 @@
     $this->prop['log_dir'] = $this->prop['log_dir'] ? unslashify($this->prop['log_dir']) : INSTALL_PATH . 'logs';
     $this->prop['temp_dir'] = $this->prop['temp_dir'] ? unslashify($this->prop['temp_dir']) : INSTALL_PATH . 'temp';
 
-    // fix default imap folders encode
-    foreach (Array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox') as $folder)
+    // fix default imap folders encoding
+    foreach (array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox') as $folder)
       $this->prop[$folder] = rcube_charset_convert($this->prop[$folder], RCMAIL_CHARSET, 'UTF-7');
 
-    foreach ($this->prop['default_imap_folders'] as $n => $folder)
-      $this->prop['default_imap_folders'][$n] = rcube_charset_convert($folder, RCMAIL_CHARSET, 'UTF-7');
+    if (!empty($this->prop['default_imap_folders']))
+      foreach ($this->prop['default_imap_folders'] as $n => $folder)
+        $this->prop['default_imap_folders'][$n] = rcube_charset_convert($folder, RCMAIL_CHARSET, 'UTF-7');
 
     // set PHP error logging according to config
     if ($this->prop['debug_level'] & 1) {
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 8b703b9..c9cca72 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2711,32 +2711,43 @@
         $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF-7'));
       }
 
+    // sort folders and place defaults on the top
     asort($folders, SORT_LOCALE_STRING);
     ksort($a_defaults);
-
     $folders = array_merge($a_defaults, array_keys($folders));
 
     // finally we must rebuild the list to move 
     // subfolders of default folders to their place...
     // ...also do this for the rest of folders because
     // asort() is not properly sorting case sensitive names
-
-    // set the type of folder name variable (#1485527) 
     while (list($key, $folder) = each($folders)) {
+      // set the type of folder name variable (#1485527) 
       $a_out[] = (string) $folder;
       unset($folders[$key]);
-      foreach ($folders as $idx => $f) {
-	if (strpos($f, $folder.$delimiter) === 0) {
-    	  $a_out[] = (string) $f;
-	  unset($folders[$idx]);
-	  }
-        }
-      reset($folders);  
+      $this->_rsort($folder, $delimiter, $folders, $a_out);	
       }
 
     return $a_out;
     }
 
+
+  /**
+   * @access private
+   */
+  function _rsort($folder, $delimiter, &$list, &$out)
+    {
+      while (list($key, $name) = each($list)) {
+	if (strpos($name, $folder.$delimiter) === 0) {
+	  // set the type of folder name variable (#1485527) 
+    	  $out[] = (string) $name;
+	  unset($list[$key]);
+	  $this->_rsort($name, $delimiter, $list, $out);
+	  }
+        }
+      reset($list);	
+    }
+
+
   /**
    * @access private
    */

--
Gitblit v1.9.1