
function CalendarCssClasses()
{
	this.Container = "";
	this.Header = "";
	this.HeaderText = "";
	this.Days = "";
	this.Day = "";
	this.Today = "";
	this.Selected = "";
	this.DayRollover = "";
	this.WeekDays = "";
	this.Format = "MM/dd/yyyy";
}
function Calendar(textboxId,buttonId,css)
{
	var txt = document.getElementById(textboxId);
	var btn = document.getElementById(buttonId);
	var date = new Date();
	var month = date.getMonth();
	var year = date.getFullYear();
	var selDay = 1,selMonth = 0,selYear = 0;
	var cssExists = isDefined(css),appended = false;
	var classes = cssExists ? css : null;
	var days = [31,28,31,30,31,30,31,31,30,31,30,31];
	var months = ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
	var weekdays = ["S","M","T","W","T","F","S"];
	var CLASS_ATTR = "attrCalClassName",HEADER_ATTR = "attrCalCont",VALUE_ATTR = "attrCalDateValue";
	var header,table;
	var container = document.createElement("TABLE");
	container.id = "tblCalCon"+txt.id;
	container.cellSpacing = 0;
	container.style.position = "absolute";
	container.style.zIndex = 6899;
	var row = container.insertRow(-1);
	row.insertCell(-1);
	if(cssExists)container.className = classes.Container;
	container.style.backgroundColor = "#fff";
	container.style.display = "none";
	var click = null;
	btn.onclick = function(e){open();}

	this.getValue = function()
	{
		var val = txt.getAttribute(VALUE_ATTR);
		return isDefined(val) && val.length > 0 ? val : null;
	}
	this.setValue = function(selectedDate){setDate(selectedDate);}

	var setDate = function(selectedDate)
	{
		if(!isDefined(selectedDate) || selectedDate.length == 0)
		{
			txt.value = "";
			txt.removeAttribute(VALUE_ATTR);
			selDay = 1,selMonth = 0,selYear = 0;
			return;
		}
		date = new Date(selectedDate);
		month = date.getMonth();
		year = date.getFullYear();
		selDay = date.getDate();
		selMonth = month;
		selYear = year;
		var val = date.format("MM/dd/yyyy");
		if(cssExists && isDefined(classes.Format) && classes.Format.length > 0)
			txt.value = date.format(classes.Format);
		else txt.value = val;
		txt.setAttribute(VALUE_ATTR,val);
	}
	var open = function()
	{
		if(!appended)
		{
			document.body.appendChild(container);
			appended = true;
			build();
		}
		else container.style.display = "";
		var b = Sys.UI.DomElement.getBounds(btn);
		container.style.top = b.y - 10 + "px";
		container.style.left = b.x + b.width - 10 + "px";
		container.style.display = "";
		draw();
		click = typeof(document.onclick)=="function"?document.onclick:null;
		document.onclick = function(e){check(e);}
		txt.onkeyup = function(e)
		{
			this.value = "";
			this.removeAttribute(VALUE_ATTR);
		}
	}
	var close = function()
	{
		container.style.display = "none";
		if(isDefined(click))document.onclick = click;
	}
	var check = function(ev)
	{
		ev = ev || window.event;
		ev.cancelBubble = true;
		var t = ev.target || ev.srcElement;
		var p = getParentByAttribute(t,HEADER_ATTR,"true");
		if((!isDefined(p) || p.id != header.id) && t.id != btn.id)close();
	} 
	var draw = function()
	{
		var spns = getChildrenByTagName(header,"SPAN",false);
		spns[1].innerHTML = months[month];
		spns[2].innerHTML = year;
		fill();
	}
	var fill = function()
	{
		var cdd = new Date();
		var d = new Date(year,month,1),cy = cdd.getFullYear(),cm = cdd.getMonth(),cd = cdd.getDate();
		var fd = d.getDay();
		var length,dd=1,cell;
		if(month == 1 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))length = 29;
		else length = days[month];
		for(var i=1;i<table.rows.length;i++)
		{
			for(var j=0;j<table.rows[i].cells.length;j++)
			{
				cell = table.rows[i].cells[j];
				if((i==1 && j>=fd) || (i>1 && dd<=length))
				{
					cell.innerHTML = dd;
					if(cssExists)
					{
						if(cy == year && cm == month && dd == cd)cell.className = classes.Today;
						else if(year == selYear && month == selMonth && dd == selDay)cell.className = classes.Selected;
						else cell.className = classes.Day;
					}
					cell.onclick = function(e){selected(this);}
					cell.onmouseover = function(e){roll(this);}
					cell.onmouseout = function(e){roll(this);}
					++dd;
				}
				else
				{
					cell.className = classes.Day;
					cell.innerHTML = "&nbsp;";
					cell.onclick = cell.onmouseover = cell.onmouseout = null;
				}
				cell.setAttribute(CLASS_ATTR,classes.DayRollover);
			}
		}
	}
	var back = function()
	{
		if(month == 0){month = 11;--year;}
		else --month;
		draw();
	}
	var forward = function()
	{
		if(month == 11){month = 0;++year;}
		else ++month;
		draw();
	}
	var selected = function(cell)
	{
		cell.className = classes.Selected;
		setDate((month+1)+"/"+parseInt(getElementText(cell))+"/"+year);
		if(typeof(txt.onchange) == "function")txt.onchange();
		close();
	}
	var roll = function(cell)
	{
		if(!cssExists)return;
		var c = cell.className;
		cell.className = cell.getAttribute(CLASS_ATTR);
		cell.setAttribute(CLASS_ATTR,c);
	}
	var build = function()
	{
		container.rows[0].cells[0].innerHTML = "";
		header = document.createElement("DIV");
		header.id = "divCalHead"+txt.id;
		header.setAttribute(HEADER_ATTR,"true");
		if(cssExists)header.className = classes.Header;
		var cell1 = getHeaderSpan("spnCalHeadB"+txt.id,"&lt;&lt;",cssExists?classes.HeaderText:null);
		cell1.style.marginRight = "22px";
		cell1.style.cursor = "pointer";
		header.appendChild(cell1);
		cell1.onclick = function(e){back();}
		var cell2 = getHeaderSpan("spnCalHeadM"+txt.id,months[month],cssExists?classes.HeaderText:null);
		cell2.style.marginRight = "6px";
		header.appendChild(cell2);
		var cell4 = getHeaderSpan("spnCalHeadY"+txt.id,year,cssExists?classes.HeaderText:null);
		header.appendChild(cell4);
		var cell5 = getHeaderSpan("spnCalHeadF"+txt.id,"&gt;&gt;",cssExists?classes.HeaderText:null);
		cell5.style.marginLeft = "22px";
		cell5.style.cursor = "pointer";
		header.appendChild(cell5);
		cell5.onclick = function(e){forward();}
		container.rows[0].cells[0].appendChild(header);
		table = getTable();
		fill();
	}
	var getTable = function()
	{
		var tbl = document.createElement("TABLE");
		tbl.id = "tblCalDays"+txt.id;
		tbl.cellSpacing = 1;
		if(cssExists)tbl.className = classes.Days;
		var row,cell;
		for(var i=0;i<7;i++)
		{
			row = tbl.insertRow(-1)
			for(var j=0;j<7;j++)
			{
				cell = row.insertCell(-1);
				if(i==0 && cssExists)cell.className = classes.WeekDays;
				cell.innerHTML = "&nbsp;";
			}
		}
		for(var i in tbl.rows[0].cells)
			tbl.rows[0].cells[i].innerHTML = weekdays[i];
		container.rows[0].cells[0].appendChild(tbl);
		return tbl;
	}
	var getHeaderSpan = function(id,html,css)
	{
		var cell = document.createElement("SPAN");
		if(isDefined(id))cell.id = id;
		if(isDefined(css))cell.className = css;
		cell.innerHTML = html;
		return cell;
	}
}