﻿/* 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);
}

/**
* 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) {
    //use JQuery's ready event to avoid load errors in IE7
    $(document).ready(function() {
        var calendarUrl = 'https://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(10);

    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'.  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 listEvents(feedRoot) {
    var entries = feedRoot.feed.getEntries();
    var eventDiv = document.getElementById('events');
    var titleDiv = document.getElementById('calendarTitle');
    
    if (eventDiv.childNodes.length > 0) {
        eventDiv.removeChild(eventDiv.childNodes[0]);
    }
    
    /* create a new unordered list */
    var ul = document.createElement('ul');
    
    /* set the calendarTitle div with the name of the calendar */
    //document.getElementById('calendarTitle').innerHTML = feedRoot.feed.title.$t;
    
    /* 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 startDateTime = null;
        var startJSDate = null;
        var times = entry.getTimes();
        if (times.length > 0) {
            dateString = formatEventDateTime(times[0]);
        }

        var entryLinkHref = null;
        if (entry.getHtmlLink() != null) {
            entryLinkHref = entry.getHtmlLink().getHref();
        }

        var li = document.createElement('li');

        /* if we have a link to the event, create an 'a' element */
        if (entryLinkHref != null) {
            entryLink = document.createElement('a');
            entryLink.setAttribute('href', entryLinkHref);
            entryLink.setAttribute('target', i);
            entryLink.appendChild(document.createTextNode(title));
            li.appendChild(entryLink);
            li.appendChild(document.createTextNode(' - ' + dateString));
        } else {
            li.appendChild(document.createTextNode(title + ' - ' + dateString));
        }

        /* append the list item onto the unordered list */
        ul.appendChild(li);
    }
    eventDiv.appendChild(ul);
    if (titleDiv != null && len != 0) titleDiv.style.visibility='visible';
}

function formatEventDateTime(eventTimes) {
    startDateTime = eventTimes.getStartTime();
    startJSDate = startDateTime.getDate();
    endDateTime = eventTimes.getEndTime();
    endJSDate = endDateTime.getDate();
    endJSDate.setDate(endJSDate.getDate()+getEndDateOffset(startJSDate, endJSDate));
    
    var temp;
    var startDateString = padNumber(startJSDate.getMonth() + 1) + "/" + padNumber(startJSDate.getDate()) + "/" + startJSDate.getFullYear();
    temp = startDateString;
    if (!startDateTime.isDateOnly()) {
        temp += " " + formatTime(startJSDate);
        //dateString += " - " + endJSDate.toLocaleTimeString();
    }
    var endDateString = padNumber(endJSDate.getMonth() + 1) + "/" + padNumber(endJSDate.getDate()) + "/" + endJSDate.getFullYear();
    if (endDateString != startDateString)
    {
        temp += " - " + endDateString;
    }
    if (endDateString == startDateString && !endDateTime.isDateOnly())
    {
        temp += " - ";
    }
    if (!endDateTime.isDateOnly()) {
        temp += formatTime(endJSDate);
        //dateString += " - " + endJSDate.toLocaleTimeString();
    }
    return temp;
}

function getEndDateOffset(start, end)
{
   
    if (start.getMonth() == end.getMonth() &&
        start.getDate() == end.getDate() &&
        start.getFullYear() == end.getFullYear())
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

function formatTime(jsDate) {
    var temp = "";
    if (jsDate.getHours() > 12)
        temp += jsDate.getHours() - 12;
    else
        temp += jsDate.getHours();

    temp += ":" + padNumber(jsDate.getMinutes());

    if (jsDate.getHours() >= 12)
        temp += " PM";
    else
        temp += " AM";

    return temp;
}

google.setOnLoadCallback(init);