/* Loads the Google data JavaScript client library */
google.load("gdata", "2.x");
function init() {
  // init the Google data JS client library with an error handler
  google.gdata.client.init(handleGDError);
  // load the code.google.com developer calendar
  //loadDeveloperCalendar();
}
/**
 * Adds a leading zero to a single-digit number.  Used for displaying dates.
 */
function padNumber(num) {
  if (num <= 9) {
    return "0" + num;
  }
  return num;
}
/**
 * Uses Google data JS client library to retrieve a calendar feed from the specified
 * URL.  The feed is controlled by several query parameters and a callback 
 * function is called to process the feed results.
 *
 * @param {string} calendarUrl is the URL for a public calendar feed
 */  
function loadCalendarMax(calendarUrl, funcname, id, url, max)
{
  var query = new google.gdata.calendar.CalendarEventQuery(calendarUrl);
  query.setOrderBy('starttime');
  query.setSortOrder('ascending');
  query.setFutureEvents(true);
  query.setSingleEvents(true);
  if (max > -1 )
  {
    query.setMaxResults(max);
  }
  else
  {
    query.setMaxResults(10);
  }
  var dt = new Date();
  var calTitle = dt.getFullYear() + " Events";
  loadCalendarQuery(calendarUrl, query, funcname, id, url, null);
}
function loadCalendarYear(calendarUrl, funcname, id, url, yearFromNow)
{
  var query = new google.gdata.calendar.CalendarEventQuery(calendarUrl);
  query.setOrderBy('starttime');
  query.setSortOrder('ascending');
  query.setSingleEvents(true);
  query.setFutureEvents(null);
  var dt = new Date();
  var year = dt.getFullYear() + yearFromNow; 
  var nextYear = year + 1;
  if (yearFromNow > 0)
  {
      var minString = year + '-01-01T00:00:00.000-07:00';
      var startMin = google.gdata.DateTime.fromIso8601(minString);
      query.setMinimumStartTime(startMin);
  }
  else
  {
      var startMin = new google.gdata.DateTime(dt, false);
      query.setMinimumStartTime(startMin);
  }
  var startMax = google.gdata.DateTime.fromIso8601(nextYear + '-01-01T00:00:00.000-07:00');
  query.setMaximumStartTime(startMax);
  var calTitle = year + " Events";
  loadCalendarQuery(calendarUrl, query, funcname, id, url, calTitle);
}
function loadCalendarQuery(calendarUrl, query, funcname, id, url, calTitle) {
  var service = new 
      google.gdata.calendar.CalendarService('gdata-js-client-samples-simple');
  if (calTitle != null)
  {
      calTitle = "'" + calTitle + "'";
  }
  else
  {
      calTitle = 'null';
  }
  var func = new Function("feedroot", "return " + funcname + "(feedroot,'" + id + "', '" + url + "', " + calTitle +");");
  service.getEventsFeed(query, func, handleGDError);
}

/**
 * Callback function for the Google data JS client library to call when an error
 * occurs during the retrieval of the feed.  Details available depend partly
 * on the web browser, but this shows a few basic examples. In the case of
 * a privileged environment using ClientLogin authentication, there may also
 * be an e.type attribute in some cases.
 *
 * @param {Error} e is an instance of an Error 
 */
function handleGDError(e) {
  document.getElementById('jsSourceFinal').setAttribute('style', 
      'display:none');
  if (e instanceof Error) {
    /* alert with the error line number, file and message */
    alert('Error at line ' + e.lineNumber +
          ' in ' + e.fileName + '\n' +
          'Message: ' + e.message);
    /* if available, output HTTP error code and status text */
    if (e.cause) {
      var status = e.cause.status;
      var statusText = e.cause.statusText;
      alert('Root cause: HTTP error ' + status + ' with status text of: ' + 
            statusText);
    }
  } else {
    alert(e.toString());
  }
}

