<!-- //

/**
 * Converts an xs:date or xs:dateTime formatted string into the local timezone
 * and outputs a human-readable form of this date or date/time.
 *
 * @param {string} gCalTime is the xs:date or xs:dateTime formatted string
 * @return {string} is the human-readable date or date/time string
 */
function formatDate(dt) { 
  var remtxt = dt;
  function consume(retxt) {
    var match = remtxt.match(new RegExp('^' + retxt));
    if (match) {
      remtxt = remtxt.substring(match[0].length);
      return match[0];
    }
    return '';
  }
  var year = consume('\\d{4}');
  consume('-?');
  var month = consume('\\d{2}');
  consume('-?');
  var dateMonth = consume('\\d{2}');

  return month+"."+dateMonth+"."+year;
}
function formatGCalTime(gCalTime) { 
	// alert("cCalTime: "+gCalTime);
  // text for regex matches
  var remtxt = gCalTime;

  function consume(retxt) {
    var match = remtxt.match(new RegExp('^' + retxt));
    if (match) {
      remtxt = remtxt.substring(match[0].length);
      return match[0];
    }
    return '';
  }

  // minutes of correction between gCalTime and GMT
  var totalCorrMins = 0;

  var year = consume('\\d{4}');
  consume('-?');
  var month = consume('\\d{2}');
  consume('-?');
  var dateMonth = consume('\\d{2}');
  var timeOrNot = consume('T');

  // if a DATE-TIME was matched in the regex 
  if (timeOrNot == 'T') {
    var hours = consume('\\d{2}');
    consume(':?');
    var mins = consume('\\d{2}');
    consume('(:\\d{2})?(\\.\\d{3})?');
    var zuluOrNot = consume('Z');

    // if time from server is not already in GMT, calculate offset
    if (zuluOrNot != 'Z') {
      var corrPlusMinus = consume('[\\+\\-]');
      if (corrPlusMinus != '') {
        var corrHours = consume('\\d{2}');
        consume(':?');
        var corrMins = consume('\\d{2}');
        totalCorrMins = (corrPlusMinus=='-' ? 1 : -1) * 
            (Number(corrHours) * 60 + 
	    (corrMins=='' ? 0 : Number(corrMins)));
      }
    } 

    // get time since epoch and apply correction, if necessary
    // relies upon Date object to convert the GMT time to the local
    // timezone
    var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
    var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
    var ld = new Date(gmtDateEpoch);

    // date is originally in YYYY-MM-DD format
    // time is originally in a 24-hour format
    // this converts it to MM/DD hh:mm (AM|PM) 
    dateString =  ((ld.getHours()>12)?(ld.getHours()-12):(ld.getHours()===0?12:
	ld.getHours())) + ':' + ((ld.getMinutes()<10)?('0' + 
	ld.getMinutes()):(ld.getMinutes())) + ' ' + 
	((ld.getHours()>=12)?'PM':'AM');

  } else {
    // if only a DATE was matched
    // dateString =  parseInt(month, 10) + '/' + parseInt(dateMonth, 10);
    dateString = "";
  }
  return dateString;
}

/**
 * Creates an unordered list of events in a human-readable form
 *
 * @param {json} root is the root JSON-formatted content from GData
 * @param {string} divId is the div in which the events are added
 */ 
function listEvents(root, divId) {
  var feed = root.feed;
  var events = document.getElementById(divId);

  if (events.childNodes.length > 0) {
    events.removeChild(events.childNodes[0]);
  }	 
   var html = "";
  // create a new unordered list
  html = html +"<table width='100%' border='0'><tbody>";

  if(feed != null && feed.entry != null) {
	  for (var i = 0; i < feed.entry.length; i++) {
	     var entry           = feed.entry[i];	     
	     var title           = entry.title.$t;
	     var desc            = entry.content.$t;
	     var starttime       = entry['gd$when'][0].startTime;
	     var stoptime        = entry['gd$when'][0].endTime;
	     var startTimeString = formatGCalTime(starttime);
	     var startDateString = formatDate(starttime);
	     var stopTimeString  = formatGCalTime(stoptime);
	     var stopDateString  = formatDate(stoptime);
	
	     html = html + "<tr><td>";
	
	     if(startDateString == stopDateString) {
	        html = html + "<div class=\"eventdate\">"+startDateString+"</div>";
	     } else {
	    	 if(startTimeString == "") {
	    		 html = html + "<div class=\"eventdate\">"+startDateString+"</div>";
	    	 } else {
	    		 html = html + "<div class=\"eventdate\">"+startDateString+" - "+stopDateString+"</div>";
	    	 }
	     }
	     html = html + "</td></tr>";
	     html = html + "<tr><td><div class=\"eventtitle\">" + title + "</div></td></tr>";
	     if(desc != null && desc != "") {
	    	 html = html + "<tr><td><div class=\"eventbody\">" + desc + "</div></td></tr>";
	     }
	
	     if(startTimeString != "") {	    	 
	        if((stopTimeString == null || stopTimeString == "") || (startTimeString == stopTimeString)) {
	            html = html + "<tr><td><div class=\"eventtime\">" + startTimeString + "</div></td></tr>";
	        } else if(startTimeString != stopTimeString) {
	            html = html + "<tr><td><div class=\"eventtime\">" + startTimeString + " - " + stopTimeString +"</div></td></tr>";
	        }
	     }
	     // html = html + "<tr><td>&nbsp;</td></tr>";
	   }
  } else {
	  html = html + "<tr><td><div class=\"eventbody\">No events at this time</div></td></tr>";
  }
   html = html + "</tbody></table>";
   events.innerHTML = html;
}

/**
 * Callback function for the GData json-in-script call
 * Inserts the supplied list of events into a div of a pre-defined name
 * 
 * @param {json} root is the JSON-formatted content from GData
 */ 
function insertAgenda(root) {
  listEvents(root, 'eventsdiv');
}
//-->
