var easter, midsummer, halloween, lf, ap, kh, pingst, apingst, iYear, iMonth, timer1, changeYear = false, receiver, pObject;
var today = new Date();

function DateStruct(y, m, d)
{
	this.year = y;
	this.month = m; 
	this.day = d;
}

function MakeHoliday(obj, title)
{
	var id = obj.id;
	id = parseInt(id.substr(1, id.length-1));
	var row = Math.floor(id / 7);
	var pos = 7 - (id - (7*row));
	
	var pn = obj.parentNode.parentNode;
	pn = pn.previousSibling;
	var coll = pn.childNodes;
	var childPos = coll.length - 1;
	
	if(pos < 7)
	{
		for(var i = 0; i < pos; i++)
			childPos--;
	}
		
	coll.item(childPos).style.borderBottom = "1px solid red";	
	
	obj.parentNode.previousSibling.style.borderRight = "1px solid red";					
	obj.parentNode.style.borderRight = "1px solid red";
	obj.parentNode.style.borderBottom = "1px solid red";
	
	obj.title = title;
}
			
function GetEasterDay(ds)
{
	// Se http://aa.usno.navy.mil/faq/docs/easter.html
	var c, n, k, i, j, l, m, d, y = ds.year;
	
	c = Math.floor(y / 100);
	n = y - 19 * Math.floor( y / 19 );
	k = Math.floor(( c - 17 ) / 25);
	i = c - Math.floor(c / 4) - Math.floor(( c - k ) / 3) + 19 * n + 15;
	i = i - 30 * Math.floor( i / 30 );
	i = i - Math.floor( i / 28 ) * ( 1 - Math.floor( i / 28 ) * Math.floor( 29 / ( i + 1 ) ) * Math.floor( ( 21 - n ) / 11 ) );
	j = y + Math.floor(y / 4) + i + 2 - c + Math.floor(c / 4);
	j = j - 7 * Math.floor( j / 7 );
	l = i - j;
	
	ds.month = 3 + Math.floor(( l + 40 ) / 44); // To match javascript's month...
	ds.day = l + 28 - 31 * Math.floor( ds.month / 4 );
	ds.month--;
	
	ea = new Date(ds.year, ds.month, ds.day);
	
	lf = new Date(ea.getFullYear(), ea.getMonth(), ea.getDate()-2);
	ap = new Date(ea.getFullYear(), ea.getMonth(), ea.getDate()+1);
	kh = new Date(ea.getFullYear(), ea.getMonth(), ea.getDate()+4+(7*5));
	pingst = new Date(ea.getFullYear(), ea.getMonth(), ea.getDate()+(7*7));
	apingst = new Date(pingst.getFullYear(), pingst.getMonth(), pingst.getDate()+1);
}

function IsHoliday(dat, obj)
{				
	if(dat.getMonth() == 0 && dat.getDate() == 1)
	{
		MakeHoliday(obj, "Nyårsdagen");
		return true;
	}								
	else if(lf.getMonth() == dat.getMonth() && lf.getDate() == dat.getDate())
	{
		MakeHoliday(obj, "Långfredagen");
		return true;
	}									
	else if(ap.getMonth() == dat.getMonth() && ap.getDate() == dat.getDate())
	{
		MakeHoliday(obj, "Annandag påsk");
		return true;
	}									
	else if(kh.getMonth() == dat.getMonth() && kh.getDate() == dat.getDate())
	{
		MakeHoliday(obj, "Kristi himmelsfärdsdag");
		return true;
	}									
	else if(pingst.getMonth() == dat.getMonth() && pingst.getDate() == dat.getDate())
	{
		MakeHoliday(obj, "Pingstdagen");
		return true;
	}									
	else if(apingst.getMonth() == dat.getMonth() && apingst.getDate() == dat.getDate())
	{
		MakeHoliday(obj, "Annandag pingst");
		return true;
	}	
	else if(dat.getMonth() == 0 && dat.getDate() == 6)
	{
		MakeHoliday(obj, "Trettondedag jul");
		return true;
	}								
	else if(easter.month == dat.getMonth() && easter.day == dat.getDate())
	{
		MakeHoliday(obj, "Påskdagen");
		return true;
	}									
	else if(midsummer.month == dat.getMonth() && midsummer.day == dat.getDate())
	{
		MakeHoliday(obj, "Midsommardagen");
		return true;
	}									
	else if(halloween.month == dat.getMonth() && halloween.day == dat.getDate())
	{
		MakeHoliday(obj, "Alla helgons dag");
		return true;
	}										
	else if(4 == dat.getMonth() && 1 == dat.getDate())
	{
		MakeHoliday(obj, "Första maj");
		return true;
	}										
	else if(11 == dat.getMonth() && 25 == dat.getDate())
	{
		MakeHoliday(obj, "Juldagen");
		return true;
	}										
	else if(11 == dat.getMonth() && 26 == dat.getDate())
	{
		MakeHoliday(obj, "Annandag Jul");
		return true;
	}	
	else if(dat.getDay() == 0)
		return true;
	
}
	
function GetWeekNumber(dat) 
{
	var ms1d = 864e5, ms3d = 3 * ms1d, ms7d = 7 * ms1d;
	var D3 = Date.UTC(dat.getFullYear(), dat.getMonth(), dat.getDate()) + ms3d;
	var wk = Math.floor(D3/ms7d);
	
	var newDate = new Date(wk * ms7d);
	var yy = newDate.getUTCFullYear();
	
	return 1 + wk - Math.floor((Date.UTC(yy,0,4) + ms3d) / ms7d);
}	

function GetMidSummer(ds)
{
	var ms = new Date(ds.year, ds.month, 20);
	for(var i = 0; i < 6; i++)
	{
		if(ms.getDay() == 6)
			break;
		else
			ms.setDate(ms.getDate()+1);
	}
	
	ds.day = ms.getDate();
}

