/**
 * jCalendar 0.5
 * 
 * Some code based on jQuery Date Picker
 * (http://kelvinluck.com/assets/jquery/datePicker/)
 * 
 * Copyright (c) 2007 Theodore Serbinski (http://tedserbinski.com) Dual licensed
 * under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
 */
jQuery.jcalendar = function() {
	var months = [ 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
			'juli', 'augustus', 'september', 'oktober', 'november', 'december' ];
	var days = [ 'zo', 'ma', 'di', 'wo', 'do', 'vr', 'za' ];
	var navLinks = {
		p :'<img src="/images/agendanavl.jpg" class="agendanavl" />',
		n :'<img src="/images/agendanavr.jpg" class="agendanavr" />'
	};
	
	var _firstDayOfWeek;
	var _firstDate;
	var _lastDate;
	var _selectedDate;

	var _drawCalendar = function(dateIn, a, date) {
		var today = new Date();
		var d;
		
		// start from the passed in date
		d = new Date(dateIn);
		d.setDate(1);
	
		// check that date is within allowed limits
		if ((d.getMonth() < _firstDate.getMonth() && d.getFullYear() == _firstDate
				.getFullYear())
				|| d.getFullYear() < _firstDate.getFullYear()) {
			d = new Date(_firstDate.getFullYear(), _firstDate.getMonth(), 1);
		} else if ((d.getMonth() > _lastDate.getMonth() && d.getFullYear() == _lastDate
				.getFullYear())
				|| d.getFullYear() > _lastDate.getFullYear()) {
			d = new Date(_lastDate.getFullYear(), _lastDate.getMonth(), 1);
		}

		var firstMonth = true;
		var firstDate = _firstDate.getDate();

		// create prev and next links
		if (!(d.getMonth() == _firstDate.getMonth() && d.getFullYear() == _firstDate
				.getFullYear())) {
			// not in first display month so show a previous link
			firstMonth = false;
			var lastMonth = d.getMonth() == 0 ? new Date(d.getFullYear() - 1,
					11, 1) : new Date(d.getFullYear(), d.getMonth() - 1, 1);
			var prevLink = jQuery(
					'<a href="" class="link-prev">' + navLinks.p + '</a>')
					.click(
							function() {
								jQuery.jcalendar.changeMonth(lastMonth, this,
										date);
								return false;
							});
		}

		var finalMonth = true;
		var lastDate = _lastDate.getDate();

		if (!(d.getMonth() == _lastDate.getMonth() && d.getFullYear() == _lastDate
				.getFullYear())) {
			// in the last month - no next link
			finalMonth = false;
			var nextMonth = new Date(d.getFullYear(), d.getMonth() + 1, 1);
			var nextLink = jQuery(
					'<a href="" class="link-next">' + navLinks.n + '</a>')
					.click(
							function() {
								jQuery.jcalendar.changeMonth(nextMonth, this,
										date);
								return false;
							});
		}
		/*
		 * var todayLink = jQuery('<a href="" class="link-today">'+ navLinks.t +'</a>').click(function() {
		 * day.val(today.getDate()); jQuery.jcalendar.changeMonth(today, this,
		 * day, month, year); return false; });
		 */
		// update the year and month select boxes
		//year.val(d.getFullYear());
		//month.val(d.getMonth() + 1);
		
		//date.val(dateIn);

		var headRow = jQuery("<tr class='legend'></tr>");
		for ( var i = _firstDayOfWeek; i < _firstDayOfWeek + 7; i++) {
			var weekday = i % 7;
			var wordday = days[weekday];
			headRow.append('<th>' + wordday + '</th>');
		}
		
		var tBody = jQuery("<tbody></tbody>");
		tBody.append(headRow);
		
		var lastDay = (new Date(d.getFullYear(), d.getMonth() + 1, 0))
				.getDate();
		var prevLastDay = (new Date(d.getFullYear(), d.getMonth(), 0))
				.getDate();
		var curDay = _firstDayOfWeek - d.getDay();
		if (curDay > 0)
			curDay -= 7;

		var todayDate = today.getDate();
		var thisMonth = d.getMonth() == today.getMonth()
				&& d.getFullYear() == today.getFullYear();
		
		var selectedDate = new Date(date.val());
		
		var currentYear = d.getFullYear();
		var currentMonth = d.getMonth();
		// render calendar
		
		var weeksleft = 6;
		
		do {
			var thisRow = jQuery("<tr></tr>");
			
			for ( var i = 0; i < 7; i++) {
				var weekday = (_firstDayOfWeek + i) % 7;
				var atts = { 'class' : '' };
				d.setMonth(currentMonth);
				d.setYear(currentYear);
				if (curDay < 0) {
					dayStr = prevLastDay + curDay + 1;
					d.setDate(1);
					d.setMonth(currentMonth - 1);
					atts['class'] += ' lastmonth';
				} else if (curDay >= lastDay) {
					dayStr = curDay - lastDay + 1;
					d.setDate(1);
					d.setMonth(currentMonth + 1);
					atts['class'] += ' nextmonth';
				}  else {
				    dayStr = curDay + 1;	
				}
					d.setDate(dayStr);

					// attach a click handler to every day to select it if
					// clicked
					// we use the rel attribute to keep track of the day that is
					// being clicked
					dayStr = jQuery(
							'<a href="" rel="' + d + '">' + d.getDate()
									+ '</a>').click( function(e) {
						if (_selectedDate) {
							_selectedDate.removeClass('selected');
						}
						_selectedDate = jQuery(this);
						_selectedDate.addClass('selected');
						date.val(new Date(_selectedDate.attr('rel')));
						jQuery.jcalendar.changeMonth(d, this,
								date);
						
						date[0].form.action = "/Agenda.html";
					
						Event.fireEvent(date[0].id,"change");

						return false;
					});

					// highlight the current selected day
					if (selectedDate+"" == d+"") { 
						_selectedDate = dayStr;
						atts['class'] += ' selected';
					}
				

				if (thisMonth && curDay + 1 == todayDate) {
					atts['class'] += ' today';
				}
				thisRow.append(jQuery("<td></td>").attr(atts).append(dayStr));
				curDay++;
				
				d.setMonth(currentMonth);
				d.setYear(currentYear);

			}
			
			tBody.append(thisRow);
			
		} while (--weeksleft > 0); //(curDay < lastDay);

		jQuery('div.jcalendar').html('<div class="month">'
				+'<div class="prev"></div>'
				+'<div class="next"></div>'
				+'<div class="name"></div>'
				+'</div>'
				+'<table cellpadding="0" cellspacing="0" class="calendar"></table>');
		
		jQuery('div.jcalendar > div.month > div.prev').html(prevLink);
		jQuery('div.jcalendar > div.month > div.name').html(months[d.getMonth()] + " " + d.getFullYear());
		jQuery('div.jcalendar > div.month > div.next').html(nextLink);
		
		jQuery('div.jcalendar table').append(tBody);
	};

	return {
		show : function(a, date) {
			_firstDate = a._startDate;
			_lastDate = a._endDate;
			_firstDayOfWeek = a._firstDayOfWeek;

			// pass in the selected form date if one was set
			selected = new Date(date.val());
			if(selected == "Invalid Date") {
				selected = new Date();
			}
			
			_drawCalendar(selected, a, date);
		},
		changeMonth : function(d, e, date) {
			_drawCalendar(d, e, date);
		},
		/**
		 * Function: setLanguageStrings
		 * 
		 * Allows you to localise the calendar by passing in relevant text for the
		 * english strings in the plugin.
		 * 
		 * Arguments: days - Array, e.g. ['Sunday', 'Monday', 'Tuesday',
		 * 'Wednesday', 'Thursday', 'Friday', 'Saturday'] months - Array, e.g.
		 * ['January', 'Febuary', 'March', 'April', 'May', 'June', 'July', 'August',
		 * 'September', 'October', 'November', 'December']; navLinks - Object, e.g.
		 * {p:'Prev', n:'Next', c:'Close', b:'Choose date'}
		 */
		setLanguageStrings : function(aDays, aMonths, aNavLinks) {
			days = aDays;
			months = aMonths;
			navLinks = aNavLinks;
		},
		/**
		 * Function: setDateWindow
		 * 
		 * Used internally to set the start and end dates for a given date select
		 * 
		 * Arguments: i - The id of the INPUT element this date window is for w -
		 * The date window - an object containing startDate and endDate properties
		 * e.g. {startDate:'24-11-1981', endDate:'25-12-2012}
		 */
		setDateWindow : function(i, w) {
			if (w == undefined)
				w = {};
			i._startDate = new Date(2000, 1, 1);
			i._endDate = new Date(2100, 0, 0);
			
			i._firstDayOfWeek = w.firstDayOfWeek == undefined ? 1 : w.firstDayOfWeek;
		}
	};
}();

jQuery.fn.jcalendar = function(a) {
	this.each( function() {
		jQuery(this).append('<div class="jcalendar"></div>');
		var date = jQuery(this).find('input.jcalendar-input-date');

		jQuery.jcalendar.setDateWindow(this, a);
		
		jQuery.jcalendar.show(this, date);

	});
	return this;
};

