Insert scheduled downtime infos from cloud calendar

Change-Id: I8e4524126c08c4b89298e29b4c17588ef3997b71
diff --git a/js/calendar-events.js b/js/calendar-events.js
new file mode 100644
index 0000000..c4fc9ee
--- /dev/null
+++ b/js/calendar-events.js
@@ -0,0 +1,72 @@
+async function getCalendar(icalUrl) {
+  const response = await fetch(icalUrl);
+  const data = await response.text();
+  return data;
+}
+
+function getDateFromjCal(jCal, event, name) {
+  const date = event.getFirstPropertyValue(name);
+  const vtimezone = jCal.getFirstSubcomponent('vtimezone');
+  if (vtimezone && moment(date.toJSDate()).utcOffset()) {
+    date.zone = new ICAL.Timezone(vtimezone);
+  }
+  var locale = window.navigator.userLanguage || window.navigator.language;
+  moment.locale(locale);
+  return moment.parseZone(date.toJSDate()).utcOffset(date.utcOffset() / 60)
+};
+
+function insertCalendarEvents(dlElement, icalUrl, maxAgeDays = 1) {
+
+  if (!icalUrl) {
+    return;
+  }
+
+  getCalendar(icalUrl).then(data => {
+    // console.log(data);
+    var jcalData = ICAL.parse(data);
+    var vcalendar = new ICAL.Component(jcalData);
+    ICAL.helpers.updateTimezones(vcalendar, ICAL.TimezoneService);
+    const element = dlElement;
+
+    var events = vcalendar.getAllSubcomponents('vevent');
+    var eventArray = [];
+    var eventKeys = [];
+    var now = moment();
+    events.forEach(event => {
+      var start = getDateFromjCal(vcalendar, event, 'dtstart');
+      if (now.diff(start, 'days') <= maxAgeDays) {
+        var key = event.getFirstPropertyValue("dtstart") + "-" + event.getFirstPropertyValue("dtend");
+        eventArray[key] = event;
+        eventKeys.push(key);
+      }
+    });
+    dlElement.replaceChildren();
+    if (eventKeys.length == 0) {
+      const dd = document.createElement('dd');
+      dd.appendChild(document.createTextNode("–"));
+      element.appendChild(dd);
+      return;
+    }
+    eventKeys.sort().reverse().forEach(key => {
+      var event = eventArray[key];
+      var summary = event.getFirstPropertyValue('summary');
+      var start = getDateFromjCal(vcalendar, event, 'dtstart');
+      var end = getDateFromjCal(vcalendar, event, 'dtend');
+      const dt = document.createElement('dt');
+      const time = document.createElement('time');
+      dt.setAttribute('class', 'maintenance');
+      const node = document.createTextNode(start.format('dddd, LL'));
+      time.appendChild(node);
+      time.setAttribute('datetime', start.format('YYYY-MM-DD'));
+      dt.appendChild(time);
+      element.appendChild(dt);
+      const dd = document.createElement('dd');
+      const description = document.createTextNode(start.format("HH:mm") + "-" + end.format("HH:mm") + ` ${summary}`);
+      dd.appendChild(description);
+      element.appendChild(dd);
+    });
+  }
+  ).catch(error => {
+    console.log(error);
+  });
+}