function loadEvents(parser, url, divID)
{
    var loader = null;
    if (window.XMLHttpRequest)
    {
        loader = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        // code for crappy old M$ browsers
        loader = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
        return;
    }
    loader.onreadystatechange = function()
    { 
        displayEvents(loader, parser, divID);
    }

    document.getElementById(divID).innerHTML = "Loading....";
    loader.open("GET", url, true);
    loader.send(null);
}

function webcalendarParser(documentRoot)
{
    var result = new Array();
    var channels = documentRoot.getElementsByTagName("channel");
    for (var i=0;i<channels.length;i++)
    {
        var items = channels[i].getElementsByTagName("item");
        for (var j=0;j<items.length;j++)
        {
            var item = items[j];
            var category = item.getElementsByTagName("category")[0].firstChild.nodeValue;
            if (category == "-8")
            {
                // Don\'t display holidays
                continue;
            }
            var event = new Object();
            event.link = item.getElementsByTagName("link")[0].firstChild.nodeValue;
            event.title = item.getElementsByTagName("title")[0].firstChild.nodeValue;
            var localDateNodes = item.getElementsByTagName("localDate");
            if (localDateNodes && localDateNodes.length > 0)
            {
                event.date = new Date(localDateNodes[0].firstChild.nodeValue);
            }
            else
            {
                event.date = new Date(item.getElementsByTagName("pubDate")[0].firstChild.nodeValue);
            }
            result.push(event);
        }
    }
    return result;
}

function googleParser(documentRoot)
{
    try
    {
        // Required in M$ browsers...
        documentRoot.ownerDocument.setProperty("SelectionNamespaces", "xmlns:gd='http://schemas.google.com/g/2005'");
    }
    catch (e)
    {
        // ... but doesn't work in some others, so ignore errors.
    }
    var result = new Array();
    var entries = documentRoot.getElementsByTagName("entry");
    for (var i=0;i<entries.length;i++)
    {
        var entry = entries[i];
        var event = new Object();
        event.title = entry.getElementsByTagName("title")[0].firstChild.nodeValue;
        var links = entry.getElementsByTagName("link");
        for (var j=0; j<links.length; j++)
        {
            var link = links[j];
            if (link.getAttribute("type") == "text/html")
            {
                event.link = link.getAttribute("href");
                break;
            }
        }
        var whens;
        if (entry.getElementsByTagNameNS)
        {
            whens = entry.getElementsByTagNameNS("http://schemas.google.com/g/2005", "when");
        }
        else
        {
            // For f-ing stoopid M$ browsers:
            whens = entry.selectNodes("gd:when");
        }
        var dateString;
        for (var j=0; j<whens.length; j++)
        {
            var when = whens[j];
            var thisDate = when.getAttribute("startTime");
            if (j == 0 || thisDate < dateString)
            {
                dateString = thisDate;
            }
        }
        if (dateString)
        {
            var d = new Date();
            var pieces = dateString.split("-");
            if (pieces[1].charAt(0)=='0')
            {
                pieces[1] = pieces[1].substring(1);
            }
            var tpos = pieces[2].indexOf("T");
            if (tpos > 0)
            {
                pieces[2] = pieces[2].substring(0, tpos);
            }
//            alert("Date: " + dateString + " year: " + pieces[0] + " month: " + pieces[1] + " day: " + pieces[2]);
            d.setFullYear(pieces[0], parseInt(pieces[1]) - 1, pieces[2]);
 //           d.setMonth(parseInt(pieces[1]) - 1);
 //           d.setDate(pieces[2]);
 //           alert(d.toLocaleDateString());
            event.date = d;
        }
        result.push(event);
    }
    result.sort( function(e1, e2) { return e1.date.getTime() - e2.date.getTime(); } );
    return result;
}

function displayEvents(loader, parser, divID)
{
    if (loader.readyState != 4)
    {
        return;
    }
    var text;
    if (loader.status == 200)
    {
        var eventsArray = parser(loader.responseXML.documentElement);
        if (eventsArray.length > 0)
        {
            text = "";
            for (var i=0; i<eventsArray.length; i++)
            {
                var event = eventsArray[i];
                text += "<p><a href=\""
                    + event.link
		    + "\" target=\"_blank\">"
		    + event.title
		    + "</a><br />\n"
		    + event.date.toLocaleDateString()
		    + "</p>\n";
            }
        }
        else
        {
            text = "<p>There are no events to display at this time.</p>";
        }
    }
    else
    {
        text = "Couldn\'t contact server!";
    }
    document.getElementById(divID).innerHTML = text;
}