//---- Calendar ----

Calendar = {};
Calendar.langs = {
	weekDays: 		['PN', 'WT', 'ŚR', 'CZ', 'PT', 'SO', 'ND'],
	weekDaysFull: 	['Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela'],
	monthNames: 	['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
	todayIs:		"dziś jest"
};

(function($){

	$.fn.calendar = function(options)
	{
		// private variables
		var defaultSettings = {
			selectedMonth : new Date().getMonth()
		    ,selectedYear : new Date().getFullYear()
		    ,selectedDay : new Date().getDate()
		    ,nextMonth : 'Następny'
		    ,prevMonth : 'Poprzedni'
		    ,calendarId : 'calendarDiv'
		    ,inputClass : 'calendarSelectDate'
		    ,linksTableClass : 'linksTable'
		    ,pageId: null
		    ,module: null
		    ,url: 'calendar/{pageId}/{year}/{month}'
		}
		
		var settings = $.extend(defaultSettings, options);

		var events = new Array();
		
		var calendarTable = null;
		var parentDiv = this;
		
		pageId = null;

		var selectedYear = new Date().getFullYear();
		var selectedMonth = new Date().getMonth();
		
		var clearEvents = function() {
			events = new Array();
	        for (var i=0; i<=31; i++) events[i] = new Array();
		}
		
		var getData = function(year, month) {
			month++;
			var url = settings.url.replace(/\{pageId\}/, settings.pageId).replace(/\{year\}/, year).replace(/\{month\}/, month);

			$.getJSON(url, function(data) {
				if(data.success == true)
	        	{
	        		parentDiv.html("");
	        		clearEvents();
	        		
	        		for (var i=0; i<data.events.length; i++)
					{
						var day = data.events[i].day;
						var index = events[day].length;
						
						events[day][index] = {
							title : data.events[i].title,
							url : data.events[i].url,
							year : data.events[i].year,
							month: data.events[i].month,
							day: data.events[i].day
						}
					}
					drawCalendar();
	        	}
			});
		}
		
		var getMonthName = function(month) {
		    return Calendar.langs.monthNames[month];
		}
	
		var getDaysInMonth = function(year, month) {
		    return 32 - new Date(year, month, 32).getDate();
		}
	
		var getFirstDayOfMonth = function(year, month) {
		    var day;
		    day = new Date(year, month, 0).getDay();
		    return day;
		}
		
		var movePrevMonth = function(event) {
			selectedMonth--;
			if (selectedMonth < 0) {
		    	selectedMonth = 11;
				selectedYear--;
			}
			clearEvents();
			getData(selectedYear, selectedMonth);
			drawCalendar();
			event.preventDefault();
		}
		var moveNextMonth = function(event) {
			selectedMonth++;
		    if (selectedMonth > 11) {
				selectedMonth = 0;
				selectedYear++;
			}
			clearEvents();
			getData(selectedYear, selectedMonth);
			drawCalendar();
			event.preventDefault();
		}
		
		var createNavigationBar = function() {
		
			var div = $('<div class="widgetCalendarContentHead">');
			
			var divMonthHead = $('<div class="widgetCalendarMonthHead">')
				.html(getMonthName(selectedMonth)+' '+selectedYear);
			
			var divHeadL = $('<div>');
	
			var prevMonthLink = $('<a></a>')
				.attr('href', '#')
				.attr('class','widgetCalendarContentHeadL')
				.html('')
				.appendTo(divHeadL);
			
			var divHeadR = $('<div>');
			
			var nextMonthLink = $('<a></a>')
				.attr('href', '#')
				.attr('class','widgetCalendarContentHeadR')
				.html('')
				.appendTo(divHeadR);
				
			divHeadL.appendTo(div);
			divHeadR.appendTo(div);
			divMonthHead.appendTo(div);
			
			
			var divTodayHead = $('<div class="widgetCalendarTodayHead">')
				.html(Calendar.langs.todayIs+": <span>"+Calendar.langs.weekDaysFull[new Date().getDay()-1] +', '+ new Date().getDate()+' '+Calendar.langs.monthNames[new Date().getMonth()]+ ' '+new Date().getFullYear()+'</span>');
			
			divTodayHead.appendTo(div);
			
			$(prevMonthLink).click(movePrevMonth);
			$(nextMonthLink).click(moveNextMonth);
			
			return div;
		}
		
		var createCalendar = function() {
			
			var table = $('<table class="widgetCalendarTable">');	
			var weekDaysTitleRow = $('<tr class="widgetCalendarWeek">');
			
	        for (var j=0; j< 7; j++) 
	        	{
	        		var cell = $('<td>').html(Calendar.langs.weekDays[j]);
	        		cell.appendTo(weekDaysTitleRow);

					if(j == 5)
					{
						cell.addClass('saturday');
					}
		        	if(j == 6)
		        	{
						cell.addClass('sunday');
		        	}
	        }
			weekDaysTitleRow.appendTo(table);
			
			var daysInMonth = getDaysInMonth(selectedYear, selectedMonth);
	        var links = $('<a></a>');
	        var startDay = getFirstDayOfMonth(selectedYear, selectedMonth);
	        var numRows = 0;
	        var printDate = 1;
	        if (startDay != 7) {
	            numRows = Math.ceil(((startDay)+(daysInMonth))/7); 
	        }
			
	        var start = -startDay + 1;	        

			var today = new Date().getDate();
			var thisMonth = new Date().getMonth();
			var thisYear = new Date().getFullYear();
			
	        // wiersze
	        for (var e=0; e<numRows; e++) {
	        	var weekDaysRow = $('<tr class="weekDaysRow">');

	            // tworzy dni
	            for (var f=0; f<7; f++) {
	            	var dayNo = start + e * 7 + f;
	            	var cellTd = document.createElement('td');
	            	var cell = $(cellTd);
	            	
	            	if (dayNo > 0 && dayNo <= daysInMonth)
	            	{
	            		var className = 'day ';
	            		if ((dayNo == today) && (selectedYear == thisYear) && (selectedMonth == thisMonth)) {
							className += 'today ';
						}

						if(f == 5)
						{
							cell.addClass('saturday');
						}
						if(f == 6)
						{
							cell.addClass('sunday');
						}
						
						try {
							if(events[dayNo].toString() != "")
							{
								var content = '';
								var c=0;
								for(var z=0; z<events[dayNo].length; z++)
								{
									content += '<div class="widgetCalendarTipInfo">';
									content += events[dayNo][z].title;
									content += "</div>";
									if (selectedYear > thisYear || (selectedYear == thisYear && (selectedMonth > thisMonth || (selectedMonth == thisMonth && dayNo >= today))))
									{
										if(c==0) className +='event ';
									} else {
										if(c==0) className +='oldEvent '
									}
									c++;
									cellTd.day = dayNo;
								}
								
								cell.attr('title', content).tooltip({ 
								        track: true, 
										delay: 0, 
										showURL: true, 

										top: -15, 
										left: 5 
								}).click(
									function(event)
									{
										var target = event.target;
										while (target.tagName != 'TD')
										{
											target = target.parentNode;
										}
										selectedMonth ++;
										var redirect = settings.module+'/date/'+selectedYear+'-'+selectedMonth+'-'+target.day;
										document.location = redirect;
									}
								);
							} else { 
								//links = $('<a></a>').attr('href','#').html(dayNo); 
							}
						} catch(err) {}
						
						var divCell = $('<div>')
							.attr('class', className)
							.appendTo(cell)
							.html(dayNo)
							.appendTo(cell);
						//links.appendTo(divCell);
	            	}

	            	cell.appendTo(weekDaysRow);
	            }
	            
	            weekDaysRow.appendTo(table);
	        }

			return table;
		}

		var drawCalendar = function() {
			parentDiv.html("");
			createNavigationBar().appendTo(parentDiv);
			var calendar = createCalendar();
			calendar.appendTo(parentDiv);
		
		}

		getData(selectedYear, selectedMonth);
		return this;
	}

})(jQuery);
