|
1 (function ($) { |
|
2 |
|
3 /** |
|
4 * Set the client's system time zone as default values of form fields. |
|
5 */ |
|
6 Drupal.behaviors.setTimezone = { |
|
7 attach: function (context, settings) { |
|
8 $('select.timezone-detect', context).once('timezone', function () { |
|
9 var dateString = Date(); |
|
10 // In some client environments, date strings include a time zone |
|
11 // abbreviation, between 3 and 5 letters enclosed in parentheses, |
|
12 // which can be interpreted by PHP. |
|
13 var matches = dateString.match(/\(([A-Z]{3,5})\)/); |
|
14 var abbreviation = matches ? matches[1] : 0; |
|
15 |
|
16 // For all other client environments, the abbreviation is set to "0" |
|
17 // and the current offset from UTC and daylight saving time status are |
|
18 // used to guess the time zone. |
|
19 var dateNow = new Date(); |
|
20 var offsetNow = dateNow.getTimezoneOffset() * -60; |
|
21 |
|
22 // Use January 1 and July 1 as test dates for determining daylight |
|
23 // saving time status by comparing their offsets. |
|
24 var dateJan = new Date(dateNow.getFullYear(), 0, 1, 12, 0, 0, 0); |
|
25 var dateJul = new Date(dateNow.getFullYear(), 6, 1, 12, 0, 0, 0); |
|
26 var offsetJan = dateJan.getTimezoneOffset() * -60; |
|
27 var offsetJul = dateJul.getTimezoneOffset() * -60; |
|
28 |
|
29 var isDaylightSavingTime; |
|
30 // If the offset from UTC is identical on January 1 and July 1, |
|
31 // assume daylight saving time is not used in this time zone. |
|
32 if (offsetJan == offsetJul) { |
|
33 isDaylightSavingTime = ''; |
|
34 } |
|
35 // If the maximum annual offset is equivalent to the current offset, |
|
36 // assume daylight saving time is in effect. |
|
37 else if (Math.max(offsetJan, offsetJul) == offsetNow) { |
|
38 isDaylightSavingTime = 1; |
|
39 } |
|
40 // Otherwise, assume daylight saving time is not in effect. |
|
41 else { |
|
42 isDaylightSavingTime = 0; |
|
43 } |
|
44 |
|
45 // Submit request to the system/timezone callback and set the form field |
|
46 // to the response time zone. The client date is passed to the callback |
|
47 // for debugging purposes. Submit a synchronous request to avoid database |
|
48 // errors associated with concurrent requests during install. |
|
49 var path = 'system/timezone/' + abbreviation + '/' + offsetNow + '/' + isDaylightSavingTime; |
|
50 var element = this; |
|
51 $.ajax({ |
|
52 async: false, |
|
53 url: settings.basePath, |
|
54 data: { q: path, date: dateString }, |
|
55 dataType: 'json', |
|
56 success: function (data) { |
|
57 if (data) { |
|
58 $(element).val(data); |
|
59 } |
|
60 } |
|
61 }); |
|
62 }); |
|
63 } |
|
64 }; |
|
65 |
|
66 })(jQuery); |