setCalendarCookie = function(month,year) {
  $.cookie('calendar_month', month, { expires: 7, path: '/' });
  $.cookie('calendar_year', year, { expires: 7, path: '/' });
}

$("#calendar .current-month").live("mouseenter", function(){
  $(this).find(".panel_holder").fadeIn();
}).live("mouseleave", function(){
  $(this).find(".panel_holder").fadeOut();
});

$("#calendar .nav-prev a,#calendar .nav-next a").live("click", function(){
  var link = $(this);
  var calendar_container = link.closest("#calendar");
  month = link.attr("href").split('month=')[1].split('&')[0];
  year = link.attr("href").split('year=')[1];
  setCalendarCookie(month-1,year);
  // Not very clean:
  calendar_container.load(link.attr("href"), function(){calendar_container.find("h2").remove()});
  return false;
});

makeNumber2Digit = function(num) {
  return (num < 10 ? '0' : '') + num
}

Array.prototype.getAll=function(d,c){
  c=c||function(f){return f};
  var e=c(d);
	var array = [];
  for(var b=0,a=this.length;b<a;++b){
		if(c(this[b]).equals(e)){
		  array.push(this[b]);
		}
	}
	return array;
};

Date.prototype.equals = function(date){
 if (!date) return false;
 return this.toString() == date.toString();
};

(function($) { 
   
	function calendarWidget(el, params, events) { 
	
	
	  var url = "/contentblokken/calender"
		
		var now   = new Date();
		//var thismonth = now.getMonth();
    var cmonth = $.cookie('calendar_month');
    cmonth = parseInt(cmonth,10);
    if ( isNaN(cmonth) ) { thismonth = now.getMonth(); }
    else {thismonth = cmonth}
		//var thisyear  = now.getYear() + 1900;
		//var thisyear  = now.getFullYear();
    
    var cyear = $.cookie('calendar_year');
    cyear = parseInt(cyear,10);
    if ( isNaN(cyear) ) { thisyear = now.getFullYear(); }
    else {thisyear = cyear}
    
		var thisdate   = now.getDate();
		now = new Date(thisyear,thismonth,thisdate,0,0,0,0);
		
		var opts = {
			month: thismonth,
			year: thisyear
		};
		
		$.extend(opts, params);
		
		var monthNames = ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'];
		//var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
		var dayNames = ['Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'];
		month = i = parseInt(opts.month);
		year = parseInt(opts.year);
		var m = 0;
		var table = '';
		
			// next month
			if (month == 11) {
				var next_month = '<a href="'+url+'?month=' + 1 + '&amp;year=' + (year + 1) + '" title="' + monthNames[0] + ' ' + (year + 1) + '">' + monthNames[0] + ' ' + (year + 1) + ' &gt;</a>';
			} else {
				var next_month = '<a href="'+url+'?month=' + (month + 2) + '&amp;year=' + (year) + '" title="' + monthNames[month + 1] + ' ' + (year) + '">' + monthNames[month + 1]  + ' &gt;</a>';
			}
				
			// previous month
			if (month == 0) {
				var prev_month = '<a href="'+url+'?month=' + 12 + '&amp;year=' + (year - 1) + '" title="' + monthNames[11] + ' ' + (year - 1) + '">&lt; ' + monthNames[11] + ' ' + (year - 1) + '</a>';
			} else {
				var prev_month = '<a href="'+url+'?month=' + (month) + '&amp;year=' + (year) + '" title="' + monthNames[month - 1] + ' ' + (year) + '">&lt; ' + monthNames[month - 1] + '</a>';
			}		
				
			table += ('<h3 id="current-month">'+monthNames[month]+' '+year+'</h3>');
			// uncomment the following lines if you'd like to display calendar month based on 'month' and 'view' paramaters from the URL
			table += ('<div class="current-month-holder">');
			table += ('<div class="nav-prev">'+ prev_month +'</div>');
			table += ('<div class="nav-next">'+ next_month +'</div>');
			table += ('<div class="clear"></div>');
			table += ('<table class="calendar-month " ' +'id="calendar-month'+i+' " cellspacing="0" cellpadding="0">');	
		
			table += '<tr>';
			
			for (d=0; d<7; d++) {
				table += '<th class="weekday">' + dayNames[d] + '</th>';
			}
			
			table += '</tr>';
		
			var days = getDaysInMonth(month,year);
      var firstDayDate=new Date(year,month,1);
      var firstDay=firstDayDate.getDay();
			
			var prev_days = getDaysInMonth(month,year);
      var firstDayDate=new Date(year,month,1);
      var firstDay=firstDayDate.getDay();
			
			var prev_m = month == 0 ? 11 : month-1;
			var prev_y = prev_m == 11 ? year - 1 : year;
			var prev_days = getDaysInMonth(prev_m, prev_y);
			firstDay = (firstDay == 0 && firstDayDate) ? 7 : firstDay;
	
			var i = 0;
      for (j=0;j<42;j++){
			  if ((j<firstDay)){
          table += ('<td class="other-month"><span class="day">'+ (prev_days-firstDay+j+1) +'</span></td>');
			  } else if ((j>=firstDay+getDaysInMonth(month,year))) {
					i = i+1;
          table += ('<td class="other-month"><span class="day">'+ i +'</span></td>');			 
        }else{
			    var day = (j-firstDay+1)
			    var date = new Date(year,month,day,0,0,0,0);
		   				
					var style = "day"+day;

					// Today? 
					if (date.equals(new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate(),0,0,0,0))){
						style +=  " today"
					}
					
					// Event? 
					var panel = '';
					var dayevents = events.getAll({date:date}, function(val){return val?val.date:new Date();});
					if (dayevents.length > 0){
					  style += " event-" + dayevents[0].type;
						var len = dayevents.length;
						var k = 0;
						for (k=0;k<len;k++){
						  var dayevent = dayevents[k]
							panel += '<div class="panel_holder"><div class="panel"> \
							<h4>[TITLE]</h4> \
							<p>[DESCRIPTION]</p> \
							<p>[URL]</p> \
							</div></div>'
							.replace("[TITLE]",dayevent.title)
							.replace("[DESCRIPTION]",dayevent.calendarshort)
							.replace("[URL]",dayevent.url?('<a href="'+dayevent.url+'">Meer informatie</a>'):'')
						}
					}
					
          table += ('<td class="current-month '+style+'"><a class="calendar_link" href="/bezoeken?showday='+year+makeNumber2Digit(month+1)+makeNumber2Digit(day)+'" alt=""><span class="day">'+day+'</span></a>'+panel+'</td>');
        }
        if (j%7==6)  table += ('</tr>');
      }

      table += ('</table>');
    table += ('</div>');

		el.html(table);
	}
	
	function getDaysInMonth(month,year)  {
		var daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31];
		if ((month==1)&&(year%4==0)&&((year%100!=0)||(year%400==0))){
		  return 29;
		}else{
		  return daysInMonth[month];
		}
	}
	
	
	// jQuery plugin initialisation
	$.fn.calendarWidget = function(params, events) {    
		calendarWidget(this, params, events);		
		return this; 
	}; 

})(jQuery);

