From 2441264d00cce5cc3de0dd3923c9226f56bab5ca Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Wed, 28 May 2014 04:37:24 -0400
Subject: [PATCH] Improved folders sorting by name - use Intl.Collator if supported

---
 program/include/rcmail_output_html.php |    1 +
 program/js/app.js                      |   41 +++++++++++++++++++++++++----------------
 2 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php
index 2a90f6a..43d73a6 100644
--- a/program/include/rcmail_output_html.php
+++ b/program/include/rcmail_output_html.php
@@ -68,6 +68,7 @@
         $this->set_env('task', $task);
         $this->set_env('x_frame_options', $this->config->get('x_frame_options', 'sameorigin'));
         $this->set_env('standard_windows', (bool) $this->config->get('standard_windows'));
+        $this->set_env('locale', $_SESSION['language']);
 
         // add cookie info
         $this->set_env('cookie_domain', ini_get('session.cookie_domain'));
diff --git a/program/js/app.js b/program/js/app.js
index 670a8e0..670e78b 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -5898,7 +5898,8 @@
     if (!this.gui_objects.subscriptionlist)
       return false;
 
-    var row, n, i, tmp, tmp_name, rowid, folders = [], list = [], slist = [],
+    var row, n, i, tmp, tmp_name, rowid, collator,
+      folders = [], list = [], slist = [],
       tbody = this.gui_objects.subscriptionlist.tBodies[0],
       refrow = $('tr', tbody).get(1),
       id = 'rcmrow'+((new Date).getTime());
@@ -5925,24 +5926,32 @@
     // add to folder/row-ID map
     this.env.subscriptionrows[id] = [name, display_name, false];
 
-    // sort folders (to find a place where to insert the row)
-    // replace delimiter with \0 character to fix sorting
-    // issue where 'Abc Abc' would be placed before 'Abc/def'
-    var replace_from = RegExp(RegExp.escape(this.env.delimiter), 'g'),
-      replace_to = String.fromCharCode(0);
+    // copy folders data to an array for sorting
+    $.each(this.env.subscriptionrows, function(k, v) { folders.push(v); });
 
-    $.each(this.env.subscriptionrows, function(k,v) {
-      if (v.length < 4) {
-        var n = v[0];
-        n = n.replace(replace_from, replace_to);
-        v.push(n);
-      }
-      folders.push(v);
-    });
+    try {
+      // use collator if supported (FF29, IE11, Opera15, Chrome24)
+      collator = new Intl.Collator(this.env.locale.replace('_', '-'));
+    }
+    catch (e) {};
 
+    // sort folders
     folders.sort(function(a, b) {
-      var len = a.length - 1; n1 = a[len], n2 = b[len];
-      return n1 < n2 ? -1 : 1;
+      var i, f1, f2,
+        path1 = a[0].split(ref.env.delimiter),
+        path2 = b[0].split(ref.env.delimiter);
+
+      for (i=0; i<path1.length; i++) {
+        f1 = path1[i];
+        f2 = path2[i];
+
+        if (f1 !== f2) {
+          if (collator)
+            return collator.compare(f1, f2);
+          else
+            return f1 < f2 ? -1 : 1;
+        }
+      }
     });
 
     for (n in folders) {

--
Gitblit v1.9.1