function JsCalendar()
{
		// just gregorian
	this.displHol = true;
	this.todayDate = new Date();
	this.allowClose = true;
	this.today = this.todayDate.getDate();
	this.month = this.todayDate.getMonth() + 1;
	this.year = this.todayDate.getFullYear();
	this.dayOffset = 2; 	// for Mon as 1st day of week
	this.jd = parseInt(0);
		// form and input fields names the data is coming from
	this.inputDay = null;
	this.inputYear = null;
	this.inputMonth = null;
	this.inputHour = null;
	this.inputSecond = null;
	this.inputMinute = null;
		// id of div to display results in
	this.panel = '';
	this.outsidecolor = '#e0e0e0';
	this.border = 0;
	this.bgcolor = '#e0e0e0'
	this.tablecolor = 'white';
	this.activeLinks = true;


	this.monthBefore = function()
	{
		var d = new Array();
		if (this.month > 1)
		{
			d[0] = this.month - 1;
			d[1] = this.year;
		}
		else
		{
			d[0] = 12;
			d[1] = this.year - 1;
		}
		return d;
	}


	this.monthAfter = function()
	{
		var d = new Array();
		if (this.month < 12)
		{
			d[0] = this.month + 1;
			d[1] = this.year;
		}
		else
		{
			d[0] = 1;
			d[1] = this.year + 1;
		}
		return d;
	}


	this.dayOfYear = function(dzien,  miesiac, rok)
	{
		var i = 0;
		var days = 0;
		var daysInYear = 0;
		var m = this.setDaysInMonths(rok);

		for (i = 0; i < miesiac - 1; i ++)
		{
			days += m[i];
		}
		return (days + (dzien - 1));
	}


	this.calcJD = function(dzien,  miesiac, rok)	
	{
		// not Julian Day routine
		var i = 0;
		var days = 0;
		var daysInYear = 0;
		var m = this.setDaysInMonths(rok);
		var y = rok - 1;
		for (i = 0; i < miesiac - 1; i ++)
		{
			days += m[i];
		}
		daysInYear = (y * 365 + Math.floor(y / 4) - Math.floor(y /100) + Math.floor(y /400)) + 9;
		days += daysInYear;
		return (days + (dzien - 1));
	}


	this.dateDiff = function(d1, m1, r1, d2, m2, r2)
	{
		return (this.calcJD(d2, m2, r2) - this.calcJD(d1, m1, r1));
	}


	this.setDaysInMonths = function(rok)
	{
		var m = new Array();
		m[0] = 31;
		m[1] = 28;
		if (rok % 4 == 0)
			m[1] = 29;
		if (rok % 100 == 0)
			m[1] = 28;
		if (rok % 400 == 0)
			m[1] = 29;
		m[2] = 31;
		m[3] = 30;
		m[4] = 31;
		m[5] = 30;
		m[6] = 31;
		m[7] = 31;
		m[8] = 30;
		m[9] = 31;
		m[10] = 30
		m[11] = 31;
		return m;
	}


	this.dayOfWeek = function(dzien,  miesiac, rok)	
	{
		var d = new Array();
		var res = new Array();
		var dayNr = this.calcJD(dzien,  miesiac, rok);
		d[0] = "Sat";
		d[1] = "Sun";
		d[2] = "Mon";
		d[3] = "Tue";
		d[4] = "Wed";
		d[5] = "Th";
		d[6] = "Fri"
		res[0] = dayNr % 7;
		res[1] = d[dayNr % 7]
		return res;
	}


	this.display = function()
	{
		var d = this.today;
		var m = this.month;
		var y = this.year;
		var calendar = this.displByMonth(m, y);
		var str = '';
		var before = this.monthBefore();
		var after = this.monthAfter();
		str += "<table bgcolor = '" + this.outsidecolor + "'><tr><td>";
		str += "<table bgcolor = 'white'>";
		str += "<tr><td valign = 'top'>";
		str += "<a href = '#' onClick = 'calData.playCalendar(" + before[0] + ", " + before[1] + "); return false'>";
		str += "<img src = 'images/dbIcons/previous_button.gif' border = '0' alt = ''></a>";
		str += "</td><td>";
		str += calendar;
		str += "</td><td valign = 'top'>"
		str += "<a href = '#' onClick = 'calData.playCalendar(" + after[0] + ", " + after[1] + "); return false'>";
		str += "<img src = 'images/dbIcons/next_button.gif' border = '0' alt = ''></a>";
		str += "</td></tr></table>";
		str += "</td></tr></table>";
		if (this.allowClose == true)
		{
			str += "<table bgcolor = '#e0e0e0'><tr><td bgcolor = 'white'>";
			str += "<a href = '#' onClick  = 'return calData.closeCalendar();'>";
			str += "<noBr>Close Calendar</noBr></a>";
			str += "</td></tr></table>";
		}
		document.getElementById(this.panel).innerHTML = str;
	}


	this.setMonthsNames = function()
	{
		var m = new Array()
		m[0] = "January";
		m[1] = "February";
		m[2] = "March";
		m[3] = "April";
		m[4] = "May";
		m[5] = "June";
		m[6] = "July";
		m[7] = "August";
		m[8] = "September";
		m[9] = "October";
		m[10] = "November";
		m[11] = "December";
		return m;
	}


	this.displByMonth = function(mies, rok)
	{
		var easterDate = this.easter(rok);
		var today = new Date();
		p_today = today.getDate();
		p_month = today.getMonth() + 1;
		p_year = today.getFullYear();
		var str = '';
		var i = 0;
		var ii;
		var dow;
		var nod;
		var firstDay = (this.dayOfWeek(1, mies, rok)[0] + 7 - this.dayOffset) % 7;
		var m = this.setDaysInMonths(rok);
		var daysInMonth = m[mies - 1];
		var m = this.setMonthsNames();
		str += "<p align = 'center'>" + m[mies - 1] + " " + rok + "</p>";
		str += "<table border = '" + this.border + "' bgcolor = '" + this.tablecolor + "'><tr>";
		str += "<td bgcolor = '" + this.bgcolor + "'>Mon</td><td bgcolor = '" + this.bgcolor + "'>Tue</td>";
		str += "<td bgcolor = '" + this.bgcolor + "'>Wed</td><td bgcolor = '" + this.bgcolor + "'>Th</td>";
		str += "<td bgcolor = '" + this.bgcolor + "'>Fri</td><td bgcolor = '" + this.bgcolor + "'>Sat</td>";
		str += "<td bgcolor = '" + this.bgcolor + "'><b>Sun</b></td>";
		str += "</tr><tr>";
		for (i = 0; i < firstDay; i++)
		{
			str += "<td></td>";
		}
		for (i = 0; i < daysInMonth; i++)
		{
			ii = i + 1;
			dow = this.dayOfWeek(ii, mies, rok)[1];
			nod = this.dayOfWeek(ii, mies, rok)[0];
			if (i != 0 && nod % 7 == this.dayOffset)
			{
				str += "</tr><tr>";
			}
			if (calData.customCalText(ii, mies, rok) == '')
			{
				str += "<td bgcolor = '" + this.bgcolor + "'>";
				if (this.activeLinks)
				{
					str += "<a href = '#' ";
					if (mies == easterDate[1] && ii == easterDate[0] && this.displHol == true)
						str += "title = 'Easter' ";
					str += "onClick = 'calData.calYear = " + rok + ";";
					str += "calData.calMonth = " + mies + ";";
					str += "calData.calDay = " + ii + ";";
					str += "calData.calendarFunction();return false;'>";
				}
				if (ii == p_today && mies == p_month && rok == p_year)
					str += "<b><font color = 'red'>";
				str += ii;
				if (mies == easterDate[1] && ii == easterDate[0] && this.displHol == true)
					str += " <span title = 'Easter'> E</span>";
				if (ii == p_today && mies == p_month && rok == p_year)
					str += "</font></b>";
				if (this.activeLinks)
				{
					str += "</a>";
				}
				str += "</td>";
			}
			else
			{
				str += calData.customCalText(ii, mies, rok);
			}
		}
		str += "</tr></table>";
		return str;
	}


	this.easter = function()
	{
		function absInt(a, b)
		{
			return Math.abs(Math.floor(a / b));
		}
   		var g = 0;
		var c = 0;
   		var h = 0;
   		var i = 0;
   		var j = 0;
   		var p = 0;
		var year = this.year;

			// my sincere thanks to many math guys (and most of all, Oudin) who figured this out 
   		g = year % 19;
   		c = absInt(year, 100);
   		h = (c - absInt(c, 4) - absInt(8 * c + 13, 25) + 19 * g + 15) % 30;
   		i = h - absInt(h, 28) * (1 - absInt(h, 28) * absInt(29, h + 1) * absInt(21 - g, 11));
   		j = (year + absInt(year, 4) + i + 2 - c + absInt(c, 4)) % 7;
   		p = i - j + 28;

   		var Day = p;
   		var Month = 4;
   		if (p > 31)
      			Day = p - 31;
   		else
      			Month = 3;
		theEaster = new Array(Day, Month)
		return theEaster;
	}

}	//end class JsCalendar


//helper functions

function persistentCalendarData()
{
	this.min = 1585;
	this.max = 4000;
	this.panel = '';
	this.calYear = -1;
	this.calMonth = -1;
	this.calDay = -1;
	this.origInnerHTML = '';
	this.htmlSaved = false;
	this.panel = 'displCal'

	this.calendarFunction = function()
	{
		//empty
	}


	this.closeCalendar = function()
	{
		//empty
	}


	this.playCalendar = function(m, y)
	{
		cal = new JsCalendar();
		cal.panel = this.panel;
		cal.allowClose = false;
		cal.activeLinks = false;
		if (m != null)
			cal.month = m;
		if (y != null)
		{	
			if (y > calData.max)
			{
				alert('year to big');
				return false;
			}
			if (y < calData.min)
			{
				alert('year to small');
				return false;
			}
			cal.year = y;
		}
		if (calData.htmlSaved == false)
		{
			calData.origInnerHTML = document.getElementById(cal.panel).innerHTML;
			calData.htmlSaved = true;
		}
		cal.display();
	}


	this.customCalText = function(d, m, y)
	{
		return '';
	}
}
var calData = new persistentCalendarData;





