$(document).ready(function(){init()});

var events = new Array();
var eventTypeQuery = '';
var allTypes = true;
var tester, theStartDate, theEndDate, dateShowing, today, thisWeekStart, thisWeekEnd, nextWeekStart, nextWeekEnd, calendarMonth, calendarYear, initialEventCount = 7;



function init(){
  tester = new calendar();
  
  // Is the calendar control extant?
  if(document.getElementById('cal')){  
    
	tester.show('cal');
  
    //Set the start and end dates of this week
	var theDay = today.getDay();
	if(theDay == 0)theDay = 7;
	  theDay = theDay -1;
	  thisWeekStart = new Date(today);
      thisWeekStart.setDate(thisWeekStart.getDate()-theDay);
	  thisWeekEnd = new Date(thisWeekStart);
	  thisWeekEnd.setDate(thisWeekEnd.getDate()+7);
	  thisWeekStart.setHours(0);
	  thisWeekStart.setMinutes(0);
	  thisWeekStart.setSeconds(0);
	  thisWeekEnd.setHours(0);
	  thisWeekEnd.setMinutes(0);
	  thisWeekEnd.setSeconds(0);	
	  nextWeekStart = new Date(thisWeekEnd);
	  //nextWeekStart.setDate(thisWeekEnd.getDate()+1);
	  nextWeekEnd = new Date(nextWeekStart);
	  nextWeekEnd.setDate(nextWeekStart.getDate()+6);

  
    // Handle the this week event
    $('#thisWeek').bind('click', function(e){
	  showEvents(thisWeekStart, thisWeekEnd);
      });
  
    // Handle the next week event
    $('#nextWeek').bind('click', function(e){
      showEvents(nextWeekStart, nextWeekEnd);										
      });
	
    // Handle the date range selector
	$('#dateRangeButton').bind('click', function(e){
      switch($('#rangeSelector').attr('value')){
	    case 'today': showEvents(today.getMonth()+1 + '/' + today.getDate() + '/' + today.getFullYear(), today.getMonth()+1 + '/' + today.getDate() + '/' + today.getFullYear());
		break;
		case 'thisWeek': showEvents(thisWeekStart, thisWeekEnd);
		break;
		case 'nextWeek': showEvents(nextWeekStart, nextWeekEnd);
		break;
		case 'thisMonth': changeMonth(0, today.getMonth()+1, today.getFullYear());
		break;
		case 'nextMonth': changeMonth(1, today.getMonth()+1, today.getFullYear());
		break;
		case 'thisYear': showEvents('1/1/'+today.getFullYear(), '12/31/'+today.getFullYear())
		break;
		case 'nextYear': showEvents('1/1/'+(today.getFullYear() + 1), '12/31/'+(today.getFullYear() + 1))
		break;
		//case 'any': showEvents(events[0].startDate, events[events.length-1].startDate);
		case 'any': showAllEvents();
		break;
	    }
      });	
	
    }
	

    
	
	
	
  // If the calendar control is not included, show all events
  else{
	parseEvents();
	//showEvents(events[0].startDate, events[events.length-1].startDate);
	showAllEvents();
    }
	
  // Determine whether the event type selector is included
  if(document.getElementById('typeSelector')){  
  
    showTypeSelector();
  
    // Bind the click event to the event type checkboxes
    $('.typeSelect').bind("click", function(e){
      var eventType = $(this).attr('value');
	  var isChecked = $(this).attr('checked');
      if(isChecked)eventTypeQuery += eventType + ',';
	  else eventTypeQuery = eventTypeQuery.replace(eventType + ',', '');
	  allTypes = false;
	  showEvents(theStartDate, theEndDate);
	  //$('#etq').text(eventTypeQuery);
	  $('#allEvents').attr('checked', false);
	  $('#allEvents').attr('disabled', false);
	  allTypes = false;
      });  
  
    // Handle the show all event
    $('#allEvents').bind('click', function(e){
      if($(this).attr('checked')){
	    $('.typeSelect').attr('checked', false);
  	    $(this).attr('disabled', true);
  	    allTypes = true;
  	    eventTypeQuery = '';
	    showEvents(theStartDate, theEndDate);
	    //$('#etq').text(eventTypeQuery);
	    }
      });
    }
  
  }


function showAllEvents(){
  showEvents(events[0].startDate, events[events.length-1].startDate);
  $('#dateRangeDescription').html('<p>Showing all events</p>');
  }






