/**
 * 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 = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var days = ['N', 'Pn', 'W', 'Ś', 'C', 'P', 'S'];
	var navLinks = {p:'', n:'', t:'Dzisiaj'};
	var swieta = [];
	
	var _firstDayOfWeek;
	var _firstDate;
	var _lastDate;
	var _selectedDate;

	var _drawCalendar = function(dateIn, a) {
	  var today = new Date();
	  var d;

		if (dateIn == undefined) {
			// start from this month.
			d = new Date(today.getFullYear(), today.getMonth(), 1);
		}
		else {
			// start from the passed in date
			d = 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">&#171; <span>'+ months[lastMonth.getMonth()] +'</span></a>').click(function() {
				jQuery.jcalendar.changeMonth(lastMonth, this);
				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"><span>'+ months[nextMonth.getMonth()] +'</span> &#187;</a>').click(function() {
				jQuery.jcalendar.changeMonth(nextMonth, this);
				return false;
			});
		}

		var todayLink = jQuery('<a href="" class="link-today">'+ navLinks.t +'</a>').click(function() {
			jQuery.jcalendar.changeMonth(today, this);
			return false;
		});

		var monthRow = jQuery("<caption></caption>");
		monthRow.append(months[dateIn.getMonth()]);
		
		var headRow = jQuery("<tr></tr>");
		for (var i=_firstDayOfWeek; i<_firstDayOfWeek+7; i++) {
			var weekday = i%7;
			var wordday = days[weekday];
			headRow.append('<th scope="col" abbr="'+ wordday +'" title="'+ wordday +'" class="'+ (weekday == 0 || weekday == 6 ? 'weekend' : 'weekday') +'">'+ wordday +'</th>');
		}
		headRow = jQuery("<thead></thead>").append(headRow);

		var tBody = jQuery("<tbody></tbody>");
		var lastDay = (new Date(d.getFullYear(), d.getMonth()+1, 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();

    // render calendar
		do {
 		  var thisRow = jQuery("<tr></tr>");
			
	  		for (var i=0; i<7; i++) 
			{
	  			var weekday = (_firstDayOfWeek + i) % 7;
	  			var atts = {'class':(weekday == 0 || weekday == 6 ? 'weekend ' : 'weekday ')};

	  			if (curDay < 0 || curDay >= lastDay) {
	  				dayStr = ' ';
	  			}
	  			else if (firstMonth && curDay < firstDate-1) {
	  				dayStr = curDay+1;
	  				atts['class'] += 'inactive';
	  			}
	  			else if (finalMonth && curDay > lastDate-1) {
	  				dayStr = curDay+1;
	  				atts['class'] += 'inactive';
	  			}
	  			else 
				{
	  				d.setDate(curDay+1);
	  				// 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
					var sTemp = d.getDate()+'.'+(d.getMonth()+1);
					
					if(aaDate[sTemp])
						var sInsertTitle = 'title="'+aaDate[sTemp]+'" class="showTooltip"';
					else
						var sInsertTitle = '';
					
	  				dayStr = jQuery('<span rel="'+ d +'" id="date_'+sTemp+'" '+sInsertTitle+'>'+ (curDay+1) +'</span>');
	  			}

	  			if (thisMonth && curDay+1 == todayDate) 
	  				atts['class'] += 'today';

	  			sRow = jQuery("<td></td>").attr(atts).append(dayStr).removeClass('selected');

				var sDay   = curDay+1;
				var sMonth = dateIn.getMonth()+1;
				
				for(var q = 0; q < swieta.length; q++)
				{
					var aSplit = swieta[q].split(".");
					if(aSplit[0] == sDay && aSplit[1] == sMonth)
						sRow.addClass('selected');
				}
				
				thisRow.append(sRow);
		
	  			curDay++;
	      }

			tBody.append(thisRow);
		} while (curDay < lastDay);

		jQuery('div.jcalendar').html('<table cellspacing="0"></table><div class="jcalendar-links"></div>');
		jQuery('div.jcalendar table').append(monthRow, headRow, tBody);
		jQuery('div.jcalendar > div.jcalendar-links').append(prevLink, todayLink, nextLink);
		
		jQuery('span.showTooltip').Tooltip({
				delay: 0,
				fixPNG: true
			});
	};

	return {
		show: function(a) {
 			_firstDate = a._startDate;
			_lastDate = a._endDate;
			_firstDayOfWeek = 1;
			_drawCalendar(new Date(), a);
		},
		changeMonth: function(d, e) {
			_drawCalendar(d, e);
		},
		/**
		* 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, aSwieta, aDate) {
			days = aDays;
			months = aMonths;
			navLinks = aNavLinks;
			swieta = aSwieta;
			aaDate = aDate;
		},
		/**
		* 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, year) 
		{
			if (w == undefined) w = {};
			
			if (w.startDate == undefined) 
			{
				// set the minimum browseable date equal to January of the min year in the select box
				// don't get the first option because that is an empty year
				// note we can't do this: year.find('option:eq(1)').val()
				// it doesn't work in 1.0 since find() is destructive
				// so we copy the object to a new var
				i._startDate = new Date($(year).find('option:eq(1)').val(), 0, 1);
			}
			else 
			{
	  			dateParts = w.startDate.split('-');
	  			i._startDate = new Date(dateParts[2], Number(dateParts[1])-1, Number(dateParts[0]));
			}
			
			if (w.endDate == undefined) 
			{
			   // set the maximum browseable date equal to December of the max year in the select box
			   // note we can't do this: year.find('option:last').val()
				// it doesn't work in 1.0 since find() is destructive
				// so we copy the object to a new var
				i._endDate = new Date($(year).find('option:last').val(), 11, 1);
			}
			else 
			{
	  			dateParts = w.endDate.split('-');
	  			i._endDate = new Date(dateParts[2], Number(dateParts[1])-1, Number(dateParts[0]));
			}
			
			i._firstDayOfWeek = w.firstDayOfWeek == undefined ? 1 : w.firstDayOfWeek;

		}
	};
}();

jQuery.fn.jcalendar = function(a) 
{
	this.each(
		function() 
		{
			$(this).after('<div class="jcalendar"></div>');
			//this._firstDayOfWeek = a.firstDayOfWeek;
		
			jQuery.jcalendar.setLanguageStrings(a.aDays, a.aMonths, a.aNavLinks, a.swieta, a.aDate);
			jQuery.jcalendar.setDateWindow(this, a, '2008');
			jQuery.jcalendar.show(this);
		}
	);
	
	return this;
};