var dateFormat = function()
{
    var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, timezoneClip = /[^-+\dA-Z]/g, pad = function(
            val, len)
    {
        val = String(val);
        len = len || 2;
        while (val.length < len)
            val = "0" + val;
        return val;
    };

    // Regexes and supporting functions are cached through closure
    return function(date, mask, utc)
    {
        var dF = dateFormat;

        // You can't provide utc if you skip other args (use the "UTC:" mask
        // prefix)
        if (arguments.length == 1
                && (typeof date == "string" || date instanceof String)
                && !/\d/.test(date))
        {
            mask = date;
            date = undefined;
        }

        // Passing date through Date applies Date.parse, if necessary
        date = date ? new Date(date) : new Date();
        if (isNaN(date))
            throw new SyntaxError("invalid date");

        mask = String(dF.masks[mask] || mask || dF.masks["default"]);

        // Allow setting the utc argument via the mask
        if (mask.slice(0, 4) == "UTC:")
        {
            mask = mask.slice(4);
            utc = true;
        }

        var _ = utc ? "getUTC" : "get", d = date[_ + "Date"](), D = date[_
                + "Day"](), m = date[_ + "Month"](), y = date[_ + "FullYear"](), H = date[_
                + "Hours"](), M = date[_ + "Minutes"](), s = date[_ + "Seconds"]
                (), L = date[_ + "Milliseconds"](), o = utc ? 0 : date
                .getTimezoneOffset(), flags = {
            d :d,
            dd :pad(d),
            ddd :dF.i18n.dayNames[D],
            dddd :dF.i18n.dayNames[D + 7],
            m :m + 1,
            mm :pad(m + 1),
            mmm :dF.i18n.monthNames[m],
            mmmm :dF.i18n.monthNames[m + 12],
            yy :String(y).slice(2),
            yyyy :y,
            h :H % 12 || 12,
            hh :pad(H % 12 || 12),
            H :H,
            HH :pad(H),
            M :M,
            MM :pad(M),
            s :s,
            ss :pad(s),
            l :pad(L, 3),
            L :pad(L > 99 ? Math.round(L / 10) : L),
            t :H < 12 ? "a" : "p",
            tt :H < 12 ? "am" : "pm",
            T :H < 12 ? "A" : "P",
            TT :H < 12 ? "AM" : "PM",
            Z :utc ? "UTC" : (String(date).match(timezone) || [ "" ]).pop()
                    .replace(timezoneClip, ""),
            o :(o > 0 ? "-" : "+")
                    + pad(
                            Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o)
                                    % 60, 4),
            S : [ "th", "st", "nd", "rd" ][d % 10 > 3 ? 0
                    : (d % 100 - d % 10 != 10) * d % 10]
        };

        return mask.replace(token, function($0)
        {
            return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
        });
    };
}();

// Some common format strings
dateFormat.masks = {
    "default" :"ddd mmm dd yyyy HH:MM:ss",
    shortDate :"m/d/yy",
    mediumDate :"mmm d, yyyy",
    longDate :"mmmm d, yyyy",
    fullDate :"dddd, mmmm d, yyyy",
    shortTime :"h:MMtt",
    mediumTime :"h:MM:ss TT",
    longTime :"h:MM:ss TT Z",
    isoDate :"yyyy-mm-dd",
    isoTime :"HH:MM:ss",
    isoDateTime :"yyyy-mm-dd'T'HH:MM:ss",
    isoUtcDateTime :"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",
    justYear :"yyyy",
    justMonth : "mm",
    justDay :"d",
    justHour :"HH:MM"
};

