
  function EventList()
  {
	  this.container = null;
	  this.display = null;
	  
	  this.setContainer = function(containerId)
	  {
		  this.container = $("#"+containerId).get(0);

		  if (!this.container)
		  {
			  alert("Container"+containerId+" for eventlist not found");
		  }

		  this.display = this.container.style.display;
		  
		  this.hide();
		  $(window).click(function(){eventList.hide();});

		  
		  
		 
	  }

	  this.hide = function()
	  {
		  if (this.hideNow)
		  {
			  this.container.style.display = 'none';
		  }

		  this.hideNow = true;
	  }

	  
	  this.hideNow = true;

	  this.show = function(events)
	  {
		  this.fill(events);
		  this.container.style.display = this.display;
		  this.hideNow = false;
	  }

	  this.fill = function(events)
	  {

		  html = dataProvider.preHtml;

		  var date;
		  
		  for (i = 0; i<events.length; i++)
		  {
			  html += events[i].html;
			  date = events[i].visibledate;
		  }
		  html += dataProvider.postHtml;
		  
		  
		  html = html.replace(/%visibledate%/g, date);
		  
		  this.container.innerHTML = html;

	  }

	  

	 
  }


  function EventDataProvider()
  {
	  
	  this.preHtml = '';
	  this.postHtml = '';
	  
	this.hasEvents = function( year, month, day)
	{
		   this.loadEvents(year,month,day);
		   return this.years[year].months[month].days[day] && this.years[year].months[month].days[day].events && this.years[year].months[month].days[day].events.length > 0;
	};

	this.eventCount = function( year, month, day)
	{
		   this.loadEvents(year,month,day);
		   return this.years[year].months[month].days[day].events.length;
	};

	this.getEvents = function( year, month, day)
	{
		   this.loadEvents(year,month,day);
		   return this.years[year].months[month].days[day].events;
	};
	
	this.years = new Array();

	this.loadEvents = function(year, month, day)
	{
		if (!this.years[year])
		{
			this.years[year] = new Year();
		} 

		if (!this.years[year].months[month])
		{
			this.years[year].months[month] = new Month();
			

			date = year+'-';
			if(month+1 < 10)
			{
				date = date +'0';
			}
			
			date = date + (month+1);
			
			//alert(location.href);
			// load the events for this month
			$.ajax({ 
				url: dataUrl+'&calaction=getajaxevents&date='+date, 
		        async: false,
		        success: 
		        	function(jsondata) {
			    		data = eval(jsondata);
			    		dataProvider.preHtml = data.prehtml;
			    		dataProvider.postHtml = data.posthtml;
			    		
			    		
						for (i = 0; i< data.events.length; i++)
						{

							eventdate = new Date(data.events[i].date);
							
							d = eventdate.getDate();
							
							if (!dataProvider.years[year].months[month].days[d])
							{
								newDay = new Day();
								dataProvider.years[year].months[month].days[d] = newDay;
							}
							else
							{
								newDay = dataProvider.years[year].months[month].days[d];
							}
							newDay.events[newDay.events.length] = data.events[i];
						}
			  		}
				});
			
		}

		if (!this.years[year].months[month].days[day])
		{
			this.years[year].months[month].days[day] = new Day();
		}
		
		
	}
  }

  function Year()
  {
	this.months = new Array();
  }

  function Month()
  {
	this.days = new Array();
  }

  function Day()
  {
	this.events = new Array();
  }

  function Event()
  {
	this.date = '';
	this.link='';
	this.html = '';
  }

  function dateChanged(calendar) {
    // Beware that this function is called even if the end-user only
    // changed the month/year.  In order to determine if a date was
    // clicked you can use the dateClicked property of the calendar:
    if (calendar.dateClicked) {
      // OK, a date was clicked, 
      
      cal = calendar;
    	
      var y = calendar.date.getFullYear();
      var m = calendar.date.getMonth();     // integer, 0..11
      var d = calendar.date.getDate();      // integer, 1..31

      // check if the date has events
      events = dataProvider.getEvents(y,m,d);

      
     /* if (events.length == 1)
      {
      	// redirect...
      	window.location = events[0].link;
      }
      else*/ 
    	  if (events.length > 0)
      {
        // show the eventlist frame
        eventList.show(events);
      }
    }
  };



// this is the actual date status handler.  Note that it receives the
// date object as well as separate values of year, month and date, for
// your confort.
function dateStatusHandler(date, y, m, d) {
    if (dataProvider.hasEvents(y, m, d)) return 'eventavailable';
    else return false;
    // return true above if you want to disable other dates
}

// configure it to the calendar


var dataProvider = new EventDataProvider();
var eventList = new EventList();
var cal;
