
function Calendar()
{
		this.date = new Date();
		this.x = 0;
		this.y = 0;
		this.id="calendar";
		this.dateField = undefined;
		this.init = function()
		{
			this.createUI();
			this.UI = document.getElementById(this.id);
			
			var btnPrev = document.getElementById(this.id + "_btnPrev");
			var btnNext = document.getElementById(this.id + "_btnNext");
			btnPrev.calendar = this;
			btnNext.calendar = this;
			btnPrev.attachEvent("onclick", this.btnPrev_click);
			btnNext.attachEvent("onclick", this.btnNext_click);
			
			for (var i=1; i<=6; i++)
			{
					for (var j=1; j<=7; j++)
					{
							var cellId = this.id + "_c" + i.toString() + j.toString();
							var cell = document.getElementById(cellId);
							cell.calendar = this;
							cell.attachEvent("onclick", this.dateCell_click);
				//		document.getElementById(id).addEventListener("click", newDate, false);
					}
			}
			this.updateUI();
		}

		this.show = function()
		{
				this.UI.style.display = "block";
		}

		this.hide = function()
		{
				this.UI.style.display = "none";
		}

		this.setDate = function(date)
		{
				this.date = date;
				this.updateUI();
				if(typeof(calendar.dateField) != "undefined")
				{
					calendar.dateField.value = calendar.date.toString();
				}
				try
				{
					this.dateChanged(date);
				}
				catch(e){}
		}

		this.updateUI = function()
		{
				var startDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1);
				var lastOfMonth = getDaysInMonth(this.date);
				var startingPos = startDate.getDay();
				if (startingPos==0)
						startingPos=7;

				var k=1;
				
				document.getElementById(this.id+"_TitleLabel").innerText = this.date.getMonthName() + " " + this.date.getFullYear();
				
				for(var i=1; i<7; i++)
				{
						for(var j=1; j<8; j++)
						{
								var cellId = this.id + "_c" + i.toString() + j.toString();
								if ((i==1 && j<startingPos) || (k>lastOfMonth))
								{
										document.getElementById(cellId).innerText="";
										document.getElementById(cellId).className = "day";
								}
								else
								{
										document.getElementById(cellId).innerText=k;
										if (k==this.date.getDate())
												document.getElementById(cellId).className = "selected";
										else
												document.getElementById(cellId).className = "day";
										k++;
								}
						}
				}
		}


		// position and movement methods

		
		this.setX = function(x)
		{
			this.x = x;
			this.updatePosition();
		}


		this.setY = function(y)
		{
			this.y = y;
			this.updatePosition();
		}


		this.moveTo = function(x, y)
		{
			this.x = x;
			this.y = y;
			this.updatePosition();
		}


		this.moveBy = function(offsetX, offsetY)
		{
			this.x += offsetX;
			this.y += offsetY;
			this.updatePosition();
		}


		this.updatePosition = function()
		{
			this.UI.style.left = this.x+"px";
			this.UI.style.top = this.y+"px";
		}


		this.dateCell_click = function()
		{
			event.cancelBubble = true;
			var cell = event.srcElement;
			var calendar = event.srcElement.calendar;
			var day = parseInt(cell.innerText.trim());
			if(!isNaN(day))
			{
				calendar.setDate(new Date(calendar.date.getFullYear(), calendar.date.getMonth(), day));
				try
				{
					calendar.dateSelected(calendar);
				}
				catch(e){}
			}
		}


		this.btnNext_click = function()
		{
			event.cancelBubble = true;
			var calendar = event.srcElement.calendar;
			calendar.setDate(new Date(calendar.date.getFullYear(), calendar.date.getMonth()+1, calendar.date.getDate()));
		}


		this.btnPrev_click = function()
		{
			event.cancelBubble = true;
			var calendar = event.srcElement.calendar;
			calendar.setDate(new Date(calendar.date.getFullYear(), calendar.date.getMonth()-1, calendar.date.getDate()));
		}


		this.createUI = function()
		{
				var html = "";
				html+='<div id="'+this.id+'" class="Calendar" onselectstart="event.returnValue=false; return false;" style="position:absolute; z-index:1; display:none;">';
				html+='<table cellspacing="0" cellpadding="0">';
				html+='<colgroup>';
				html+='<col class="working" span="5" />';
				html+='<col class="weekend" span="2" />';
				html+='</colgroup>';
				
				//title
				html+='<tr>';
				html+='<th colspan="7" class="Calendar_Title" id="'+this.id+'_Title">';
				html+='<img src="images/calendar/btnPrev.gif" id="'+this.id+'_btnPrev" class="Calendar_btnPrev" hspace="0"/>';
				html+='<img src="images/calendar/btnNext.gif" id="'+this.id+'_btnNext" class="Calendar_btnNext" hspace="0"/>';
				html+='<span id="'+this.id+'_TitleLabel" class="Calendar_TitleLabel"></span>';
				html+='</th>';
				html+='</tr>';
				//daysHeader
				html+='<tr class="days">';
				html+='<th>Mo</th>';
				html+='<th>Tu</th>';
				html+='<th>We</th>';
				html+='<th>Th</th>';
				html+='<th>Fr</th>';
				html+='<th>Sa</th>';
				html+='<th>Su</th>';
				html+='</tr>';

				for (var i=1; i<=6; i++)
				{
					html+='<tr>';
						for (var j=1; j<=7; j++)
						{
							html+='<td id="'+this.id+'_c' + i + j + '"></td>';
						}
					html+='</tr>';
				}
				html+='</table>';
				html+='</div>';
				w = document.createElement("div");
				w.innerHTML = html;
				document.body.appendChild(w.firstChild);
		}	
		this.init();
}


function CalendarControl(fieldId, buttonId, offsetX, offsetY)
{
	this.field = document.getElementById(fieldId);
	this.button = document.getElementById(buttonId);
	this.offsetX = (isNaN(parseInt(offsetX))) ? 0 : parseInt(offsetX);
	this.offsetY = (isNaN(parseInt(offsetY))) ? 0 : parseInt(offsetY);

	
	this.init = function()
	{
		this.button.calendarControl = this;
		this.field.calendarControl = this;
		this.button.attachEvent("onclick", this.button_click);
	}


	this.button_click = function()
	{
		event.cancelBubble = true;
		var button = event.srcElement;
		var calendarControl = button.calendarControl;
		var coords = getElementPosition(button);
		var date;
		try
		{
				date = Date.parse(calendarControl.field.value);
		}
		catch(e)
		{
				date = new Date();
		}
		calendar.setDate(date);
		calendar.moveTo(coords[0]+calendarControl.offsetX, coords[1]+calendarControl.offsetY);
		calendar.dateSelected = new Function("{CalendarControl_DateSelected(\""+ calendarControl.field.id +"\");}");
		calendar.show();
	}
	this.init();
}

function CalendarControl_DateSelected(fieldId)
{
		var txtDate = document.getElementById(fieldId);
		var date = calendar.date;
		txtDate.value = date.toString();
		window.setTimeout(hideCalendar, 200);
}

function hideCalendar()
{
		if(typeof(calendar) != "undefined")
			calendar.hide();
}