function getMonthString(i)
{
  switch(i)
  {
    case 0:
      return "Jan."
    case 1:
      return "Feb."
    case 2:
      return "Mar."
    case 3:
      return "Apr."
    case 4:
      return "May."
    case 5:
      return "Jun."
    case 6:
      return "Jul."
    case 7:
      return "Aug."
    case 8:
      return "Sept."
    case 9:
      return "Oct."
    case 10:
      return "Nov."
    case 11:
      return "Dec."
  }
}

function getMonthDate(time)
{
    var startDateTime = time.getStartTime();
    var startJSDate = startDateTime.getDate();
    var dateString = getMonthString(startJSDate.getMonth()) + " " + startJSDate.getDate();
    var endDateTime = time.getEndTime();
    var endJSDate = endDateTime.getDate();
    
    // account for events that are 24 hours. we don't want to show "startDate - endDate"
    var oneDay = ((endJSDate.getTime() - startJSDate.getTime()) == (60*60*24*1000)) && startJSDate.getHours() == 0;
    if ( !oneDay && ((startJSDate.getMonth() != endJSDate.getMonth()) || (startJSDate.getDate() != endJSDate.getDate())))
    { 
      dateString += "-" + getMonthString(endJSDate.getMonth()) + " " + endJSDate.getDate();
    }
    return dateString;
}

function getStartEndTimeString(time)
{
  return getTimeString(time.getStartTime()) + '-' + getTimeString(time.getEndTime());
}

function getTimeString(time)
{
    var jsDate = time.getDate();
    var startAmPm = 'am';
    var startHours = jsDate.getHours();
    if (jsDate.getHours() >= 12 )
    {
        startAmPm = 'pm'; 
    }
    if (jsDate.getHours() > 12 )
    {
        startHours = jsDate.getHours() - 12; 
    }
    timeString = startHours ;
    if (jsDate.getMinutes() > 0)
    {
      timeString += (':' +
      padNumber(jsDate.getMinutes())) ;
    }
    timeString += startAmPm;
    return timeString
}

function getDateString(time)
{
    var startDateTime = time.getStartTime();
    var startJSDate = startDateTime.getDate();
    var dateString = (startJSDate.getMonth() + 1) + "/" + startJSDate.getDate();
    var endDateTime = time.getEndTime();
    if (!startDateTime.isDateOnly()) 
    {
        dateString += " ";
        dateString += getTimeString(startDateTime);
        dateString += " - ";
        dateString += getTimeString(endDateTime);
    }
    else
    {
        var endJSDate = endDateTime.getDate();
        var oneDay = ((endJSDate.getTime() - startJSDate.getTime()) == (60*60*24*1000)) && startJSDate.getHours() == 0;
        if (!oneDay && ((startJSDate.getMonth() != endJSDate.getMonth()) || (startJSDate.getDate() != endJSDate.getDate())))
        { 
          dateString += "-" + (endJSDate.getMonth() + 1) + "/" + endJSDate.getDate();
        }
    }
    return dateString;
}
/**
 * Callback function for the Google data JS client library to call with a feed 
 * of events retrieved.
 *
 * Creates an unordered list of events in a human-readable form.  This list of
 * events is added into a div called 'events'.  The title for the calendar is
 * placed in a div called 'calendarTitle'
 *
 * @param {json} feedRoot is the root of the feed, containing all entries 
 */ 
