From 6bfc97da869ca180d2f5fee01c9ff503cb47b1bd Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <fox@fakecake.org>
Date: Fri, 26 Apr 2013 10:31:57 +0400
Subject: [PATCH] add automatic timezone (based on client tz offset)

---
 classes/rpc.php       |  1 +
 include/functions.php | 17 +++++++++++------
 js/prefs.js           |  5 ++++-
 js/tt-rss.js          |  2 ++
 lib/timezones.txt     |  1 +
 5 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/classes/rpc.php b/classes/rpc.php
index 750aa2cb1..62d884673 100644
--- a/classes/rpc.php
+++ b/classes/rpc.php
@@ -334,6 +334,7 @@ class RPC extends Handler_Protected {
 		$_SESSION["hasAudio"] = $_REQUEST["hasAudio"] === "true";
 		$_SESSION["hasSandbox"] = $_REQUEST["hasSandbox"] === "true";
 		$_SESSION["hasMp3"] = $_REQUEST["hasMp3"] === "true";
+		$_SESSION["clientTzOffset"] = $_REQUEST["clientTzOffset"];
 
 		$reply = array();
 
diff --git a/include/functions.php b/include/functions.php
index b54187e18..4272c649d 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -862,13 +862,18 @@
 
 		$user_tz_string = get_pref('USER_TIMEZONE', $owner_uid);
 
-		try {
-			if (!$user_tz) $user_tz = new DateTimeZone($user_tz_string);
-		} catch (Exception $e) {
-			$user_tz = $utc_tz;
-		}
+		if ($user_tz_string != 'Automatic') {
 
-		$tz_offset = $user_tz->getOffset($dt);
+			try {
+				if (!$user_tz) $user_tz = new DateTimeZone($user_tz_string);
+			} catch (Exception $e) {
+				$user_tz = $utc_tz;
+			}
+
+			$tz_offset = $user_tz->getOffset($dt);
+		} else {
+			$tz_offset = (int) $_SESSION["clientTzOffset"];
+		}
 
 		$user_timestamp = $dt->format('U') + $tz_offset;
 
diff --git a/js/prefs.js b/js/prefs.js
index 8612b70fb..431a1fe84 100644
--- a/js/prefs.js
+++ b/js/prefs.js
@@ -962,8 +962,11 @@ function init() {
 		dojo.addOnLoad(function() {
 			loading_set_progress(50);
 
+			var clientTzOffset = new Date().getTimezoneOffset() * 60;
+
 			new Ajax.Request("backend.php", {
-				parameters: {op: "rpc", method: "sanityCheck"},
+				parameters: {op: "rpc", method: "sanityCheck",
+				 	clientTzOffset: clientTzOffset },
 					onComplete: function(transport) {
 					backend_sanity_check_callback(transport);
 				} });
diff --git a/js/tt-rss.js b/js/tt-rss.js
index 88a360f99..a7518959c 100644
--- a/js/tt-rss.js
+++ b/js/tt-rss.js
@@ -256,10 +256,12 @@ function init() {
 		var hasAudio = !!a.canPlayType;
 		var hasSandbox = "sandbox" in document.createElement("iframe");
 		var hasMp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, ''));
+		var clientTzOffset = new Date().getTimezoneOffset() * 60;
 
 		new Ajax.Request("backend.php",	{
 			parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio,
 				hasMp3: hasMp3,
+			 	clientTzOffset: clientTzOffset,
 				hasSandbox: hasSandbox},
 			onComplete: function(transport) {
 					backend_sanity_check_callback(transport);
diff --git a/lib/timezones.txt b/lib/timezones.txt
index 66824ec93..58108f031 100644
--- a/lib/timezones.txt
+++ b/lib/timezones.txt
@@ -1,3 +1,4 @@
+Automatic
 Africa/Abidjan
 Africa/Accra
 Africa/Addis_Ababa
-- 
GitLab