function daysInMonth(iMonth, iYear){
  return 32 - new Date(iYear, iMonth, 32).getDate();
  }


function calendar(){
  
  this.show = show;
  this.setTheMonth = setTheMonth;
  this.setTheYear = setTheYear;
  this.addDates = addDates;
  this.clearDates = clearDates;
  this.createCalendarNav = createCalendarNav;
  this.createTable = createTable;
  
  this.events = new Array();
  
  
  this.parseEvents = parseEvents;

  var month = this.month;
  var year = this.year;
  var selectedDay = this.selectedDay;
  
  }
  
  
  function setTheMonth(theMonth){
    this.month = theMonth;
    }
	
  function setTheYear(theYear){
    this.year = theYear;
    }


  function show(theElement){
	parseEvents();
	createCalendarNav(theElement);  
    createTable(theElement);    	
	today = new Date();
	setTheMonth(today.getMonth()+1);
	setTheYear(today.getFullYear());
	addDates();
    //showEvents(1 + ' ' + today.getMonthName() + ' ' + today.getFullYear(), daysInMonth(today.getMonth(), today.getFullYear()) + ' ' + today.getMonthName() + ' ' + today.getFullYear());
	showInitialEvents(1 + ' ' + today.getMonthName() + ' ' + today.getFullYear(), daysInMonth(today.getMonth(), today.getFullYear()) + ' ' + today.getMonthName() + ' ' + today.getFullYear());
	addExtraNav(theElement);
    }

  function addExtraNav(theElement){
	//$('#'+theElement).append('<p id="thisWeek" class="extraNav">This week</p>');
	//$('#'+theElement).append('<p id="nextWeek" class="extraNav">Next week</p>');
	//$('#'+theElement).append('<h2 style="margin-top: 1em;">Choose date range</h2>');
	$('#'+theElement).append('<form action=""><fieldset id="dateRange"><input type="button" value="Show" id="dateRangeButton" /> <label for="rangeSelector">events for </label>	<select id="rangeSelector"></select></fieldset></form>');
	$('#rangeSelector').append('<option value="today">today</option>');
	$('#rangeSelector').append('<option value="thisWeek">this week</option>');
	$('#rangeSelector').append('<option value="nextWeek">next week</option>');
	$('#rangeSelector').append('<option value="thisMonth" selected="selected">this month</option>');
	$('#rangeSelector').append('<option value="nextMonth">next month</option>');
	$('#rangeSelector').append('<option value="thisYear">this year</option>');
	$('#rangeSelector').append('<option value="nextYear">next year</option>');
	$('#rangeSelector').append('<option value="any">any date</option>');
    }


  function createCalendarNav(theElement){
	$('#'+theElement).append('<h2 style="margin-bottom: 1em;">Calendar</h2>');  
	  
    var previousMonth = document.createElement('div');
	previousMonth.setAttribute('id', 'prevMonth');
	previousMonth.setAttribute('title', 'Go to previous month');
	var prevMonthText = document.createTextNode('<');
	previousMonth.appendChild(prevMonthText);
	
    var nextMonth = document.createElement('div');
	nextMonth.setAttribute('id', 'nextMonth');
	nextMonth.setAttribute('title', 'Go to next month');
	var nextMonthText = document.createTextNode('>');
	nextMonth.appendChild(nextMonthText);
	
	var monthName = document.createElement('div');
	monthName.setAttribute('id', 'monthname');
	
	var calendarNav = document.createElement('div');
	calendarNav.setAttribute('id', 'calendarNav');
	
	document.getElementById(theElement).appendChild(calendarNav);
	
	calendarNav.appendChild(previousMonth);
	calendarNav.appendChild(monthName);
	calendarNav.appendChild(nextMonth);
	
    previousMonth.onclick = function(){changeMonth(-1)};
    if(previousMonth.captureEvents) previousMonth.captureEvents(Event.CLICK);
	
    nextMonth.onclick = function(){changeMonth(1)};
    if(nextMonth.captureEvents) nextMonth.captureEvents(Event.CLICK);	
	
    }

  function changeMonth(increment, baseMonth, baseYear){	  
    if(baseMonth == undefined) baseMonth = this.month;
	if(baseYear != undefined) this.setTheYear(baseYear);
	var newMonth = baseMonth + increment;
	if(newMonth == 13){
	  newMonth = 1;
	  this.setTheYear(this.year +1);
	  }
	if(newMonth == 0){
	  newMonth = 12;
	  this.setTheYear(this.year -1);
	  }
    setTheMonth(newMonth);
	clearDates();
	addDates();
    }

  function showCalendarMonth(theStartDate){
	theStartDate = new Date(theStartDate);
	var startMonth = theStartDate.getMonth()+1;
	var startYear = theStartDate.getFullYear();
	if(startMonth != this.month || startYear != this.year){
      setTheMonth(startMonth);
	  setTheYear(startYear);
	  clearDates();
	  addDates(false);
	  }
    }


  function clearDates(){
    var tBody = document.getElementById('calendarBody');
    while (tBody.childNodes[0]) {
      tBody.removeChild(tBody.childNodes[0]);
	  }
    }

  function createTable(theElement){
    var theTable = document.createElement('table');
	theTable.setAttribute('id', 'calendar');
	var tHead = document.createElement('thead');
	theTable.appendChild(tHead);
    var tBody = document.createElement('tbody');
    tBody.setAttribute('id', 'calendarBody');
    theTable.appendChild(tBody);
    var headerRow = document.createElement('tr');
    var headerCells = new Array();
    var columnHeaders = new Array();
    var dayNames = new Array('', 'Mon', 'Tues', 'Weds', 'Thur', 'Fri', 'Sat', 'Sun');
    for(var i=0; i<7; i++){
      headerCells[i] = document.createElement('th');
      columnHeaders[i] = document.createTextNode(dayNames[i+1].substring(0,1));
      headerCells[i].appendChild(columnHeaders[i]);
      headerRow.appendChild(headerCells[i]);
      }
	tHead.appendChild(headerRow);
    document.getElementById(theElement).appendChild(theTable);
    }


  function addDates(showTheEvents){
	if(showTheEvents == undefined) showTheEvents = true;
	var seedDate = this.month + '/01/' + this.year;
    var firstDay = new Date(seedDate);
    var monthNames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
	
	var theMonthName = document.getElementById('monthname')
	var theMonth = this.month;
	var theYear = this.year;
	
    theMonthName.innerHTML = monthNames[this.month - 1] + ' ' + this.year;
	theMonthName.title = 'View all events for ' + theMonthName.innerHTML;
	theMonthName.onclick = function(){
		showEventsForMonth(theMonth, theYear);
		};
    if(theMonthName.captureEvents) theMonthName.captureEvents(Event.CLICK);
	
    firstDay.setDate(1);
    var theFirst = firstDay.getDay();
    var theDay = 1-theFirst;
	// If the first day is a Sunday...
	if(theDay == 1)theDay = -6;
	var totalDays = daysInMonth(this.month-1, this.year);
    for(var j=0; j<5; j++){
      var weekRow = document.createElement('tr');
      weekRow.setAttribute('class', 'calendarRow');
      document.getElementById('calendarBody').appendChild(weekRow);
      for(var i=0; i<7; i++){
	    theDay += 1;
        var dayCell = document.createElement('td');
  	    if(theDay > 0 && theDay <= totalDays){ 
	      theDate = this.month + '/' + theDay + '/' + this.year;
		  var hasEvents = false;	
	      for(var l=0; l<events.length; l++){
	        if(events[l].isToday(theDate)){
	          hasEvents = true;
		      }
	        }
          var dateText = theDay;
		  if(hasEvents){
			dayCell.setAttribute('class', 'hasEvents');
  		    dayCell.className = 'hasEvents';
		    }
	      var cellContent = document.createTextNode(dateText);
		  }
	    else{
	      var cellContent = document.createTextNode('');
		  }	  
	    dayCell.appendChild(cellContent);
	    weekRow.appendChild(dayCell);
        }
	  }
	  var theCalendar = document.getElementById('calendarBody');
	  var dates = theCalendar.getElementsByTagName('td');
	  for(var k=0; k<dates.length; k++){
	    if(dates[k].className.search('hasEvents') > -1){
	      dates[k].onclick = showDate;
          if(dates[k].captureEvents) dates[k].captureEvents(Event.CLICK);
	      }
	    }
	calendarMonth = this.month;
	calendarYear = this.year;
    if(showTheEvents)showEventsForMonth(this.month, this.year)
    }



  function showEventsForMonth(month, year){
	var startDate = month + '/' + '01' + '/' + year;	
	var endDate = month + '/' + daysInMonth(month-1, year) + '/' + year;	
	showEvents(startDate, endDate);
    }
	
  // This funcion provides the initial display of events when the calendar page first loads
  // It will try to find the number of events specified by the variable initialEventCount by looking first at the current month and then subsequent months until either a) the number of events is found or b) there are no more events in the calendar
  function showInitialEvents(startDate, endDate){
	var initialEvents = new Array();
	var theEndDate = new Date(endDate);
	var lastEventStartDate = events[events.length -1].startDate;
	for(var i=0; i<events.length; i++){
      if(Date.parse(events[i].startDate) >= Date.parse(startDate) && Date.parse(events[i].startDate) <= Date.parse(endDate)){
	    initialEvents.push(events[i]);
	    }
	  }
	//alert('Start date: ' + startDate + '\nEnd date: ' + endDate + '\nEvent count: ' + initialEvents.length);
	if(initialEvents.length < initialEventCount){
	  var theEndMonth = theEndDate.getMonth();
	  var theEndYear = theEndDate.getFullYear();
	  var newEndMonth = theEndMonth + 2;
	  if(newEndMonth > 12){
	    newEndYear = theEndYear + 1;
		newEndMonth = 1;
	    }
	  else{
	    newEndYear = theEndYear;
	    }	  
	  newEndMonth = newEndMonth + '';
	  newEndDate = newEndMonth + '/' + daysInMonth(newEndMonth-1, newEndYear) + '/' + newEndYear;
	  var theTestDate = new Date(newEndMonth + '/' + daysInMonth(newEndMonth-1, newEndYear) + '/' + newEndYear);
	  //if(theTestDate.getMonth() < lastEventStartDate.getMonth()) showInitialEvents(startDate, newEndDate);
  	  //alert('Start date: ' + startDate + ' (' + Date.parse(startDate) + ')\nEnd Date: ' + newEndDate + ' (' + Date.parse(newEndDate) + ')');
	  if(Date.parse(theTestDate) < Date.parse(lastEventStartDate)) showInitialEvents(startDate, newEndDate);
	  else showEvents(startDate, newEndDate);
	  }
	else{
	  //alert(startDate + ' | ' + endDate);
	  showEvents(startDate, endDate);
	  }
    }


  function showTheDate(theDay, calendarDay){
	this.selectedDay = calendarDay;
	//this.selectedDay.style.backgroundColor = '#ffffff';
    showEvents(this.month + '/' + theDay + '/' + this.year);
    }

  function showDate(){
	var theDay = this.innerHTML;	
	if(theDay != ''){
      showTheDate(theDay, this);
	  var previousClassName = this.className;
	  clearCalendar();
	  //this.className = 'dateSelected';
	  this.className = previousClassName + ' dateSelected';	  
	  }
    }
	
  function clearCalendar(){
    var cells = document.getElementsByTagName('td');
	for(var i=0; i<cells.length; i++){
	  //cells[i].className = '';
	  cells[i].className = cells[i].className.replace('dateSelected', '');
	  }
    }
	
		
  function showEvents(startDate, endDate){
	//alert(startDate + '\n' + endDate);
	hideEvents();
	if(endDate == '' || endDate == undefined)endDate = startDate;	
	var startDate = new Date(startDate);	
	var endDate = new Date(endDate);	
	var eventsFound = false;
	dateShowing = '';
	for(var i=0; i<events.length; i++){
	  if(Date.parse(events[i].startDate) >= Date.parse(startDate) && Date.parse(events[i].startDate) <= Date.parse(endDate)){
		if(!allTypes){
		  if(events[i].isThisType(eventTypeQuery)){
		    events[i].show('eventlist');
			eventsFound = true;
		    }
		  }
		else{
	      events[i].show('eventlist');
		  eventsFound = true;
		  }
	    }
	  }   
    if(!eventsFound){
	  var noEventMsg = 'Sorry, we can\'t find any events matching your criteria. ';
	  if(!allTypes){
	    noEventMsg += 'Try ticking the Show all event types button to broaden your search.'
	    }
	  document.getElementById('event_message').innerHTML = noEventMsg;
	  }
	else{
	  document.getElementById('event_message').innerHTML = '';
	  }
	theStartDate = startDate;
	theEndDate = endDate;
	showCalendarMonth(startDate);
	showDateRangeDescription(startDate, endDate);
	highlightDates();
    }


  function parseEvents(){
    $("#staticEvents > .event").each(function(i){
	  events.push(new calendarEvent());
	  events[events.length-1].setTitle($(this).find('h3').text());
	  events[events.length-1].setUrl($(this).find('h3 > a').attr('href'));
	  events[events.length-1].setDescription($(this).find('.eventDescription').text());
	  events[events.length-1].setStartDate($(this).find('.startDate').text());
	  events[events.length-1].setSpeaker($(this).find('.keynoteSpeaker').text());
	  events[events.length-1].setClass($(this).attr('class'));
	  
	  // Added 29 November 2010 to enable images to be displayed - especially in the Arts section
	  $(this).find('.eventImage').each(function(){
	    events[events.length-1].setImage($(this).attr('title'));
	    });	  
	  events[events.length-1].setField();	  
	  // End of code added 29 November 2010	  
	  
  	  $(this).hide();	  	  
	  });
	}



