Index: /trunk/roundcubemail/CHANGELOG
===================================================================
--- /trunk/roundcubemail/CHANGELOG	(revision 2125)
+++ /trunk/roundcubemail/CHANGELOG	(revision 2126)
@@ -1,4 +1,8 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
+
+2008/12/06 (alec)
+----------
+- Fix sorting of folders with more than 2 levels (#1485569)
 
 2008/12/04 (alec)
Index: /trunk/roundcubemail/program/include/rcube_config.php
===================================================================
--- /trunk/roundcubemail/program/include/rcube_config.php	(revision 2125)
+++ /trunk/roundcubemail/program/include/rcube_config.php	(revision 2126)
@@ -76,10 +76,11 @@
     $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
Index: /trunk/roundcubemail/program/include/rcube_imap.php
===================================================================
--- /trunk/roundcubemail/program/include/rcube_imap.php	(revision 2125)
+++ /trunk/roundcubemail/program/include/rcube_imap.php	(revision 2126)
@@ -2712,7 +2712,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));
 
@@ -2721,20 +2721,31 @@
     // ...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]);
+      $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($folders);  
-      }
-
-    return $a_out;
-    }
+      reset($list);	
+    }
+
 
   /**