function listEventsShort(feedRoot, id, url, calTitle) {
  var entries = feedRoot.feed.getEntries();
  var eventDiv = document.getElementById(id);
  if (eventDiv.childNodes.length > 0) {
    eventDiv.removeChild(eventDiv.childNodes[0]);
  }   
  /* create a new unordered list */
  var ul = document.createElement('div');

  /* loop through each event in the feed */
  var len = entries.length;
  for (var i = 0; i < len; i++) {
    var entry = entries[i];
    var title = entry.getTitle().getText();
  
    var times = entry.getTimes();
    var start = getDateString(times[0]);
    var li = document.createElement('div');
    var brk = document.createElement('br');
    var underline = document.createElement('u');
    //underline.appendChild(document.createTextNode(title + ' - ' + start));
    underline.appendChild(document.createTextNode(title));
    var link = document.createElement('a');
    link.setAttribute('href', url);
    link.appendChild(underline);
    li.appendChild(link);
    li.appendChild(brk);
    li.appendChild(document.createTextNode(start));

    summary = '';
    if (entry.getContent().getText() != null)
    {
      li.appendChild(document.createElement('br'));
      summary = entry.getContent().getText();
      var excerpt = '';
      /* check to see if there are {}'s for the excerpt */
      var first = summary.indexOf('{');
      if (first != -1)
      {
          var last = summary.indexOf('}');
          if (last > -1 )
          {
              excerpt = summary.substring(first + 1, last);
          }
      }
      else
      {
          var dot = summary.indexOf('.');
          if (dot > -1) 
          {
            excerpt = summary.substring(0, dot + 1);
          }
      }
      li.appendChild(document.createTextNode(' '));
      var excerptSpan = document.createElement('span');
      excerptSpan.innerHTML=Wiky.toHtml(excerpt);
      li.appendChild(excerptSpan);
    }
    
    /* append the list item onto the list */
    ul.appendChild(li);
    ul.appendChild(document.createElement('br'));
  }
  eventDiv.appendChild(ul);
}

function listEventsLong(feedRoot, id, url, calTitle) {
  var entries = feedRoot.feed.getEntries();
  var eventDiv = document.getElementById(id);
  if (eventDiv.childNodes.length > 0) {
    eventDiv.removeChild(eventDiv.childNodes[0]);
  }   
  /* create a new unordered list */
  var ul = document.createElement('div');
  /* set the calendarTitle div with the name of the calendar */
/*
  document.getElementById('calendarTitle').innerHTML = 
    "Calendar: " + feedRoot.feed.title.$t;
*/
  /* loop through each event in the feed */
  var len = entries.length;
  if (len > 0 && calTitle != null)
  {
      var titleStrong = document.createElement('h3');
      titleStrong.appendChild(document.createTextNode(calTitle));
      ul.appendChild(titleStrong);
/*
      ul.appendChild(document.createElement('br'));
      ul.appendChild(document.createElement('br')); */
  }
  for (var i = 0; i < len; i++) {
    var entry = entries[i];
    var title = entry.getTitle().getText();
  
    var times = entry.getTimes();
    var start = getMonthDate(times[0]);
    var li = document.createElement('div');
    var strong = document.createElement('strong');
    strong.appendChild(document.createTextNode(start));
    strong.appendChild(document.createElement('br'));
    strong.appendChild(document.createElement('br'));
    strong.appendChild(document.createTextNode(title));
    strong.appendChild(document.createTextNode(' '));
    li.appendChild(strong);

    summary = '';
    if (entry.getContent().getText() != null)
    {
      summary = entry.getContent().getText();
      var bracket = summary.indexOf('}');
      if (bracket > -1) 
      {
        if (summary.charAt(bracket + 1) == ' ')
        {
           ++bracket;
        }
        summary = summary.substring(bracket + 1);
      }
      var sum = document.createElement('span');
      sum.innerHTML=Wiky.toHtml(summary);
      li.appendChild(sum);
    }
    if (!times[0].getStartTime().isDateOnly()) 
    {
        var whenStrong = document.createElement('strong');
        whenStrong.appendChild(document.createTextNode(' When: '));
        li.appendChild(whenStrong);
        li.appendChild(document.createTextNode(getStartEndTimeString(times[0])));
    }

   
    var locations = entry.getLocations();
    if (locations != null  && locations.length > 0)
    {
        var loc = locations[0];
        if (loc != null && loc.getValueString() != '')
        {
            var whereStrong = document.createElement('strong');
            whereStrong.appendChild(document.createTextNode(' Where: '));
            li.appendChild(whereStrong);
            var where = document.createElement('span');
            where.innerHTML = Wiky.toHtml(loc.getValueString());
            li.appendChild(where);
        }
    }
    
    /* append the list item onto the unordered list */
    ul.appendChild(li);
    ul.appendChild(document.createElement('br'));
  }
  eventDiv.appendChild(ul);
}
google.setOnLoadCallback(init);