function hideEvents(){
  var eventList = document.getElementById('eventlist');
  while (eventList.childNodes[0]) {
    eventList.removeChild(eventList.childNodes[0]);
    }
  }
  


function justDate(dateObject){
  return dateObject.getFullYear()+ ' ' + dateObject.getMonth()+ ' ' + dateObject.getDate();
  }
  
function eventTypes(){
  $('#eventlist > .event').hide();
  //$('#eventlist > .event').find('.lecture').show();
  $('#eventlist').find('.seminar, .lecture').show();
  //var eventSelector = '#eventlist > ' + eventTypeQuery.substring(0,eventTypeQuery.length-1);
  //$('#eventlist > .event').hide();
  //alert(eventSelector);
  //$(eventSelector).show();
  }


function showDateRangeDescription(startDate, endDate){
  startDateText = startDate.format('d MMM yyyy');
  endDateText = endDate.format('d MMM yyyy');
  var dateRangeDescription = '<p>Showing events ';   
  // Just one day selected
  if(startDateText == endDateText) dateRangeDescription += 'for ' + startDate.format('EE d MMM yyyy');
  // A whole month has been selected
  else if(startDate.format('d') == '1' && startDate.format('MMM') == endDate.format('MMM') && endDate.format('d') == daysInMonth(endDate.getMonth(), endDate.getFullYear())){
    dateRangeDescription += 'for ' + startDate.format('MMM') + ' ' + startDate.getFullYear();
    }	
  // A whole year has been selected
  else if(startDate.format('d') == '1' && startDate.format('M') == '1' && endDate.format('d') == '31' && endDate.format('M') == '12'){
	dateRangeDescription += 'for ' + startDate.format('yyyy');
    }  
  // Other range selected
  else dateRangeDescription += 'between ' + startDateText + ' and ' + endDateText;
  dateRangeDescription += '</p>';
  $('#dateRangeDescription').html(dateRangeDescription);
  }

  
