summaryrefslogtreecommitdiffstatshomepage
path: root/core/misc/timezone.js
diff options
context:
space:
mode:
Diffstat (limited to 'core/misc/timezone.js')
-rw-r--r--core/misc/timezone.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/core/misc/timezone.js b/core/misc/timezone.js
new file mode 100644
index 00000000000..54497304036
--- /dev/null
+++ b/core/misc/timezone.js
@@ -0,0 +1,66 @@
+(function ($) {
+
+/**
+ * Set the client's system time zone as default values of form fields.
+ */
+Drupal.behaviors.setTimezone = {
+ attach: function (context, settings) {
+ $('select.timezone-detect', context).once('timezone', function () {
+ var dateString = Date();
+ // In some client environments, date strings include a time zone
+ // abbreviation, between 3 and 5 letters enclosed in parentheses,
+ // which can be interpreted by PHP.
+ var matches = dateString.match(/\(([A-Z]{3,5})\)/);
+ var abbreviation = matches ? matches[1] : 0;
+
+ // For all other client environments, the abbreviation is set to "0"
+ // and the current offset from UTC and daylight saving time status are
+ // used to guess the time zone.
+ var dateNow = new Date();
+ var offsetNow = dateNow.getTimezoneOffset() * -60;
+
+ // Use January 1 and July 1 as test dates for determining daylight
+ // saving time status by comparing their offsets.
+ var dateJan = new Date(dateNow.getFullYear(), 0, 1, 12, 0, 0, 0);
+ var dateJul = new Date(dateNow.getFullYear(), 6, 1, 12, 0, 0, 0);
+ var offsetJan = dateJan.getTimezoneOffset() * -60;
+ var offsetJul = dateJul.getTimezoneOffset() * -60;
+
+ var isDaylightSavingTime;
+ // If the offset from UTC is identical on January 1 and July 1,
+ // assume daylight saving time is not used in this time zone.
+ if (offsetJan == offsetJul) {
+ isDaylightSavingTime = '';
+ }
+ // If the maximum annual offset is equivalent to the current offset,
+ // assume daylight saving time is in effect.
+ else if (Math.max(offsetJan, offsetJul) == offsetNow) {
+ isDaylightSavingTime = 1;
+ }
+ // Otherwise, assume daylight saving time is not in effect.
+ else {
+ isDaylightSavingTime = 0;
+ }
+
+ // Submit request to the system/timezone callback and set the form field
+ // to the response time zone. The client date is passed to the callback
+ // for debugging purposes. Submit a synchronous request to avoid database
+ // errors associated with concurrent requests during install.
+ var path = 'system/timezone/' + abbreviation + '/' + offsetNow + '/' + isDaylightSavingTime;
+ var element = this;
+ $.ajax({
+ async: false,
+ url: settings.basePath,
+ data: { q: path, date: dateString },
+ dataType: 'json',
+ success: function (data) {
+ if (data) {
+ $(element).val(data);
+ }
+ }
+ });
+ });
+ }
+};
+
+})(jQuery);