qq!startBlame("!. href(action=>"blame_data", -replay=>1) .qq!",\n!.
qq! "!. href() .qq!");\n!.
qq!</script>\n!;
- } elsif (gitweb_check_feature('javascript-actions')) {
+ } else {
print qq!<script type="text/javascript">\n!.
- qq!window.onload = fixLinks;\n!.
+ qq!window.onload = function () {\n!.
+ (gitweb_check_feature('javascript-actions') ?
+ qq! fixLinks();\n! : '').
+ # last parameter to onloadTZSetup must be CSS class used by format_timestamp_html
+ qq! onloadTZSetup('local', 'gitweb_tz', 'datetime');\n!.
+ qq!};\n!.
qq!</script>\n!;
}
sub format_timestamp_html {
my $date = shift;
- my $strtime = $date->{'rfc2822'};
+ my $strtime = '<span class="datetime">'.$date->{'rfc2822'}.'</span>';
my $localtime_format = '(%02d:%02d %s)';
if ($date->{'hour_local'} < 6) {
--- /dev/null
+// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net>
+// 2011, Jakub Narebski <jnareb@gmail.com>
+
+/**
+ * @fileOverview Manipulate dates in gitweb output, adjusting timezone
+ * @license GPLv2 or later
+ */
+
+/**
+ * Get common timezone and adjust dates to use this common timezone.
+ *
+ * This function is called during onload event (added to window.onload).
+ *
+ * @param {String} tzDefault: default timezone, if there is no cookie
+ * @param {String} tzCookieName: name of cookie to store timezone
+ * @param {String} tzClassName: denotes elements with date to be adjusted
+ */
+function onloadTZSetup(tzDefault, tzCookieName, tzClassName) {
+ var tzCookie = getCookie(tzCookieName);
+ var tz = tzCookie ? tzCookie : tzDefault;
+
+ // server-side of gitweb produces datetime in UTC,
+ // so if tz is 'utc' there is no need for changes
+ if (tz !== 'utc') {
+ fixDatetimeTZ(tz, tzClassName);
+ }
+}
+
+
+/**
+ * Replace RFC-2822 dates contained in SPAN elements with tzClassName
+ * CSS class with equivalent dates in given timezone.
+ *
+ * @param {String} tz: numeric timezone in '(-|+)HHMM' format, or 'utc', or 'local'
+ * @param {String} tzClassName: specifies elements to be changed
+ */
+function fixDatetimeTZ(tz, tzClassName) {
+ // sanity check, method should be ensured by common-lib.js
+ if (!document.getElementsByClassName) {
+ return;
+ }
+
+ // translate to timezone in '(-|+)HHMM' format
+ tz = normalizeTimezoneInfo(tz);
+
+ // NOTE: result of getElementsByClassName should probably be cached
+ var classesFound = document.getElementsByClassName(tzClassName, "span");
+ for (var i = 0, len = classesFound.length; i < len; i++) {
+ var curElement = classesFound[i];
+
+ // we use *.firstChild.data (W3C DOM) instead of *.innerHTML
+ // as the latter doesn't always work everywhere in every browser
+ var epoch = parseRFC2822Date(curElement.firstChild.data);
+ var adjusted = formatDateRFC2882(epoch, tz);
+
+ curElement.firstChild.data = adjusted;
+ }
+}
+
+/* end of adjust-timezone.js */
return tzSign + padLeft(hours, 2, '0') + sep + padLeft(minutes, 2, '0');
}
+/**
+ * translate 'utc' and 'local' to numerical timezone
+ * @param {String} timezoneInfo: might be 'utc' or 'local' (browser)
+ */
+function normalizeTimezoneInfo(timezoneInfo) {
+ switch (timezoneInfo) {
+ case 'utc':
+ return '+0000';
+ case 'local': // 'local' is browser timezone
+ return localTimezoneInfo();
+ }
+ return timezoneInfo;
+}
+
+
/**
* return date in local time formatted in iso-8601 like format
* 'yyyy-mm-dd HH:MM:SS +/-ZZZZ' e.g. '2005-08-07 21:49:46 +0200'