summaryrefslogtreecommitdiffstats
path: root/comm/calendar/base/content/dialogs/calendar-event-dialog-timezone.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/calendar/base/content/dialogs/calendar-event-dialog-timezone.js')
-rw-r--r--comm/calendar/base/content/dialogs/calendar-event-dialog-timezone.js126
1 files changed, 126 insertions, 0 deletions
diff --git a/comm/calendar/base/content/dialogs/calendar-event-dialog-timezone.js b/comm/calendar/base/content/dialogs/calendar-event-dialog-timezone.js
new file mode 100644
index 0000000000..620932dda3
--- /dev/null
+++ b/comm/calendar/base/content/dialogs/calendar-event-dialog-timezone.js
@@ -0,0 +1,126 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* global addMenuItem */ // From ../calendar-ui-utils.js
+
+var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm");
+
+window.addEventListener("load", onLoad);
+
+/**
+ * Sets up the timezone dialog from the window arguments, also setting up all
+ * dialog controls from the window's dates.
+ */
+function onLoad() {
+ let args = window.arguments[0];
+ window.time = args.time;
+ window.onAcceptCallback = args.onOk;
+
+ let menulist = document.getElementById("timezone-menulist");
+ let tzMenuPopup = document.getElementById("timezone-menupopup");
+
+ // floating and UTC (if supported) at the top:
+ if (args.calendar.getProperty("capabilities.timezones.floating.supported") !== false) {
+ addMenuItem(tzMenuPopup, cal.dtz.floating.displayName, cal.dtz.floating.tzid);
+ }
+ if (args.calendar.getProperty("capabilities.timezones.UTC.supported") !== false) {
+ addMenuItem(tzMenuPopup, cal.dtz.UTC.displayName, cal.dtz.UTC.tzid);
+ }
+
+ let tzids = {};
+ let displayNames = [];
+ for (let timezoneId of cal.timezoneService.timezoneIds) {
+ let timezone = cal.timezoneService.getTimezone(timezoneId);
+ if (timezone && !timezone.isFloating && !timezone.isUTC) {
+ let displayName = timezone.displayName;
+ displayNames.push(displayName);
+ tzids[displayName] = timezone.tzid;
+ }
+ }
+ // the display names need to be sorted
+ displayNames.sort((a, b) => a.localeCompare(b));
+ for (let i = 0; i < displayNames.length; ++i) {
+ let displayName = displayNames[i];
+ addMenuItem(tzMenuPopup, displayName, tzids[displayName]);
+ }
+
+ let index = findTimezone(window.time.timezone);
+ if (index < 0) {
+ index = findTimezone(cal.dtz.defaultTimezone);
+ if (index < 0) {
+ index = 0;
+ }
+ }
+
+ menulist = document.getElementById("timezone-menulist");
+ menulist.selectedIndex = index;
+
+ updateTimezone();
+
+ opener.setCursor("auto");
+}
+
+/**
+ * Find the index of the timezone menuitem corresponding to the given timezone.
+ *
+ * @param timezone The calITimezone to look for.
+ * @returns The index of the childnode below "timezone-menulist"
+ */
+function findTimezone(timezone) {
+ let tzid = timezone.tzid;
+ let menulist = document.getElementById("timezone-menulist");
+ let numChilds = menulist.children[0].children.length;
+ for (let i = 0; i < numChilds; i++) {
+ let menuitem = menulist.children[0].children[i];
+ if (menuitem.getAttribute("value") == tzid) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/**
+ * Handler function to call when the timezone selection has changed. Updates the
+ * timezone-time field and the timezone-stack.
+ */
+function updateTimezone() {
+ let menulist = document.getElementById("timezone-menulist");
+ let menuitem = menulist.selectedItem;
+ let timezone = cal.timezoneService.getTimezone(menuitem.getAttribute("value"));
+
+ // convert the date/time to the currently selected timezone
+ // and display the result in the appropriate control.
+ // before feeding the date/time value into the control we need
+ // to set the timezone to 'floating' in order to avoid the
+ // automatic conversion back into the OS timezone.
+ let datetime = document.getElementById("timezone-time");
+ let time = window.time.getInTimezone(timezone);
+ time.timezone = cal.dtz.floating;
+ datetime.value = cal.dtz.dateTimeToJsDate(time);
+
+ // don't highlight any timezone in the map by default
+ let standardTZOffset = "none";
+ if (timezone.isUTC) {
+ standardTZOffset = "+0000";
+ } else if (!timezone.isFloating) {
+ let standard = timezone.icalComponent.getFirstSubcomponent("STANDARD");
+ // any reason why valueAsIcalString is used instead of plain value? xxx todo: ask mickey
+ standardTZOffset = standard.getFirstProperty("TZOFFSETTO").valueAsIcalString;
+ }
+
+ let image = document.getElementById("highlighter");
+ image.setAttribute("tzid", standardTZOffset);
+}
+
+/**
+ * Handler function to be called when the accept button is pressed.
+ */
+document.addEventListener("dialogaccept", () => {
+ let menulist = document.getElementById("timezone-menulist");
+ let menuitem = menulist.selectedItem;
+ let timezoneString = menuitem.getAttribute("value");
+ let timezone = cal.timezoneService.getTimezone(timezoneString);
+ let datetime = window.time.getInTimezone(timezone);
+ window.onAcceptCallback(datetime);
+});