// 1900.01.01 jest dla nas dniem startowym.
// Od niego bedziemy liczyli wszelkie daty, bo ma taka fajna wlasciwosc, ze byl to poniedzialek :)
// 0 - pon, 1 - wto, 2 - sro, 3 - czw, 4 - pia, 5 - sob, 6 - nie
var days_of_the_week = [
	"poniedziałek",
	"wtorek",
	"środa",
	"czwartek",
	"piątek",
	"sobota",
	"niedziela"
]
var months_of_the_year = [
	"",
	"styczeń",
	"luty",
	"marzec",
	"kwiecień",
	"maj",
	"czerwiec",
	"lipiec",
	"sierpień",
	"wrzesień",
	"październik",
	"listopad",
	"grudzień"
]
var nums_of_days_of_the_month = [
	0, 31, 28, 31,  30,  31,  30,  31,  31,  30,  31,  30,  31
]
var sums_of_days_of_the_month = [
	0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
]
// Konstruktor klasy SData
function SData(r, m, d) {
	this.rok = r;
	this.mies = m;
	this.dzien = d;
	this.eq = function (data) { if (this.rok == data.rok && this.mies == data.mies && this.dzien == data.dzien) return true; return false; }
	this.ne = function (data) { if (this.rok != data.rok || this.mies != data.mies || this.dzien != data.dzien) return true; return false; }
	this.lt = function (data) { if (this.rok < data.rok || this.rok == data.rok && this.mies < data.mies || this.rok == data.rok && this.mies == data.mies && this.dzien < data.dzien) return true; return false; }
	this.gt = function (data) { if (this.rok > data.rok || this.rok == data.rok && this.mies > data.mies || this.rok == data.rok && this.mies == data.mies && this.dzien > data.dzien) return true; return false; }
	this.le = function (data) { return !this.gt(data); }
	this.ge = function (data) { return !this.lt(data); }
}
// Czy rok jest przestepny ?
function rok_przestepny(rok) {
	if (rok % 4 == 0 && (rok % 100 != 0 || rok % 400 == 0)) return true;
	return false;
}
// Jezeli rozpatrujemy luty roku przestepnego zwraca 1, w przeciwnym razie 0
function korekta_lutego(data) {
	if (rok_przestepny(data.rok) && data.mies == 2) return 1;
	return 0;
}
// Skorygowana liczba dni miesiaca dla danej daty
function skorygowana_liczba_dni_miesiaca(data) {
	var num = nums_of_days_of_the_month[data.mies];
	if (rok_przestepny(data.rok) && data.mies == 2) num++;
	return num;
}
// Skorygowana liczba dni od poczatku roku dla danej daty
function skorygowana_suma_dni_miesiecy(data) {
	var sum = sums_of_days_of_the_month[data.mies];
	if (rok_przestepny(data.rok) && data.mies >= 2) sum++;
	return sum;
}
// Numer dnia w roku
function numer_dnia_w_roku(data) {
	var m = skorygowana_suma_dni_miesiecy(new SData(data.rok, data.mies-1, 1));
	var d = data.dzien;
	return parseInt(m, 10)+parseInt(d, 10);
}
// Numer tygodnia w roku
function numer_tygodnia_w_roku(data) {
	var dow = day_of_the_week(new SData(data.rok, 1, 1));
	return Math.floor((numer_dnia_w_roku(data)-1+dow) / 7)+1;
}
// Ile bylo lat przestepnych od POCZATKU roku _od do POCZATKU roku _do ?
function lata_przestepne(_od, _do) {
	with (Math) {
		var n4_1 = ceil(_od / 4);
		var n4_2 = ceil(_do / 4);
		var n100_1 = ceil(_od / 100);
		var n100_2 = ceil(_do / 100);
		var n400_1 = ceil(_od / 400);
		var n400_2 = ceil(_do / 400);
		return (n4_2-n4_1)-(n100_2-n100_1)+(n400_2-n400_1);
	}
}
// Ilosc dni miedzy datami (obiektami klasy SData)
function dni_miedzy_datami(_od, _do) {
	var ll = (_do.rok-_od.rok)*365;
	var lp = lata_przestepne(_od.rok, parseInt(_do.rok, 10)+1);
	if (rok_przestepny(_od.rok) && _od.mies > 2) --lp;
	if (rok_przestepny(_do.rok) && _do.mies < 3) --lp;
	var lm = sums_of_days_of_the_month[_do.mies-1]-sums_of_days_of_the_month[_od.mies-1];
	var ld = _do.dzien-_od.dzien;
	return (parseInt(ll, 10)+parseInt(lp, 10)+parseInt(lm, 10)+parseInt(ld, 10));
}
// Dzien tygodnia dla podanej daty
function day_of_the_week(data) {
	var dmd = dni_miedzy_datami(new SData(1900, 1, 1), data);
	var dow = dmd % 7; if (dow < 0) dow += 7;
	return dow;
}
// ilosc tygodni w danym miesiacu
function ile_tygodni_w_mies(data) {
	var dow = day_of_the_week(data);
	var dom = dow + nums_of_days_of_the_month[data.mies] + korekta_lutego(data);
	return Math.ceil(dom / 7);
}
// Pomocne i proste
function format_number(format, number) {
	var tmp = new String(format) + new String(number);
	return tmp.substr(tmp.length-format.length);
}
// --"--
function format_number_2(format_1, format_2, number_1, number_2) {
	var tmp_1 = format_number(format_1, number_1);
	var tmp_2 = format_number(format_2, number_2);
	return tmp_1 + tmp_2;
}
// --"--
function format_date(format_rok, format_mies, format_dzien, rok, mies, dzien) {
	var r = format_number(format_rok, rok);
	var m = format_number(format_mies, mies);
	var d = format_number(format_dzien, dzien);
	return r + m + d;
}
// Badamy, czy jakikolwiek dzien danego tygodnia jest aktywny
function aktywny_tydzien(data, numer) {
	var dow = day_of_the_week(new SData(data.rok, 1, 1));
	var d = (numer-1)*7+1;
	var a = false;
	for (var i = 0; i < 7; i++) {
		if (parseInt(cal_data.charAt(Math.max(d+i-dow, 0)), 10)) {
			a = true; break;
		}
	}
	return a;
}
// No to skaczemy!
function jump_to_date(data) {
	var href = cal_prefix + "&month=" + cal_month + "&date=" + data;
	if (window.navigate) window.navigate(href);
	else location = href;
}
// na razie tylko takie proste cos
function draw_calendar_month(data) {
	data.dzien = 1;
	var ndr = numer_dnia_w_roku(data);
	var ntr = numer_tygodnia_w_roku(data);
	var itm = ile_tygodni_w_mies(data);
	var dow = day_of_the_week(data);
	var dom = dow + nums_of_days_of_the_month[data.mies] + korekta_lutego(data);
	dom %= 7; if (dom == 0) dom = 7;
	document.writeln("<td valign='top' width='190'><table border='0' width='100%' cellpadding='0' cellspacing='3'>");
	document.writeln("<col width='16%'><col width='12%' span='7'>");
	document.writeln("<thead><tr>");
	var cal_month = format_number_2("0000", "00", data.rok, data.mies);
	document.writeln("<th></th><th class='pro-cal-month' id='cal_" + cal_month + "' colspan='7'><a href='javascript:jump_to_date(" + cal_month + ")'>" + months_of_the_year[data.mies] + "</a></th>");
	document.writeln("</tr><tr>");
	document.writeln("<th class='pro-cal-header'></th>");
	document.writeln("<th class='pro-cal-header'>pn</th>");
	document.writeln("<th class='pro-cal-header'>wt</th>");
	document.writeln("<th class='pro-cal-header'>śr</th>");
	document.writeln("<th class='pro-cal-header'>cz</th>");
	document.writeln("<th class='pro-cal-header'>pt</th>");
	document.writeln("<th class='pro-cal-header'>so</th>");
	document.writeln("<th class='pro-cal-header'>ni</th>");
	document.writeln("</tr></thead>");
	document.writeln("<tbody><tr>");
	var cal_week = format_number("0000", data.rok) + (data.mies > 1 && dow > 0 ? format_number_2("00", "00", (data.mies-1), (skorygowana_liczba_dni_miesiaca(new SData(data.rok, data.mies-1, 1))-dow+1)) : format_number_2("00", "00", data.mies, 1)) + (data.mies == 1 && dow == 6 ? "" : format_date("0000", "00", "00", data.rok, data.mies, (7-dow)));
	document.writeln("<th class='pro-cal-week' id='cal_" + cal_week + "_2'>" + (!aktywny_tydzien(data, ntr) ? "" : "<a href='javascript:jump_to_date(" + cal_week + ")'>") + "&nbsp;&nbsp;&nbsp;&gt;" + (!aktywny_tydzien(data, ntr) ? "" : "</a>") + "</th>"); ntr++;
	for (var i = 0; i < dow; i++) {
		document.writeln("<td></td>");
	}
	for (var i = dow; i < 7; i++) {
		var wartosc = cal_data.charAt(ndr++);
		var klasa = "pro-cal-" + wartosc;
		var cal_day = format_date("0000", "00", "00", data.rok, data.mies, (i-dow+1));
		document.writeln("<td class='" + klasa + "' id='cal_" + cal_day + "'>" + (wartosc == 0 ? "" : "<a href='javascript:jump_to_date(" + cal_day + ")'>") + (i-dow+1) + (wartosc == 0 ? "" : "</a>") + "</td>");
	}
	document.writeln("</tr>");
	for (var i = 1; i < itm-1; i++) {
		document.writeln("<tr>");
		var cal_week = format_date("0000", "00", "00", data.rok, data.mies, (i*7-dow+1)) + format_date("0000", "00", "00", data.rok, data.mies, (i*7-dow+7));
		document.writeln("<th class='pro-cal-week' id='cal_" + cal_week + "'>" + (!aktywny_tydzien(data, ntr) ? "" : "<a href='javascript:jump_to_date(" + cal_week + ")'>") + "&nbsp;&nbsp;&nbsp;&gt;" + (!aktywny_tydzien(data, ntr) ? "" : "</a>") + "</th>"); ntr++;
		for (var j = 0; j < 7; j++) {
			var wartosc = cal_data.charAt(ndr++);
			var klasa = "pro-cal-" + wartosc;
			var cal_day = format_date("0000", "00", "00", data.rok, data.mies, (i*7+j-dow+1));
			document.writeln("<td class='" + klasa + "' id='cal_" + cal_day + "'>" + (wartosc == 0 ? "" : "<a href='javascript:jump_to_date(" + cal_day + ")'>") + (i*7+j-dow+1) + (wartosc == 0 ? "" : "</a>") + "</td>");
		}
		document.writeln("</tr>");
	}
	document.writeln("<tr>");
	cal_week = format_date("0000", "00", "00", data.rok, data.mies, ((itm-1)*7-dow+1)) + (data.mies == 12 && dom == 1 ? "" : format_number("0000", data.rok) + (data.mies < 12 && dom < 7 ? format_number_2("00", "00", (parseInt(data.mies, 10)+1), (7-dom)) : format_number_2("00", "00", data.mies, ((itm-1)*7-dow+dom))));
	document.writeln("<th class='pro-cal-week' id='cal_" + cal_week + "_1'>" + (!aktywny_tydzien(data, ntr) ? "" : "<a href='javascript:jump_to_date(" + cal_week + ")'>") + "&nbsp;&nbsp;&nbsp;&gt;" + (!aktywny_tydzien(data, ntr) ? "" : "</a>") + "</th>"); ntr++;
	for (var i = 0; i < dom; i++) {
		var wartosc = cal_data.charAt(ndr++);
		var klasa = "pro-cal-" + wartosc;
		var cal_day = format_date("0000", "00", "00", data.rok, data.mies, (i+(itm-1)*7-dow+1));
		document.writeln("<td class='" + klasa + "' id='cal_" + cal_day + "'>" + (wartosc == 0 ? "" : "<a href='javascript:jump_to_date(" + cal_day + ")'>") + (i+(itm-1)*7-dow+1) + (wartosc == 0 ? "" : "</a>") + "</td>");
	}
	for (var i = dom; i < 7; i++) {
		document.writeln("<td></td>");
	}
	document.writeln("</tr></tbody>");
	document.writeln("</table></td>");
}

// SBO - funkcje dopisane do pozycjonowania kalendarza w serwisach takich jak hoga
function get_body_width()
{
  if (document.documentElement && document.documentElement.clientWidth)
    return document.documentElement.clientWidth
  else if(document.body && document.body.clientWidth)
    return(document.body.clientWidth);
  else if(window.innerWidth)
    return(window.innerWidth);
  else
    return(screen.availWidth);
}

function get_body_height()
{
  if (document.documentElement && document.documentElement.clientHeight)
    return document.documentElement.clientHeight
  else if(document.body && document.body.clientHeight)
    return(document.body.clientHeight);
  else if(window.innerHeight)
    return(window.innerHeight);
  else
    return(screen.availHeight);
}
