/**
 * TCalendar 0.2
 *
 * Some code based on
 * jQuery Calendar Widget Plugin (http://eisabainyo.net/weblog/2009/02/02/jquery-calendar-widget-plugin),
 * jQuery JCalendar (http://tedserbinski.com)
 *
 * Copyright (c) 2009 Roman Hrnčíř
 * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
 */

jQuery.tcalendar = function()
{

	var _drawCalendar = function(el, opt, selected, day, month, year)
	{
		if(selected)
		{
			dateParts = selected.split('-');
			if(Number(dateParts[0]) == year && Number(dateParts[1])-1 == month)
				var selectedDay = dateParts[2];
			else
				var selectedDay = false;
				
		}
		else
			var selectedDay = false;
		
		// previous month
		if (month == 0)
		{
			var prevMonth = 11;
			var prevYear = year - 1;
		}
		else
		{
			var prevMonth = month - 1;
			var prevYear = year;
		}

		// next month
		if (month == 11)
		{
			var nextMonth = 0;
			var nextYear = year + 1;
		}
		else
		{
			var nextMonth = month + 1;
			var nextYear = year;
		}
		
		var prevLink = jQuery('<a href="" class="linkPrev">&lsaquo;</a>').click(function() {
				jQuery.tcalendar.changeMonth(el, opt, selected, day, prevMonth, prevYear);
				return false;
		});
		
		var nextLink = jQuery('<a href="" class="linkNext">&rsaquo;</a>').click(function() {
				jQuery.tcalendar.changeMonth(el, opt, selected, day, nextMonth, nextYear);
				return false;
		});

		var calTable = jQuery('<table cellpadding="0" cellspacing="0"></table>');
		var headRow = jQuery('<tr></tr>');
		headRow.append('<th align="center"><span id="tcalendarPrevMonth"></span></td>');
		headRow.append('<th align="center" id="tcalendarCurrentMonthName" colspan="5">' + opt.monthNames[month] + ' ' + year + '</td>');
		headRow.append('<th align="center"><span id="tcalendarNextMonth"></span></td>');
		headRowNav = jQuery('<thead></thead>').append(headRow);
		
		var headRow = jQuery('<tr></tr>');
		for (d=1; d<7; d++)
		{
			headRow.append('<th class="tcalendarWeekday">' + opt.dayNames[d] + '</th>');
		}
		headRow.append('<th class="tcalendarWeekday">' + opt.dayNames[0] + '</th>');
		headRow = jQuery('<thead></thead>').append(headRow);

		
		var days = _getDaysInMonth(month, year);
		var firstDayDate = new Date(year, month, 0);
		var firstDay = firstDayDate.getDay();

		var prev_days = _getDaysInMonth(month, year);
		var firstDayDate = new Date(year, month, 0);
		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 tBody = jQuery('<tbody></tbody>');
		var i = 0;
		var dayStr = '';
		var thisRow = jQuery('<tr></tr>');
		var actionDay = 0;
		
		var prevMonth;
		var prevYear;

		for (j = 0; j < 42; j++)
		
    {

		var atts = {};


			if (j < firstDay)
			{
				atts['class'] = 'tcalendarOtherMonth';

				var currDay = (prev_days - firstDay + j + 1);
				var currDate = prevYear + '-' + _zeroPad(prevMonth + 1, 2) + '-' + _zeroPad(currDay, 2);

				if(_getActionDay(opt.actions, Number(currDay), prevMonth, prevYear))
				{
					atts['class'] += ' tcalendarAction';
					dayStr = '<a href="' + opt.target + currDate + '" title="Book now!">' + currDay + '</a>';


				}
				else
				{
					dayStr = currDay;

				}
			}
				else if ( j >= firstDay + _getDaysInMonth(month, year))
{
if (j % 7 == 0)
break;			

				i = i + 1;
				atts['class'] = 'tcalendarOtherMonth';
				var currDate = nextYear + '-' + _zeroPad(nextMonth + 1, 2) + '-' + _zeroPad(i, 2);

				if(_getActionDay(opt.actions, Number(i), nextMonth, nextYear))
				{
					atts['class'] += ' tcalendarAction';
					dayStr = '<a href="' + opt.target + currDate + '" title="Book now!">' + i + '</a>';


				}
				else
				{
					dayStr = i;

				}

			}
			else
			{
				var currDay = (j - firstDay + 1);

				if(_getActionDay(opt.actions, currDay, month, year))
				{
					actionDay = 1;
					var cssClass = 'tcalendarAction';
				}
				else
				{
					actionDay = 0;
					var cssClass = '';
				}
				
				if(selectedDay != 0 && selectedDay == currDay)
				{
					var cssClass = cssClass + ' tcalendarCurrentDay';
				}
				else
				{
					var cssClass = cssClass + ' tcalendarDay';
				}
					

				atts['class'] = 'tcalendarCurrentMonth ' + cssClass;
				
				var currDate = year + '-' + _zeroPad(month + 1, 2) + '-' + _zeroPad(currDay, 2);

				if(typeof(opt.target) != 'undefined' && selectedDay != currDay)
				{
										
					if(!_isArray(opt.actions) || actionDay == 1)
					{
						dayStr = '<a href="' + opt.target + currDate + '" title="Book now!">' + currDay + '</a>';


					}
					else
					{
						dayStr = currDay;

	
					}
				}
				else
				{
					if(!_isArray(opt.actions) || actionDay == 1)
					{
						dayStr = '<a href="' + opt.target + currDate + '" title="Book now!">' + currDay + '</a>';

					}
					else
					{
						dayStr = currDay;

					}
				}
			}

			thisRow.append(jQuery('<td align="center"></td>').attr(atts).append(dayStr));
			
			if (j % 7 == 6)
			{
				tBody.append(thisRow);
				var thisRow = jQuery('<tr></tr>');
			}
	
		}
		calTable.append(headRowNav, headRow, tBody);
		
		el.html('<div></div>');
		el.append(calTable);

		if(opt.minDate)
		{
			dateParts = opt.minDate.split('-');
			if(parseInt(dateParts[0]) != year || (parseInt(dateParts[0]) == year && parseInt(dateParts[1])-1 != month))
				jQuery('#tcalendarPrevMonth').append(prevLink);

		}
		else
			jQuery('#tcalendarPrevMonth').append(prevLink);

		if(opt.maxDate)
		{
			dateParts = opt.maxDate.split('-');
			if(parseInt(dateParts[0]) != year || (parseInt(dateParts[0]) == year && parseInt(dateParts[1])-1 != month))
				jQuery('#tcalendarNextMonth').append(nextLink);

		}
		else
			jQuery('#tcalendarNextMonth').append(nextLink);

	
	};
	
	var _getDaysInMonth = function(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];
		}
	};
	
	var _getActionDay = function(actions, day, month, year)
	{
		if(_isArray(actions) && _isArray(actions[year])
			&& _isArray(actions[year][month]) && actions[year][month][day] == 1)

			return true;
	};

	var _zeroPad = function (n, digits)
	{
		n = n.toString();
		while(n.length < digits)
		{
			n = '0' + n;
		}
		return n;
	};

	var _isArray = function (input)
	{
		return typeof(input)=='object'&&(input instanceof Array);
	};
	
	return {
		
		show: function(el, opt)
		{
			if(typeof(opt) == 'undefined')
			{
				var opt = {'date' : '', 'target' : '', 'minDate' : '', 'maxDate' : ''};
			}

			if(typeof(opt.date) == 'undefined')
			{
				var now = new Date();
				var day = now.getDate();
				var month = now.getMonth();
				var year  = now.getFullYear();
				var selected = year + '-' + (month + 1) + '-' + day;
			}
			else
			{
				var selected = opt.date;
				var dateParts = opt.date.split('-');
				
				var day = Number(dateParts[2]);
				var month = Number(dateParts[1])-1;
				var year  = Number(dateParts[0]);
			}
			
			if(typeof(opt.monthNames) == 'undefined')
				opt.monthNames = ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'];
			

			if(typeof(opt.monthNames) == 'undefined')
				opt.dayNames = ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'];

			if(typeof(opt.actions) != 'undefined')
			{
				var tmpActions = new Array();
				for (i = 0; i < opt.actions.length; ++ i)
				{
					var dateParts = opt.actions[i].split('-');
					
					var tmpYear = Number(dateParts[0]);
					var tmpMonth = Number(dateParts[1]);
					var tmpDay = Number(dateParts[2]);
					
					tmpMonth = tmpMonth - 1;
					
					if(!_isArray(tmpActions[tmpYear]))
						tmpActions[tmpYear] = new Array();
					if(!_isArray(tmpActions[tmpYear][tmpMonth]))
						tmpActions[tmpYear][tmpMonth] = new Array();
					
					tmpActions[tmpYear][tmpMonth][tmpDay] = 1;				
					
				}

				opt.actions = tmpActions;
			}
			else
				opt.actions = '';
				
			_drawCalendar(el, opt, selected, day, month, year);
		},

		changeMonth: function(el, opt, selected, day, month, year)
		{
			
			_drawCalendar(el, opt, selected, day, month, year);
		}
	};
	
}();

// jQuery plugin initialisation
jQuery.fn.tcalendar = function(opt)
{
		jQuery.tcalendar.show(this, opt);
		return this;
};