function showTypeSelector(){
  $('#typeSelector').append('<h2 style="margin: 1em 0 1em 0;">Event types</h2>');
  $('#typeSelector').append('<p>You can refine the events displayed by ticking or unticking the boxes below.</p>');
  $('#typeSelector').append('<form action="" method="get" id="typeSelectorForm">');
  $('#typeSelector').append('<div style="margin-bottom: 1em;"><input type="checkbox" id="allEvents" value="all" name="allEvents" class="typeSelectAll" disabled="disabled" checked="checked" /> <label for="allEvents">Show all event types</label></div>');
  $('#typeSelector').append('<p>Show only events of the following types:</p>');  
  var eventTypes = $('#typeSelector').attr('class');
  eventTypes = eventTypes.substring(0, eventTypes.length-1);
  eventTypes = eventTypes.split('_');
  for(var i=0; i<eventTypes.length; i++){
    $('#typeSelector').append('<div class="typeSelectRow"><input type="checkbox" id="type' + eventTypes[i].split('|')[0] + '" value="' + eventTypes[i].split('|')[0] + '" name="eventType" class="typeSelect" /> <label for="type' + eventTypes[i].split('|')[0] + '">' + eventTypes[i].split('|')[1] + '</label></div>');	
    }
  $('#typeSelector').append('</form>');	  	
  }



function highlightDates(){
  var theMonthName = $('#monthname').text();
  $('td').each(function(i){
    if($(this).text() != ''){
      var teste = new Date($(this).text() + ' ' + theMonthName)
      if(Date.parse(teste) >= Date.parse(theStartDate) && Date.parse(teste) <= Date.parse(theEndDate)) $(this).addClass('dateSelected');
	  else $(this).removeClass('dateSelected');
	  }
    });
  }
