/* Loads the Google data JavaScript client library */
google.load("gdata", "1");

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();
}

/**
 * Loads the Google Developers Event Calendar
 */
function loadDeveloperCalendar(){
    loadCalendarByAddress('cbcphl@gmail.com');
}

/**
 * Adds a leading zero to a single-digit number.  Used for displaying dates.
 */
function padNumber(num){
    if (num <= 9) {
        return "0" + num;
    }
    return num;
}

/**
 * Determines the full calendarUrl based upon the calendarAddress
 * argument and calls loadCalendar with the calendarUrl value.
 *
 * @param {string} calendarAddress is the email-style address for the calendar
 */
function loadCalendarByAddress(calendarAddress){
    var calendarUrl = 'http://www.google.com/calendar/feeds/' + calendarAddress + '/public/full';
    loadCalendar(calendarUrl);
}

/**
 * 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 loadCalendar(calendarUrl){
    var service = new google.gdata.calendar.CalendarService('gdata-js-client-samples-simple');
    var query = new google.gdata.calendar.CalendarEventQuery(calendarUrl);
    query.setOrderBy('starttime');
    query.setSortOrder('ascending');
    query.setFutureEvents(true);
    query.setSingleEvents(true);
    query.setMaxResults(3);
    
    service.getEventsFeed(query, listEvents, 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());
    }
}

/**
 * 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'.
 *
 * @param {json} feedRoot is the root of the feed, containing all entries
 */
function listEvents(feedRoot){
    var entries = feedRoot.feed.getEntries();
    var eventDiv = document.getElementById('mini_events');
    if (eventDiv.childNodes.length > 0) {
        eventDiv.removeChild(eventDiv.childNodes[0]);
    }
    /* create a new paragraph */
    var p = document.createElement('p');
    /* loop through each event in the feed */
    var len = entries.length;
    /* if no entries, display message */
    if (entries.length == 0) {
        p.appendChild(document.createTextNode('There are currently no upcoming events in our calendar. Please check back at a later date. Thank you!'));
    }
    for (var i = 0; i < len; i++) {
        var entry = entries[i];
        var title = entry.getTitle().getText();
        var startDateTime = new Date();
        var startJSDate = new Date();
        var times = entry.getTimes();
        if (times.length > 0) {
            startDateTime = times[0].getStartTime();
            startJSDate = startDateTime.getDate();
        }
        var entryLinkHref = null;
        if (entry.getHtmlLink() != null) {
            entryLinkHref = entry.getHtmlLink().getHref();
			entryLinkHref = entryLinkHref + "&ctz=America/New_York"
        }
        var lastTwo = startJSDate.getFullYear();
        lastTwo += '';
        var dateString = (startJSDate.getMonth() + 1) + "/" + startJSDate.getDate() + "/" + lastTwo.charAt(2) + lastTwo.charAt(3);
        var tag = "";
        var hours = startJSDate.getHours();
        if (hours > 12) {
            hours = hours - 12;
            tag = "pm";
        }
        else 
            if (hours == 12) {
                tag = "pm";
            }
            else {
                tag = "am";
            }
        if (!startDateTime.isDateOnly()) {
            dateString += " - " + hours + ":" + padNumber(startJSDate.getMinutes()) + " " + tag;
        }
        
        /* If there is a link to the event, create an 'a' element */
        if (entryLinkHref != null) {
            entryLink = document.createElement('a');
            var ptag = document.createElement('p');
            entryLink.setAttribute('href', entryLinkHref);
            entryLink.setAttribute('target', 'blank');
            entryLink.setAttribute('title', title);
            entryLink.appendChild(document.createTextNode(title));
            p.appendChild(entryLink);
            p.appendChild(document.createTextNode(' - ' + dateString));
            p.appendChild(ptag);
        }
        else {
            p.appendChild(document.createTextNode(title + ' - ' + dateString));
        }
    }
    eventDiv.appendChild(p);
}

google.setOnLoadCallback(init);

