From 028e2a17affd0df163908e97db32ca58661f9730 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Sun, 08 Sep 2013 09:36:16 -0400
Subject: [PATCH] Merge branch 'master' of github.com:roundcube/roundcubemail

---
 CHANGELOG                              |    1 
 program/lib/Roundcube/rcube_config.php |   63 +++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 38b96ee..5d68969 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Workaround broken PHP function timezone_name_from_abbr (#1489261)
 - Fix error_reporting directive check (#1489323)
 - Make cached message size limit configurable - messages_cache_threshold (#1489317)
 - Log also failed logins to userlogins log
diff --git a/program/lib/Roundcube/rcube_config.php b/program/lib/Roundcube/rcube_config.php
index 781f8a7..ac3ea67 100644
--- a/program/lib/Roundcube/rcube_config.php
+++ b/program/lib/Roundcube/rcube_config.php
@@ -529,7 +529,7 @@
 
         // convert deprecated numeric timezone value
         if (isset($props['timezone']) && is_numeric($props['timezone'])) {
-            if ($tz = timezone_name_from_abbr("", $props['timezone'] * 3600, 0)) {
+            if ($tz = self::timezone_name_from_abbr($props['timezone'])) {
                 $props['timezone'] = $tz;
             }
             else {
@@ -539,4 +539,65 @@
 
         return $props;
     }
+
+    /**
+     * timezone_name_from_abbr() replacement. Converts timezone offset
+     * into timezone name abbreviation.
+     *
+     * @param float $offset Timezone offset (in hours)
+     *
+     * @return string Timezone abbreviation
+     */
+    static public function timezone_name_from_abbr($offset)
+    {
+        // List of timezones here is not complete - https://bugs.php.net/bug.php?id=44780
+        if ($tz = timezone_name_from_abbr('', $offset * 3600, 0)) {
+            return $tz;
+        }
+
+        // try with more complete list (#1489261)
+        $timezones = array(
+            '-660' => "Pacific/Apia",
+            '-600' => "Pacific/Honolulu",
+            '-570' => "Pacific/Marquesas",
+            '-540' => "America/Anchorage",
+            '-480' => "America/Los_Angeles",
+            '-420' => "America/Denver",
+            '-360' => "America/Chicago",
+            '-300' => "America/New_York",
+            '-270' => "America/Caracas",
+            '-240' => "America/Halifax",
+            '-210' => "Canada/Newfoundland",
+            '-180' => "America/Sao_Paulo",
+             '-60' => "Atlantic/Azores",
+               '0' => "Europe/London",
+              '60' => "Europe/Paris",
+             '120' => "Europe/Helsinki",
+             '180' => "Europe/Moscow",
+             '210' => "Asia/Tehran",
+             '240' => "Asia/Dubai",
+             '300' => "Asia/Karachi",
+             '270' => "Asia/Kabul",
+             '300' => "Asia/Karachi",
+             '330' => "Asia/Kolkata",
+             '345' => "Asia/Katmandu",
+             '360' => "Asia/Yekaterinburg",
+             '390' => "Asia/Rangoon",
+             '420' => "Asia/Krasnoyarsk",
+             '480' => "Asia/Shanghai",
+             '525' => "Australia/Eucla",
+             '540' => "Asia/Tokyo",
+             '570' => "Australia/Adelaide",
+             '600' => "Australia/Melbourne",
+             '630' => "Australia/Lord_Howe",
+             '660' => "Asia/Vladivostok",
+             '690' => "Pacific/Norfolk",
+             '720' => "Pacific/Auckland",
+             '765' => "Pacific/Chatham",
+             '780' => "Pacific/Enderbury",
+             '840' => "Pacific/Kiritimati",
+        );
+
+        return $timezones[(string) intval($offset * 60)];
+    }
 }

--
Gitblit v1.9.1