function GetHalloween(ds)
{
	var h = new Date(ds.year, ds.month, 31);
	for(var i = 0; i < 6; i++)
	{
		if(h.getDay() == 6)
			break;
		else
			h.setDate(h.getDate()+1);
	}
	
	ds.month = h.getMonth();
	ds.day = h.getDate();
}

function FillMonth(y, m)
{
	iYear = y;
	iMonth = m;
	
	for(i = 0; i < 8; i++)
	{
		id = "h" + (i + 1);	
		var obj = document.getElementById(id);	
		obj.style.borderBottom = "1px solid black";				
	}
	
	for(i = 0; i < 6; i++)
	{
		id = "w" + (i + 1);	
		var obj = document.getElementById(id);	
		obj.style.borderRight = "1px solid black";				
	}
	
	for(i = 0; i < 42; i++)
	{
		id = "d" + (i + 1);	
		var obj = document.getElementById(id);	
		obj.parentNode.style.borderRight = "1px solid black";	
		obj.parentNode.style.borderBottom = "1px solid black";			
	}
	
	easter = new DateStruct(y, 0, 0);
	GetEasterDay(easter);
					
	midsummer = new DateStruct(y, 5, 0);
	GetMidSummer(midsummer);
					
	halloween = new DateStruct(y, 9, 0);
	GetHalloween(halloween);
	
	var dat = new Date(y, m, 1);
	var day = dat.getDay();
	
	if(day == 0)
		dat.setDate(-5)
	else
	{
		var num = 0 - (day-2);
		dat.setDate(num);
	}

	var id = "", i, bold = false;
	var ww = GetWeekNumber(dat);
	
	for(i = 0; i < 6; i++)
	{
		id = "w" + (i + 1);
		document.getElementById(id).innerHTML = ww;
		ww++;									
	}
	
	for(i = 0; i < 42; i++)
	{
		id = "d" + (i + 1);	
		var obj = document.getElementById(id);	
		
		if(today.getFullYear() == dat.getFullYear() && today.getMonth() == dat.getMonth() && today.getDate() == dat.getDate())
			bold = true;
		else
			bold = false;
			
		obj.innerHTML = dat.getDate();
		obj.name = dat.getFullYear() + "-";
		var tempMonth = dat.getMonth() + 1;
		
		if(tempMonth < 10)
			obj.name += "0" + tempMonth + "-";
		else
			obj.name += tempMonth + "-";
			
		if(dat.getDate() < 10)
			obj.name += "0" + dat.getDate();
		else
			obj.name += dat.getDate();
			
		if(dat.getMonth() == m)
		{
			if(IsHoliday(dat, obj))
			{
				if(bold)
					obj.className = "txt_days1r_b";
				else
					obj.className = "txt_days1r";
			}
			else
			{
				if(bold)
					obj.className = "txt_days1_b";
				else
					obj.className = "txt_days1";
			}
		}
		else
		{
			if(IsHoliday(dat, obj))
			{
				if(bold)
					obj.className = "txt_days2r_b";
				else
					obj.className = "txt_days2r";
			}
			else
			{
				if(bold)
					obj.className = "txt_days2_b";
				else
					obj.className = "txt_days2";
			}
		}
		
		dat.setDate(dat.getDate()+1);						
	}
}

function ChangeYearA(num)
{
	iYear += num;
	yearbox.value = iYear;
	FillMonth(iYear, iMonth);
}

function ChangeYear_TimeOut()
{
	yearbox.value = iYear;
	changeYear = false;
}

function ChangeYearB(e)
{
	if(e.keyCode == 13)
	{
		window.clearTimeout(timer1);
		changeYear = false;
		iYear = parseInt(yearbox.value);
		FillMonth(iYear, iMonth);
		event.returnValue=false;
	}
	else if(!changeYear)
	{
		changeYear = true;
		timer1 = window.setTimeout("ChangeYear_TimeOut()", 15000);
	}
}

function ChangeMonthA(num)
{
	var sel = monthbox.selectedIndex + num;
	
	if(sel == -1 || sel == 12)
	{
		if(sel == -1)
		{
			iYear--;
			iMonth = 11;
		}
		else
		{
			iYear++;
			iMonth = 0;
		}
		
		yearbox.value = iYear;
		monthbox.selectedIndex = iMonth;
	}
	else
	{				
		monthbox.selectedIndex = sel;
		iMonth = monthbox.options[sel].value;
	}
	
	FillMonth(iYear, iMonth);
}

function ChangeMonthB(num)
{
	iMonth = monthbox.selectedIndex;
	FillMonth(iYear, iMonth);
}

function GetDate(szDate)
{
	var d = new Date();	
	var mm, dd;
	
	if(szDate.substring(5, 6) == "0")
		mm = szDate.substring(6, 7);
	else
		mm = szDate.substring(5, 7);
		
	mm -= 1;
	
	if(szDate.substring(8, 9) == "0")
		dd = szDate.substring(9, 10);
	else
		dd = szDate.substring(8, 10);
					
	d.setFullYear(szDate.substring(0, 4));
	d.setMonth(mm);
	d.setDate(dd);
	
	return d;
}

function Init(dat, obj)
{
	if(dat != "")
	{
		var datum = GetDate(dat);		
		iYear = datum.getFullYear();
		iMonth = datum.getMonth();
	}
	else
	{
		iYear = today.getFullYear();
		iMonth = today.getMonth();
	}
	
	pObject = obj;
	FillMonth(iYear, iMonth);
	yearbox.value = iYear;
	monthbox.selectedIndex = iMonth;
}

function DateClicked(datum)
{
	parent.SetDate(pObject, datum);
}
