diff options
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.js | 126 |
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); +}); |