//---- Calendar ----

Calendar = {};
Calendar.langs = {
	weekDays: 		['Pon', 'Wto', '\u015aro', 'Czw', 'Pi\u0105', 'Sob', 'Nie'],
	weekDaysFull: 	['Poniedzia\u0142ek', 'Wtorek', '\u015aroda', 'Czwartek', 'Pi\u0105tek', 'Sobota', 'Niedziela'],
	monthNames: 	['Stycze\u0144', 'Luty', 'Marzec', 'Kwiecie\u0144', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpie\u0144', 'Wrzesie\u0144', 'Pa\u017adziernik', 'Listopad', 'Grudzie\u0144'],
	todayIs:		"dzi\u015b jest"
};

(function($){

	$.fn.calendar = function(options) {
		// private variables
		var  currentDate = new Date()
			,selectedMonth = currentDate.getMonth()
			,selectedYear = currentDate.getFullYear()
			,selectedDay = currentDate.getDay()
			,selectedDate = currentDate.getDate()
			,defaultSettings = {
				 nextMonth : 'Następny'
				,prevMonth : 'Poprzedni'
				,calendarId : 'calendar'
				,inputClass : 'calendarSelectDate'
				,linksTableClass : 'linksTable'
				,pageId: null
				,module: null
				,languageId: null
				,url: 'calendar/{pageId}/{languageId}/{year}/{month}'
			}
			,settings = $.extend(defaultSettings, options)
			,events = []
			,parentDiv = this
		;


		var clearEvents = function() {
			for (var i=0; i<=31; i++) {
				events[i] = [];
			}
		}

		var getData = function(year, month) {
			++month;
			var url = settings.url.replace(/\{pageId\}/, settings.pageId).replace(/\{languageId\}/, settings.languageId).replace(/\{year\}/, year).replace(/\{month\}/, month);

			$.getJSON(url, function(data) {
				if (data.success) {
					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
							,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  $calendarHead = $('<div class="calendarHead">')
				,$divMonth = $('<div class="monthAndYear">')
					.html('<span class="month">' + getMonthName(selectedMonth) + '</span> <span class="year">' + selectedYear + '</span>')
				,$prevMonthLink = $('<a class="prevMonth" href="#prev-month"><span>&lt;</span></a>').click(movePrevMonth)
				,$nextMonthLink = $('<a class="nextMonth" href="#next-month"><span>&gt;</span></a>').click(moveNextMonth)
				,$divToday = $('<div class="today">')
					.html('<span class="title">' + Calendar.langs.todayIs + ': </span><strong><span class="dayName">' + Calendar.langs.weekDaysFull[selectedDay - 1] + '</span>, <span class="day">' + selectedDate + '</span> <span class="monthName">' + Calendar.langs.monthNames[selectedMonth] + '</span> <span class="year">' + selectedYear + '</span></strong>')
			;

			$calendarHead.append($prevMonthLink).append($divMonth).append($nextMonthLink).append($divToday);

			return $calendarHead;
		}

		var createCalendar = function() {
			var  $table = $('<table class="calendarContent"><tbody>')
				,$dayNames = $('<tr class="dayNames">')
				,daysInMonth = getDaysInMonth(selectedYear, selectedMonth)
				,startDay = getFirstDayOfMonth(selectedYear, selectedMonth)
				,numRows = (startDay != 7) ? Math.ceil((startDay + daysInMonth) / 7) : 0
				,start = -startDay + 1
				,cDate = new Date()
				,today = cDate.getDate()
				,thisMonth = cDate.getMonth()
				,thisYear = cDate.getFullYear()
			;

			for (var i=0; i< 7; ++i) {
				$('<td>').addClass('day' + i).html(Calendar.langs.weekDays[i]).appendTo($dayNames);
			}
			$dayNames.appendTo($table);


			// wiersze
			for (i=0; i<numRows; ++i) {
				var $weekDays = $('<tr class="weekDays">');

				// tworzy dni
				for (var j=0; j<7; ++j) {
					var dayNo = start + i * 7 + j;
					var cellTd = document.createElement('td');
					var cell = $(cellTd);

					if (dayNo > 0 && dayNo <= daysInMonth) {
						var classes = [];
						classes.push('day');
						classes.push('day' + j);
						if ((dayNo == today) && (selectedYear == thisYear) && (selectedMonth == thisMonth)) classes.push('today');

						try {
							if (events[dayNo].toString() != '') {
								var content = '', 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) classes.push('event');

									} else {
										if (c == 0) classes.push('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;
								});
							}
						} catch(err) {}

						cell.addClass(classes.join(' '));

						$('<div>').appendTo(cell).html(dayNo);
					}

					cell.appendTo($weekDays);
				}

				$weekDays.appendTo($table);
			}

			return $table;
		}

		var drawCalendar = function() {
			parentDiv.html("");
			createNavigationBar().appendTo(parentDiv);
			var calendar = createCalendar();
			calendar.appendTo(parentDiv);
		}

		getData(selectedYear, selectedMonth);
		return this;
	}

})(jQuery);

