var monthString = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var dowString = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var calendarKey = ["Adult", "Men", "Women", "Mixed", "MiddleSchool", "HighSchool", "Elementary", "PK", "Nursery"];
var calendarId = [
  "0e0223pheur0iksgk4dn7sbi2c", "uic9eh2cn0gl0cfa4qkd9dek8c", "4rfj6qjhnebveolmcsbg6gj7b4", "pv3v9hsncthjknphl9mfbp6t50",
  "iimqbn4qfr2mt2sk40rcfb9qis", "vb5ei6c3hac9poeg3kgmglfq3s", "1ra6k90ul0t1fpop2p0e2ko2n0", "1u24u9781cl1m9ff2mgur2tjo0",
  "b3s8agkqjioglgh4bdi959t0k0"
];
var totalCalendars = 0;
var loadedSoFar = 0;
var ul = document.createElement('ul');

google.load("gdata", "2.x");

function init() {
  google.gdata.client.init(handleGDError);
}

function getCalendarUrl(type) {
  for (var i = 0; i < calendarKey.length; i++) if (calendarKey[i] == type) {
    return "https://www.google.com/calendar/feeds/" + calendarId[i] + "@group.calendar.google.com/public/full";
  }
  return "";
}

function loadCalendars(calendars) {
  totalCalendars = calendars.length;
  loadedSoFar = 0;

  for (var i = 0; i < calendars.length; i++) {
    var calendarUrl = getCalendarUrl(calendars[i]);
    var service = new google.gdata.calendar.CalendarService('newsong-calendar');
    var query = new google.gdata.calendar.CalendarEventQuery(calendarUrl);
    var date = new Date();
    date.setDate(date.getDate() - 1); // start from yesterday.
    query.setMinimumStartTime(google.gdata.DateTime.toIso8601(date));
    query.setOrderBy('starttime');
    query.setSortOrder('ascending');
    query.setFutureEvents(true);
    query.setSingleEvents(true);
    query.setMaxResults(7);
    service.getEventsFeed(query, listEvents, handleGDError);
  }
}

function handleGDError(error) {
  document.getElementById('jsSourceFinal').setAttribute('style', 'display:none');
  if (error instanceof Error) {
    alert('Error at line ' + error.lineNumber + ' in ' + error.fileName + '\n' + 'Message: ' + error.message);
    if (error.cause) {
      var status = error.cause.status;
      var statusText = error.cause.statusText;
      alert('Root cause: HTTP error ' + status + ' with status text: ' + statusText);
    }
  } else {
    alert(error.toString());
  }
}

function pad(n, p) {
  var res = "" + n;
  while (res.length < p) res = "0" + res;
  return res;
}

function constructDate(y, m, d) {
  return monthString[m] + " " + d + ", " + y;
}

function constructTime(h, m) {
  var suffix = "AM";
  if (h >= 12) {
    h -= 12;
    suffix = "PM";
  }
  if (h == 0) h = 12;
  return pad(h, 2) + ":" + pad(m, 2) + " " + suffix;
}

function listEvents(feedRoot) {
  var entries = feedRoot.feed.getEntries();
  var len = entries.length;
  for (var i = 0; i < len; i++) {
    var entry = entries[i];
    var title = entry.getTitle().getText();
    var startDateTime = null;
    var EndDateTime = null;
    var startJSDate = null;
    var endJSDate = null;
    var times = entry.getTimes();
    if (times.length > 0) {
      startDateTime = times[0].getStartTime();
      endDateTime = times[0].getEndTime();
      startJSDate = startDateTime.getDate();
      endJSDate = endDateTime.getDate();
    }

    var year = startJSDate.getFullYear();
    var month = startJSDate.getMonth();
    var day = startJSDate.getDate();
    var hour = startJSDate.getHours();
    var minutes = startJSDate.getMinutes();
    var startDateStr = constructDate(year, month, day);
    var endDateStr = constructDate(endJSDate.getFullYear(), endJSDate.getMonth(), endJSDate.getDate());
    var startTimeStr = constructTime(hour, minutes);
    var endTimeStr = constructTime(endJSDate.getHours(), endJSDate.getMinutes());

    var normalizedDate = pad(year, 4) + pad(month+1, 2) + pad(day, 2) + pad(hour, 2) + pad(minutes, 2);

    var locations = entry.getLocations();
    var locationStr = "";
    if (locations.length > 0) {
      locationStr = locations[0].getValueString() + "<br/>";
    }

    var entryLink = document.createElement('a');
    var entryLinkHref = "#";
    if (entry.getHtmlLink() != null) {
      entryLinkHref = entry.getHtmlLink().getHref();
    }
    entryLink.setAttribute('href', entryLinkHref);
    entryLink.setAttribute('target', '_blank');

    var li = document.createElement('li');
    li.setAttribute('start', normalizedDate);
    var entryDiv = document.createElement('div');
    entryDiv.setAttribute('class', 'calendar-icon');
    entryDiv.innerHTML = "<p><em>" + monthString[month] + "</em><strong>" + day + "</strong></p>";
    entryLink.appendChild(entryDiv);

    var detailsDiv = document.createElement('div');
    detailsDiv.setAttribute('class', 'calendar-details');
    var s = dowString[startJSDate.getDay()] + " " + startDateStr + " " + startTimeStr + " - ";
    if (startDateStr != endDateStr) s += dowString[endJSDate.getDay()] + " " + endDateStr + " ";
    s += endTimeStr;
    detailsDiv.innerHTML = "<h2>" + title + "</h2><p><strong>" + s + "</strong><br/>" +
                           locationStr + "</p>";
    entryLink.appendChild(detailsDiv);
    li.appendChild(entryLink);

    var found = false;
    for (var j = 0; j < ul.childNodes.length; j++) {
      var attr = ul.childNodes[j].getAttribute('start');
      if (normalizedDate < attr) {
        found = true;
        ul.insertBefore(li, ul.childNodes[j]);
        break;
      }
    }
    if (!found && ul.childNodes.length < 7) ul.appendChild(li);
    if (ul.childNodes.length > 7) ul.removeChild(ul.lastChild);
  }

  loadedSoFar++;
  if (loadedSoFar == totalCalendars) {
    var eventDiv = document.getElementById('events');
    if (eventDiv.childNodes.length > 0) {
      eventDiv.removeChild(eventDiv.childNodes[0]);
    }
    eventDiv.appendChild(ul);
  }
}

google.setOnLoadCallback(init);

