﻿//
// Funkcja pobierająca bezwzględne położenie obiektu.
//
function GetItemAbsolutePosition(object) {
	var left = 0;
	var top = 0;
	object = jQuery(object).get(0);
	do {
		left += object.offsetLeft;
		top += object.offsetTop;
	} while (object = object.offsetParent);
	return [left, top];
}

jQuery.EventCalendarSmallWidget = {
	calendarObject: null,
	tooltip: null,
	build: function() {
		var calendarObject = jQuery(this).get(0);
		calendarObject.CurrentMonth = (new Date()).getMonth();
		calendarObject.CurrentYear = (new Date()).getFullYear();
		jQuery.EventCalendarSmallWidget.calendarObject = calendarObject;
		jQuery("#small_calendar_prev_month").click(jQuery.EventCalendarSmallWidget.previousMonthButtonAction);
		jQuery("#small_calendar_next_month").click(jQuery.EventCalendarSmallWidget.nextMonthButtonAction);
		var rows = jQuery("#small_calendar td:not(:empty):has(b)");
		calendarObject.eventRows = rows;
		jQuery.each(rows, function(i, row) {
			jQuery(row).bind('mouseenter', jQuery.EventCalendarSmallWidget.dayMouseOver);
			jQuery(row).bind('mouseleave', jQuery.EventCalendarSmallWidget.dayMouseOut);
		});
	},
	previousMonthButtonAction: function() {
		var calendarObject = jQuery.EventCalendarSmallWidget.calendarObject;
		var cm = calendarObject.CurrentMonth;
		var cy = calendarObject.CurrentYear;
		cy += Math.floor((cm - 1) / 12);
		cm = (cm - 1) % 12;
		if (cm == -1)
			cm = 11;
		calendarObject.CurrentYear = cy;
		calendarObject.CurrentMonth = cm;
		jQuery.EventCalendarSmallWidget.reloadCalendarMonthView();

	},
	nextMonthButtonAction: function() {
		var calendarObject = jQuery.EventCalendarSmallWidget.calendarObject;
		calendarObject.CurrentYear += Math.floor((calendarObject.CurrentMonth + 1) / 12);
		calendarObject.CurrentMonth = (calendarObject.CurrentMonth + 1) % 12;
		jQuery.EventCalendarSmallWidget.reloadCalendarMonthView();
	},
	dayMouseOver: function(e) {
		if (!jQuery(this).get(0).events) {
			jQuery.EventCalendarSmallWidget.bufferEvents(this, function(button) {
				jQuery.EventCalendarSmallWidget.showEventTooltip(e, jQuery(button));
			});
		}
		else {
			jQuery.EventCalendarSmallWidget.tooltip.css("visibility", "");
			jQuery.EventCalendarSmallWidget.showEventTooltip(e, jQuery(this));
		}
	},
	dayMouseOut: function() {
		if (jQuery.EventCalendarSmallWidget.tooltip) {
			jQuery.EventCalendarSmallWidget.tooltip.css("visibility", "hidden");
			jQuery(this).unbind('mousemove', jQuery.EventCalendarSmallWidget.dayMouseMove);
		}
	},
	dayMouseMove: function(e) {
		jQuery.EventCalendarSmallWidget.tooltip.css("left", e.pageX - 125).css("top", e.pageY + 5);
	},
	showEventTooltip: function(eventArgs, dayButton) {
		if (!jQuery.EventCalendarSmallWidget.tooltip) {
			var tooltip = jQuery("<div>").addClass("event_tooltip").appendTo("body");
			jQuery.EventCalendarSmallWidget.tooltip = tooltip;
		}
		else if (jQuery.EventCalendarSmallWidget.tooltip.css("visibility") == "hidden")
			return;
		var tooltip = jQuery.EventCalendarSmallWidget.tooltip;
		jQuery("ul", tooltip).remove();
		var events = jQuery(dayButton).get(0).events;
		var list = jQuery("<ul>").appendTo(tooltip);
		for (var event = 0; event < events.length; event++) {
			jQuery("<li>").html(events[event].title).appendTo(list);
		}
		var position = GetItemAbsolutePosition(dayButton);
		tooltip.css("width", "120px").css("left", eventArgs.pageX - 125).css("top", eventArgs.pageY + 5);
		jQuery(dayButton).bind('mousemove', jQuery.EventCalendarSmallWidget.dayMouseMove);
	},
	bufferEvents: function(button, callback) {
		var calendarObject = jQuery.EventCalendarSmallWidget.calendarObject;
		if (calendarObject.bufferingEvents)
			return;
		calendarObject.bufferingEvents = true;
		jQuery.ajax(
		{
			type: "GET",
			url: "xindex.php?event_calendar&get_events&year=" + calendarObject.CurrentYear + "&month=" + (calendarObject.CurrentMonth + 1),
			data: "",
			dataType: "json",
			error: function() {
				alert("Błąd pobierania.");
			},
			success: function(data) {
				jQuery.each(calendarObject.eventRows, function(i, item) {
					var events = Array();
					var day = jQuery("b", item).html();
					for (var eventID = 0; eventID < data.events.length; eventID++) {

						if (Math.floor(data.events[eventID].day) == Math.floor(day)) {
							events[events.length] = data.events[eventID];
						}
					}
					jQuery(item).get(0).events = events;
					calendarObject.bufferingEvents = false;
				});
				callback(button);
			}
		});
	},
	reloadCalendarMonthView: function() {
		var calendarObject = jQuery.EventCalendarSmallWidget.calendarObject;
		var calendarTable = jQuery("#small_calendar_month_view > tbody");
		// usuwam wszystkie wiersze które posiadają <td>

		var date = new Date(calendarObject.CurrentYear, calendarObject.CurrentMonth, 1, 0, 0, 0);
		var start_day = (date.getDay() + 6) % 7;
		var end_day = jQuery.EventCalendarSmallWidget.daysInMonth(calendarObject.CurrentMonth, calendarObject.CurrentYear);
		// uzupełniam puste miejsca z początku tabeli

		var loadCallback = function(data) {
			jQuery("tr:has(td)", calendarTable).remove();
			var row = jQuery("<tr>").appendTo(calendarTable);
			for (var day = 0; day < start_day; day++) {
				var field = jQuery("<td>").appendTo(row);
				if (day > 4)
					field.addClass("weekend");
			}
			for (var day = start_day; day < end_day + start_day; day++) {
				if ((day % 7) == 0)
					row = jQuery("<tr>").appendTo(calendarTable);
				var foundEvents = false;
				for (var item = 0; item < data.events.length; item++) {
					if (data.events[item].day == day - start_day + 1) {
						//if(true){
						foundEvents = true;
					}
				}
				var field = jQuery("<td>").appendTo(row);
				if (foundEvents)
					field.html("<a href=\"" + data.days_links[day - start_day] + "\"><b>" + (day - start_day + 1) + "</b></a>");
				else
					field.html(day - start_day + 1);
				if ((day % 7) > 4)
					field.addClass("weekend");
			}
			for (var day = (end_day + start_day - 1) % 7; day < 6; day++) {
				var field = jQuery("<td>").appendTo(row);
				if (day > 3)
					field.addClass("weekend");
			}
			var rows = jQuery("#small_calendar td:not(:empty):has(b)");
			calendarObject.eventRows = rows;
			rows.bind('mouseenter', jQuery.EventCalendarSmallWidget.dayMouseOver);
			rows.bind('mouseleave', jQuery.EventCalendarSmallWidget.dayMouseOut);
		};
		var loadErrorCallback = function() {
			jQuery("tr:has(td)", calendarTable).remove();
			var row = jQuery("<tr>").appendTo(calendarTable);
			jQuery("<td>").attr("colspan", 7).html("Błąd wczytywania.").appendTo(row);
		};
		jQuery.ajax({
			type: "GET",
			url: "xindex.php?event_calendar&event_count&year=" + calendarObject.CurrentYear + "&month=" + (calendarObject.CurrentMonth + 1),
			dataType: "json",
			error: loadErrorCallback,
			success: loadCallback
		});
		var monthName = jQuery("#small_calendar_month_name");
		switch (calendarObject.CurrentMonth) {
			case 0: monthName.html("Styczeń"); break;
			case 1: monthName.html("Luty"); break;
			case 2: monthName.html("Marzec"); break;
			case 3: monthName.html("Kwiecień"); break;
			case 4: monthName.html("Maj"); break;
			case 5: monthName.html("Czerwiec"); break;
			case 6: monthName.html("Lipiec"); break;
			case 7: monthName.html("Sierpień"); break;
			case 8: monthName.html("Wrzesień"); break;
			case 9: monthName.html("Październik"); break;
			case 10: monthName.html("Listopad"); break;
			case 11: monthName.html("Grudzień"); break;
		}
		monthName.html(monthName.html() + "/" + calendarObject.CurrentYear);
		jQuery.ajax({
			type: "GET",
			url: "xindex.php?event_calendar&make_menu_link&month=" + (calendarObject.CurrentMonth + 1) + "&year=" + calendarObject.CurrentYear,
			dataType: "json",
			success: function(data) {
				monthName.html("<a href=\"" + data.menu_link + "\">" + monthName.html() + "</a>");
			}
		});

	},
	daysInMonth: function(month, year) {
		var dd = new Date(year, month + 1, 0);
		return dd.getDate();
	}
};
jQuery.fn.extend({
	EventCalendarSmall: jQuery.EventCalendarSmallWidget.build
});
