parseDate = {
  init: function(date) {
    var monthNumber = date.substring(5,7);
    var day = date.substring(8,10);    
    var month = this.getMonth(monthNumber);
    return [month, day];
  },
  getMonth: function(mo){
    var months = ["Jan","Feb","Mar",
                  "Apr","May","Jun",
                  "Jul","Aug","Sep",
                  "Oct","Nov","Dec"];
    mo = mo.replace(/^0/,"");
    mo -= 1;
    return months[mo];
  }
};

displayCalendar = {
  init: function(entries) {
		var calEvents = this.parseEvents(entries);

		var futureEvents = [];
		var pastEvents = [];

    // Determine which events are in the past and future
    var rightNow = (new Date).getTime();
		
    for (i = 0; i < calEvents.length; ++i) {     
     
     if (calEvents[i].endtimestamp.getTime() > rightNow) {
       futureEvents.push(calEvents[i]);
     }
     else {
       pastEvents.push(calEvents[i]);
     }
    }
    
    var datesToDisplay = [];
    var eventsToDisplay = [];
		
		// Add all events on the next two dates on the calendar.
		for (i = 0; i < futureEvents.length; i++) {
		  if (-1 < jQuery.inArray(futureEvents[i].date, datesToDisplay)) {
		    eventsToDisplay.push(futureEvents[i]);
		  }
		  
		  if (2 <= datesToDisplay.length) {
		    continue;
		  }
		  
		  if (-1 == jQuery.inArray(futureEvents[i].date, datesToDisplay)) {
  		  datesToDisplay.push(futureEvents[i].date);
  		  eventsToDisplay.push(futureEvents[i]);
		  }
		}
		
		// If we don't have two calendar dates in the future, grab one or
		// two dates from the immediate past
		if (datesToDisplay.length < 2) {
		  
		  // Sort the past events in descending order so we get the two
		  // most recent dates.
		  pastEvents.sort(function(a, b) {
  			return b.endtimestamp - a.endtimestamp;
  		});
  		
  		for (i = 0; i < pastEvents.length; i++) {
  		  if (-1 < jQuery.inArray(pastEvents[i].date, datesToDisplay)) {
  		    eventsToDisplay.push(pastEvents[i]);
  		  }

  		  if (2 <= datesToDisplay.length) {
  		    continue;
  		  }

  		  if (-1 == jQuery.inArray(pastEvents[i].date, datesToDisplay)) {
    		  datesToDisplay.push(pastEvents[i].date);
    		  eventsToDisplay.push(pastEvents[i]);
  		  }
  		}
		}
		
		// Sort the remaining events in ascending order.
		eventsToDisplay.sort(function(a, b) {
			return a.timestamp - b.timestamp;
		});
		
		// Display the events we've kept.
		for (i = 0; i < eventsToDisplay.length; ++i) {
      var dates = $('div.date');
      this.buildDom(eventsToDisplay[i]);
      $.unique(dates);       
    }
  },
	parseEvents: function(entries) {
		if (entries.length == 0) {
			return [];
		}
		
		var events = [];
		
		// Iterate over the entries and make a new list.
		for (i = 0; i < entries.length; i++) {
		  var entry = this.parseFeed(entries[i]);

		  if (entry["title"]) {		  
			  events.push(entry);
		  }
		}
		
		events.sort(function(a, b) {
			return a.timestamp - b.timestamp;
		});
		
		return events;
	},
  parseFeed: function(entry) {
		var calEvent = new Array;
		
		if (!entry["gd$when"]) {
		  return calEvent;
		}
		
    calEvent.title = entry.title.$t;
    calEvent.href  = entry.link[0].href;
    calEvent.date  = entry.gd$when[0].startTime.substring(0,10);
	calEvent.timestamp = this.createTimestamp(entry.gd$when[0].startTime);
	calEvent.endtimestamp = this.createTimestamp(entry.gd$when[0].endTime);
    return calEvent;
  },
	createTimestamp: function(dateString) {
		var d = new Date();
		
		d.setFullYear(dateString.substring(0, 4));

		d.setMonth((dateString.substring(5, 7)) - 1);

		d.setDate(dateString.substring(8, 10));
		
		if (dateString.length > 10) {
			d.setHours(dateString.substring(11, 13), dateString.substring(14, 16), 0, 0);
		}
		else {
			d.setHours(0, 0, 0, 0);
		}

		return d;
	},
  buildDom: function(calEvent) {
    var link = "<a href=\"" 
                + calEvent.href + "\">" 
                + calEvent.title + "</a>";
    var dateContainer = "<div id=\"" 
                        + calEvent.date 
                        + "\" class=\"date\"></div>";
    var formattedDate = parseDate.init(calEvent.date);
    var dateHeader = "div#" + calEvent.date + " h4";                   
    var displayDate = formattedDate[0]
                      + " <span>" 
                      + formattedDate[1] 
                      + "</span>";
    var linkLi = $('<li></li>').html(link);
    if ($("div#" + calEvent.date).length == 0) {
      $(dateContainer).html('').appendTo('div#calendar');    
      $('<h4></h4>').html(displayDate)
                    .addClass(calEvent.date)
                    .appendTo('div#' + calEvent.date);
    }

		if ($("div#" + calEvent.date + " ul").length == 0) {
	    $('<ul></ul>').html('')
	                  .insertAfter(dateHeader + "." + calEvent.date)
	                  .append(linkLi);			
		} else {
			$("div#" + calEvent.date + " ul").append(linkLi);
		}
  }
};

$(function(){
 // $('p.noscript').hide();
  
  $.getJSON("http://www.google.com/calendar/feeds/marketing@hesketh.com/public/full?alt=json-in-script&callback=?",
    function(data){      
      var feed = data.feed;
      var entries = feed.entry || [];
      displayCalendar.init(entries);
    });
});