// Internationalization strings
dateFormat.i18n = {
    dayNames : [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday",
            "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
    monthNames : [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
            "Sep", "Oct", "Nov", "Dec", "January", "February", "March",
            "April", "May", "June", "July", "August", "September", "October",
            "November", "December" ]
};

// For convenience...
Date.prototype.format = function(mask, utc)
{
    return dateFormat(this, mask, utc);
};

function padNumber(num)
{
    if (num <= 9)
    {
        num = "0" + num;
    }
    return num;
}


function locationAsHtml(item)
{
    var loc = '';
    
    if (item.location)
        loc = "<span class='eLoc'>" + item.location + "</span><br/>";
    else
        ; // no place for this event, must be an annoucement
        
    return loc;
}

function isSameDay(item)
{
    
    var start = item.start;
    var end = item.end;
    var sameDay = start.format("justYear") == end.format("justYear");
    var startDay = new Number(start.format("justDay"));
    var endDay = new Number(end.format("justDay"));
    sameDay = sameDay && start.format("justMonth") == end.format("justMonth");
   sameDay = sameDay
          && (start.format("justDay") == end.format("justDay") || (startDay == endDay
                  && start.format("justHour") == "00:00" && end
                 .format("justHour") == "00:00"));
    
  
    // alert(item.start.format("justHour") + " " + item.end.format("justHour") +
    // " " + sameDay + " " + startDay + "-" + endDay);
    return sameDay;
    
}

function datesAsHtml(item)
{
    // alert(item.start.format() + " " + item.end.format());
    // var sameDay = item.start.format("fullDate") ==
    // item.end.format("fullDate");
    var sameDay = isSameDay(item);
    var allDay = item.start.format("shortTime") == item.end.format("shortTime");
    var dhtml = "";
    var dateF = "ddd. mmm. d";
    if (sameDay && !allDay)
    {
        dhtml = item.start.format(dateF) + ", "
                + item.start.format("shortTime");
    }
    else if (sameDay && allDay)
    {
        dhtml = item.start.format(dateF);
    }
    else if (!sameDay)
    {
        var endTime = item.end.getTime();
        endTime = endTime - (1000 * 60 * 60 * 24);
        var endDate = new Date(endTime);
        var s = item.start.format(dateF);
        var e = endDate.format(dateF);
        if (s != e)
            dhtml = item.start.format(dateF) + " - " + endDate.format(dateF);
        else
            dhtml = item.start.format(dateF) ;
    }
    else
    {
        throw "Unhandled date display case: sameDay=" + sameDay + " allDay: "
                + allDay;
    }
    return "<span class='eDate'>" + dhtml + "</span><br/>";
}



function parseItem(entry)
{
    var item = new Object();

    item.oldtitle = entry.getTitle().getText();
    item.title = entry.getTitle().getText();
    item.comments = entry.getContent().getText();
    
    var times = entry.getTimes();
    
    if (times.length > 0)
    {
        item.start = times[0].getStartTime().getDate();
        item.end = times[0].getEndTime().getDate();
    }
    else
    {
        throw "Event with no date found! " + item.title;
    }
    
    var where = entry.getLocations();
    if (where.length > 0)
    {
        item.location = where[0].getValueString();
    }
    
    item.loc = locationAsHtml(item);
    item.dates = datesAsHtml(item);
    item.comments = item.comments ? "<span class='eComments'>"
            + item.comments + "</span><br/>" : "";
    
    item.comments = item.comments.replace(
            /\[(.*),{1,1}\s*(.*),{1,1}(internal|external)\]{1,1}/gi,
            "<a class='$3' href='$2'>$1</a>");
    item.comments =   item.comments.replace(/\n\s*\n/gi, '<br/>&nbsp;<br/>');
    item.comments =   item.comments.replace(/\n/gi, '<br/>');
    
    item.title = "<span class='eTitle'>" + item.title + "</span><br/>";
    
    return item;
}

function listEvents(feedRoot)
{
    
    var entries = feedRoot.feed.getEntries();
    
    var len = entries.length;
    
    var items = new Array();
    var listing = "";
    
    
    var seenTitles = new Array();
    var stop = false;
    
    for ( var i = 0; i < len; i++)
    {
        var entry = entries[i];
        var item = parseItem(entry);
        items[i] = item;
        var title = item.oldtitle;
        
   
            listing += "<li>" + item.title + item.dates + item.loc + item.comments + "</li>";
        
        
    }
    
    listing += '<li>Go <a style="font-weight: bold;" href="http://wodaklab.org/ws/resources/calendar">here</a> for the complete calendar of events.</li>';
    
  
        
    document.getElementById('miniEventCal').innerHTML = listing;
    
}

