define(["dijit/dijit", "dojo"], function (dijit, dojo) { "use strict"; /* global Cesium */ var defined = Cesium.defined; var Clock = Cesium.Clock; var ClockRange = Cesium.ClockRange; var Timeline = Cesium.Timeline; var TimeInterval = Cesium.TimeInterval; var JulianDate = Cesium.JulianDate; var Color = Cesium.Color; var ClockViewModel = Cesium.ClockViewModel; var AnimationViewModel = Cesium.AnimationViewModel; var startDatePart, endDatePart, startTimePart, endTimePart; var timeline, clock, endBeforeStart, containerElement, animationViewModel, animation; function updateScrubTime(julianDate) { document.getElementById("mousePos").innerHTML = timeline.makeLabel(julianDate) + " UTC"; } function handleSetTime(e) { if (defined(timeline)) { var scrubJulian = e.timeJulian; clock.shouldAnimate = false; clock.currentTime = scrubJulian; updateScrubTime(scrubJulian); } } function spanToString(span) { var spanUnits = "sec"; if (span > 31536000) { span /= 31536000; spanUnits = "years"; } else if (span > 2592000) { span /= 2592000; spanUnits = "months"; } else if (span > 604800) { span /= 604800; spanUnits = "weeks"; } else if (span > 86400) { span /= 86400; spanUnits = "days"; } else if (span > 3600) { span /= 3600; spanUnits = "hours"; } else if (span > 60) { span /= 60; spanUnits = "minutes"; } return span.toString() + " " + spanUnits; } function handleSetZoom(e) { dojo.byId("formatted").innerHTML = //'
Epoch: ' + timeline.makeLabel(e.epochJulian) + ' UTC' + "
Start: " + timeline.makeLabel(e.startJulian) + " UTC" + "
 Stop: " + timeline.makeLabel(e.endJulian) + " UTC" + "
 Span: " + spanToString(e.totalSpan) + "
  Tic: " + spanToString(e.mainTicSpan); updateScrubTime(clock.currentTime); } function makeTimeline(startJulian, scrubJulian, endJulian) { clock = new Clock({ startTime: startJulian, currentTime: scrubJulian, stopTime: endJulian, clockRange: ClockRange.LOOP_STOP, multiplier: 60, shouldAnimate: true, }); timeline = new Timeline("time1", clock); timeline.addEventListener("settime", handleSetTime, false); timeline.addEventListener("setzoom", handleSetZoom, false); timeline.addTrack( new TimeInterval({ start: startJulian, stop: JulianDate.addSeconds(startJulian, 60 * 60, new JulianDate()), }), 8, Color.RED, new Color(0.55, 0.55, 0.55, 0.25) ); timeline.addTrack( new TimeInterval({ start: JulianDate.addSeconds(endJulian, -60 * 60, new JulianDate()), stop: endJulian, }), 8, Color.LIME ); var middle = JulianDate.secondsDifference(endJulian, startJulian) / 4; timeline.addTrack( new TimeInterval({ start: JulianDate.addSeconds(startJulian, middle, new JulianDate()), stop: JulianDate.addSeconds(startJulian, middle * 3, new JulianDate()), }), 8, Color.DEEPSKYBLUE, new Color(0.55, 0.55, 0.55, 0.25) ); var clockViewModel = new ClockViewModel(clock); animationViewModel = new AnimationViewModel(clockViewModel); animation = new Animation(dojo.byId("animationWidget"), animationViewModel); function tick() { var time = clock.tick(); updateScrubTime(time); requestAnimationFrame(tick); } tick(); } // Adjust start/end dates in reaction to any calendar/time clicks // function newDatesSelected() { var startJulian, endJulian; if (startDatePart && startTimePart) { startJulian = JulianDate.fromIso8601(startDatePart + startTimePart + "Z"); // + 'Z' for UTC } if (endDatePart && endTimePart) { endJulian = JulianDate.fromIso8601(endDatePart + endTimePart + "Z"); } if (startJulian && endJulian) { if (JulianDate.secondsDifference(endJulian, startJulian) < 0.1) { endBeforeStart.style.display = "block"; containerElement.style.visibility = "hidden"; } else { endBeforeStart.style.display = "none"; containerElement.style.visibility = "visible"; if (!timeline) { makeTimeline(startJulian, startJulian, endJulian); } clock.startTime = startJulian; clock.stopTime = endJulian; timeline.zoomTo(startJulian, endJulian); } } } // React to calendar date clicks // function newStartDateSelected(newDate) { startDatePart = dojo.date.stamp.toISOString(newDate, { selector: "date", }); newDatesSelected(); } function newEndDateSelected(newDate) { endDatePart = dojo.date.stamp.toISOString(newDate, { selector: "date", }); newDatesSelected(); } // React to time-of-day selectors // function getTimePart(newTime) { var h = newTime.getHours().toString(); h = h.length < 2 ? "0" + h : h; var m = newTime.getMinutes().toString(); m = m.length < 2 ? "0" + m : m; var s = newTime.getSeconds().toString(); s = s.length < 2 ? "0" + s : s; return "T" + h + ":" + m + ":" + s; } function newStartTimeSelected(newTime) { startTimePart = getTimePart(newTime); newDatesSelected(); } function newEndTimeSelected(newTime) { endTimePart = getTimePart(newTime); newDatesSelected(); } // React to theme changes // function setThemeLighter() { document.body.className = "claro cesium-lighter"; dijit.byId("themeSelector").set("label", "Theme: Lighter"); animation.applyThemeChanges(); } function setThemeDarker() { document.body.className = "claro"; dijit.byId("themeSelector").set("label", "Theme: Darker"); animation.applyThemeChanges(); } function cycleTheme() { if (document.body.className === "claro") { setThemeLighter(); } else { setThemeDarker(); } } window.addEventListener( "resize", function () { timeline.resize(); animation.resize(); }, false ); dojo.ready(function () { endBeforeStart = document.getElementById("endBeforeStart"); containerElement = document.getElementById("timelineAndAnimation"); dojo.connect(dijit.byId("startCal"), "onChange", newStartDateSelected); dojo.connect(dijit.byId("endCal"), "onChange", newEndDateSelected); dojo.connect(dijit.byId("startTimeSel"), "onChange", newStartTimeSelected); dojo.connect(dijit.byId("endTimeSel"), "onChange", newEndTimeSelected); dojo.connect(dijit.byId("themeSelector"), "onClick", cycleTheme); dojo.connect(dijit.byId("themeLighter"), "onClick", setThemeLighter); dojo.connect(dijit.byId("themeDarker"), "onClick", setThemeDarker); dijit.byId("startTimeSel").set("value", "T00:00:00"); dijit.byId("endTimeSel").set("value", "T24:00:00"); var today = JulianDate.now(); var tomorrow = JulianDate.addDays(today, 1, new JulianDate()); dijit.byId("startCal").set("value", JulianDate.toDate(today)); dijit.byId("endCal").set("value", JulianDate.toDate(tomorrow)); }); });