  // JScript source code
function Trace(string)
{
	var log = document.getElementById('logger');
	if(log)log.value+=string +'\n';
}
	function Browser()
	{
	  this.dom = document.getElementById?1:0;
	  this.ie4 = (document.all && !this.dom)?1:0;
	  this.ns4 = (document.layers && !this.dom)?1:0;
	  this.ns6 = (this.dom && !document.all)?1:0;
	  this.ie5 = (this.dom && document.all)?1:0;
	  this.ok = this.dom || this.ie4 || this.ns4;
	  this.platform = navigator.platform;
	}
	var browser = new Browser();
	function padZero(num) 
	{
	  return ((num <= 9) ? ("0" + num) : num);
	}
	Date.isLeapYear = function(year){ if (year%4==0 && ((year%100!=0) || (year%400==0))) return true; else return false; }
	Date.daysInYear = function(year){ if (Date.isLeapYear(year)) return 366; else return 365;}
	Date.prototype.addDays = function(num)
	{
		var newDate = new Date(this.valueOf());
		//cannot just add numeric value like 1000*60*60*24 * num because of Daylight Savings Time
		var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		if(Date.isLeapYear(newDate.getFullYear()))
		{ daysInMonth[1]=29;}
		if(num>0)
		{
			var daysleftincurmonth = (daysInMonth[newDate.getMonth()] - newDate.getDate());
			while(num > daysleftincurmonth)
			{
				newDate.setDate(1);
				if(newDate.getMonth()==11)
				{
					newDate.setMonth(0);
					newDate.setYear(newDate.getFullYear()+1);
					if(Date.isLeapYear(newDate.getFullYear()))
					{ daysInMonth[1]=29;}
				}
				else {newDate.setMonth(newDate.getMonth()+1);}
				num = num - daysleftincurmonth;
				num--;
				daysleftincurmonth = (daysInMonth[newDate.getMonth()] - newDate.getDate());
			}
			newDate.setDate(newDate.getDate()+num);
		}
		else if (num<0)
		{
			var daysleftincurmonth = -newDate.getDate() ;
			while(num <= daysleftincurmonth)
			{
				if(newDate.getMonth()==0)
				{
					newDate.setMonth(11);
					newDate.setYear(newDate.getFullYear()-1);
					if(Date.isLeapYear(newDate.getFullYear()))
					{ daysInMonth[1]=29;}
				}
				else 
				{
					newDate.setMonth(newDate.getMonth()-1);
				}
				newDate.setDate(daysInMonth[newDate.getMonth()]);
				num = num - daysleftincurmonth;
				daysleftincurmonth = -newDate.getDate() ;
			}
			newDate.setDate(newDate.getDate()+num);
		}
		return newDate;
	}
	Date.prototype.getDaysInMonth = function ()
	{
		var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		var month = this.getMonth();
		var year = this.getYear();
		if (month!=1) {
			return daysInMonth[month]
		}
		else {
	     // is it a leap year
		    if (Date.isLeapYear(year)) {
			  return 29;
			}
		    else {
			  return 28;
			}
	   }
	}
	
function CalendarHelper()
{
	var today = new Date();
	var tDay=today.getDate();
	var tMonth= today.getMonth();
	var tYear= today.getFullYear();
	this.Today= new Date(tYear,tMonth,tDay);
	this.DaysOfWeek =new Array("S","M","T","W","T","F","S");
	this.Months= new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	this.DaysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
}
var CalendarHelper = new CalendarHelper();

function JSCalendar(initdate,ID,container, nextmonthcontainer)
{
	//Customizable properties
	this.CanSelectPastDates = false;
	this.inSelect = false;
	this.ShowWeekSelect=false;
	this.ShowOtherMonthDays=true;
	this.ShowNextMonth = false;
	this.StartDay=0;
	this.NextMonthArrow = '&gt;';
	this.PreviousMonthArrow = '&lt;';
	this.MonthSelect = '&raquo;';
	this.WeekSelect = '&gt;';
	this.DisabledMonthSelect = '&raquo;';
	this.DisabledWeekSelect = '&gt;';
	
	//Initialize
	var me = this;
	this.ID = ID;
	if (!initdate)
	{
		initdate = CalendarHelper.Today;
	}
	var m_SelStartDate = this.SelStartDate = initdate;
	var m_SelEndDate = this.SelEndDate = initdate;
	var m_Month = this.Month = m_SelStartDate.getMonth();
	var m_Year = this.Year = m_SelEndDate.getFullYear();
	
	var calendardiv = document.createElement('div');
	calendardiv.className="calspan";
	this.Calendar = calendardiv;
	var nextmonthcalendardiv = document.createElement('div');
	nextmonthcalendardiv.className="calspan";
	this.NextMonthCalendar = nextmonthcalendardiv;
	
	this.DaysSelected = new Array();
	var m_dateFrom = this.dateFrom = new Date(1900,0,1);
	var m_dateTo = this.dateTo = new Date(3000,0,1);
	this.dateFromDay = function(){return padZero(m_dateFrom.getDate());};
	this.dateFromMonth = function(){return padZero(m_dateFrom.getMonth());};
	this.dateFromYear = function(){return m_dateFrom.getFullYear();};
	this.dateToDay = function(){return padZero(m_dateTo.getDate());};
	this.dateToMonth = function(){return padZero(m_dateTo.getMonth());};
	this.dateToYear = function(){return m_dateTo.getFullYear();};
	
	
	//Functions
	this.onDateSelected = function(){alert(me.SelStartDate + ':' + me.SelEndDate);};
	this.ClearSelect = function()
	{
		var daysel=me.DaysSelected.length;
		for(var i=0; i<daysel; i++)
		{
			var datetd = me.DaysSelected[i];
			datetd.ShowNormal();
		}
		me.DaysSelected.splice(0,daysel);
	};
	this.HighlightSelected = function()
	{
		var daysSelected = me.DaysSelected; 
		var mindate=null,maxdate=null
		for(var i=0,length=daysSelected.length;i<length;i++)
		{
			if(daysSelected[i].CanSelect)
			{
				if(mindate==null)mindate = daysSelected[i].DateValue;
				else mindate = Math.min(mindate,daysSelected[i].DateValue);
				if(maxdate==null)maxdate = daysSelected[i].DateValue;
				else maxdate = Math.max(maxdate,daysSelected[i].DateValue);
				daysSelected[i].ShowSelect();
			}
		}
		if(mindate && maxdate)
		{
			me.SelStartDate = new Date(mindate);
			me.SelEndDate = new Date(maxdate);
			me.onDateSelected();
		}
	}
	this.ShowSelected = function(toDate,shift)
	{
		var date1 = me.SelStartDate;
		if(shift && toDate<me.SelStartDate)date1=me.SelEndDate;
		var date2 = toDate;
		var mindate = new Date(Math.min(date1,date2));
		var maxdate = new Date(Math.max(date1,date2));
		//debugger;
		var tmpDate = new Date(mindate.valueOf());
		var NewSelectedArray = new Array();
		while(tmpDate<=maxdate)
		{
			var month = tmpDate.getMonth();
			var year = tmpDate.getFullYear();
			var currentView = (me.CalendarViews[year]?(me.CalendarViews[year][month]?me.CalendarViews[year][month]:me.GetCalendarView(year,month)):me.GetCalendarView(year,month));
			if (!currentView) currentView=me.GetCalendarView(year,month);
			var Days = currentView.Days;
			var dayslength = Days.length;
			for(var i=0; i<dayslength; i++)
			{
				var datetd = Days[i];
				if(datetd.DateValue <= currentView.EndMonthDate)
				{
					tmpDate = datetd.DateValue;
					if (datetd.DateValue>=mindate && datetd.DateValue <=maxdate)
					{
						NewSelectedArray.push(datetd);
						datetd.ShowHover();
					}
					else
					{	
						datetd.ShowNormal();
					}
				}
			}
			tmpDate = tmpDate.addDays(1);
		}
		me.DaysSelected = NewSelectedArray;
	};
	this.IsSelected = function(date)
	{
		for(var i=0; i<me.DaysSelected.length; i++)
		{
			if(me.DaysSelected[i]==date)return true;
		}
		return false;
	};
	this.onDateMouseOver = function(e)
	{
		if(!e&&window.event)e=window.event;
		var targ = e.target;
		if (!targ) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		if (me.inSelect && targ.CanSelect)
		{	
			me.ShowSelected(targ.DateValue,e.shiftKey);
		}
		else
		{	
			targ.ShowHover();
		}
		return false;
	};
	this.onDateMouseOut = function(e)
	{
		if(!e&&window.event)e=window.event;
		var targ = e.target;
		if (!targ) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		if (!me.inSelect)
		{
			targ.ShowLast();
		}
		e.cancelBubble=true;
		return false;
	};
	this.SelStart = function(e)
	{
		if(!e&&window.event)e=window.event;
		var targ = e.target;
		if (!targ) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		if(targ.CanSelect)
		{
			me.ClearSelect();
			if(!e.shiftKey)
			{
				me.SelStartDate = targ.DateValue;
			}
			me.inSelect = true;
			me.DaysSelected.push(targ);
		}
		//else 
		//    me.inSelect = false;
		return false;
	};
	this.SelEnd = function(e)
	{
		//debugger;
		if(!e&&window.event)e=window.event;
		var targ = e.target;
		if (!targ) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		if(me.inSelect && targ.CanSelect)
		{
			me.ShowSelected(targ.DateValue,e.shiftKey);
			me.inSelect = false;
			me.HighlightSelected();
		}
		else
		{
			if(me.inSelect)
			{
			me.inSelect = false;
		    me.ClearSelect();
			}
		}
		//alert(targ);
	};

	var m_CalendarViews = this.CalendarViews = new Array();
	m_CalendarViews[m_Year] = new Array(12);
	this.CurrentView = null;
	
	//Set ContainerLayer
	if (browser.ns4)
	{
	    var tmpLayer = new Layer(127);
		var tmpLayer2 = new Layer(127);
	}
	if (browser.dom || browser.ie4)
	{
		var tmpLayer = browser.dom?document.getElementById(container):eval('document.all.' + container);
		var tmpLayer2 = browser.dom?document.getElementById(nextmonthcontainer):eval('document.all.' + nextmonthcontainer);
		if(!tmpLayer)
		{
			//Create the layer
			document.write('<div id="' + container + '"></div>');
			tmpLayer = browser.dom?document.getElementById(container):eval('document.all.' + container);
		}
		if(!tmpLayer2)
		{
			//Create the layer
			document.write('<div id="' + nextmonthcontainer + '"></div>');
			tmpLayer2 = browser.dom?document.getElementById(nextmonthcontainer):eval('document.all.' + nextmonthcontainer);
		}
	}
	this.containerLayer = tmpLayer;
	this.NextMontContainerLayer = tmpLayer2
	
	//Add mouse up and down tracking events
	this.OnMouseDown = function(e)
	{
		return true;
	}
	this.OnMouseUp = function(e)
	{
		if(!e&&window.event)e=window.event;
		var targ = e.target;
		if (!targ) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		if(me.inSelect)
		{
			if(!targ.DateValue)
			{
				me.inSelect=false;
				me.ClearSelect();
			}
		}
	}
	//addEvent(document,'mousedown',me.OnMouseDown);
	addEvent(document,'mouseup',me.OnMouseUp);
};
function ReturnFalse()
{
	return false;
}
	function ShowLast()
	{
		this.className=this.LastClass;
	}
	function ShowHover()
	{
		if(this.CanSelect)this.className=this.HoverClass;
	}
	function ShowSelect()
	{
		if(this.CanSelect)
		{
			this.className=this.SelectClass;
			this.LastClass = this.className;
		}
	}
	function ShowNormal()
	{
		this.className=this.NormalClass;
		this.LastClass = this.className;
	}
	JSCalendar.prototype.ShowCalendar = function()
	{
		this.CurrentView =this.GetCalendarView(this.SelStartDate.getFullYear(),this.SelStartDate.getMonth())
		this.Calendar.appendChild(this.CurrentView.TableElement); 
		if(this.ShowNextMonth)
		{
			this.CurrentView.NextMonthLink.style.visibility="hidden";
			this.CurrentView.PrevMonthLink.style.visibility="";
			var nyear = this.SelStartDate.getFullYear();
			var nmonth = this.SelStartDate.getMonth()+1;
			if (nmonth>11) {nmonth=0; nyear++;}
			this.NextMonthView =this.GetCalendarView(nyear,nmonth,false)
			this.NextMonthView.NextMonthLink.style.visibility="";
			this.NextMonthView.PrevMonthLink.style.visibility="hidden";
			this.NextMonthCalendar.appendChild(this.NextMonthView.TableElement); 
			this.NextMontContainerLayer.appendChild(this.NextMonthCalendar);  
		}
		this.containerLayer.appendChild(this.Calendar);  
		return true;
	}
	JSCalendar.prototype.ChangeCalendarView = function(Year,Month)
	{
		var calendar = this.Calendar;
		var children = calendar.childNodes;
		for(var i=children.length-1; i>=0; i--)
		{
			calendar.removeChild(children[i]);
		}
		this.CurrentView = this.GetCalendarView(Year,Month)
		calendar.appendChild(this.CurrentView.TableElement);
		if(this.ShowNextMonth)
		{
			this.CurrentView.NextMonthLink.style.visibility="hidden";
			this.CurrentView.PrevMonthLink.style.visibility="";
			var nyear = Year;
			var nmonth = Month+1;
			if (nmonth>11) {nmonth=0; nyear++;}
			this.NextMonthView =this.GetCalendarView(nyear,nmonth,false)
			this.NextMonthView.NextMonthLink.style.visibility="";
			this.NextMonthView.PrevMonthLink.style.visibility="hidden";
			var nmcalendar = this.NextMonthCalendar;
			var nmchildren = nmcalendar.childNodes;
			for(var i=nmchildren.length-1; i>=0; i--)
			{
				nmcalendar.removeChild(nmchildren[i]);
			}
			nmcalendar.appendChild(this.NextMonthView.TableElement); 
		}
	}
	JSCalendar.prototype.GetCalendarView = function(Year,Month,IsCurView)
	{
		if(IsCurView==undefined)IsCurView=true;
		if(IsCurView)
		{
			this.Year = Year;
			this.Month=Month;
		}
		if(!this.CalendarViews[Year])this.CalendarViews[Year]=new Array(12);
		var calendarview = this.CalendarViews[Year][Month];
		if(!calendarview)
		{
			//build it
			calendarview = this.CalendarViews[Year][Month] = new CalendarView(Year,Month,this);
		}
		return calendarview;
	}
	JSCalendar.prototype.changeYear = function(incr)
	{
	   	if(incr!=1)this.Year+=incr;
	   	this.ChangeCalendarView(this.Year,this.Month);
	}
	JSCalendar.prototype.changeMonth = function(incr){
	    if (this.Month==11 && incr==1){
	      this.Month = 0;
	  	  this.Year++;
	    } else {
	      if (this.Month==0 && incr==-1){
	        this.Month = 11;
		    this.Year--;
	      } else {
		    (incr==1)?this.Month++:this.Month--;
		  }
		}
	   	this.ChangeCalendarView(this.Year,this.Month);
	}
	JSCalendar.prototype.formatDateAsString = function(day, month, year){
	  var delim = eval('/\\' + this.dateDelim + '/g');
	   switch (this.dateFormat.replace(delim,"")){
	     case 'ddmmmyyyy': return padZero(day) + this.dateDelim + this.Months[month].substr(0,3) + this.dateDelim + year;
		 case 'ddmmyyyy': return padZero(day) + this.dateDelim + padZero(month+1) + this.dateDelim + year;
		 case 'mmddyyyy': return padZero((month+1)) + this.dateDelim + padZero(day) + this.dateDelim + year;
		 case 'mmddyy': return padZero((month+1)) + this.dateDelim + padZero(day) + this.dateDelim + year.toString().substr(2,2);
	     case 'yyyymmdd': return year + this.dateDelim + padZero(month+1) + this.dateDelim + padZero(day);
		 default: alert('unsupported date format');
	   }
	}
CalendarView = function(Year,Month,Calendar)
{
	var me = this;
	this.ClickMonth = function(e)
	{
		var targ;
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
		var days = targ.Days;
		while(targ && !days)
		{
			targ=targ.parentNode;
			days=targ.Days;
		}
		if(days)
		{
			var dayslength = days.length;
			Calendar.ClearSelect();
			for(var i=0; i<dayslength; i++)
			{
				Calendar.DaysSelected.push(days[i]);
			}
			Calendar.HighlightSelected();
		
		}
		return false;
	}
	this.MouseOverMonth = function(e)
	{
		if (!e) var e = window.event;
		var targ=e.target, relTarg = e.relatedTarget;
		if (!targ) targ = targ = e.srcElement;
		if(!relTarg) relTarg = e.fromElement;
		if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
		if(IsAncestor(targ,relTarg)) return true;
		var days = targ.Days;
		if(days)
		{
			var dayslength = days.length;
			for(var i=0; i<dayslength; i++)
			{
				days[i].ShowHover();
			}
		}
	}
	this.MouseOutMonth = function(e)
	{
		if (!e) var e = window.event;
		var targ=e.target, relTarg = e.relatedTarget;
		if (!targ) targ = targ = e.srcElement;
		if(!relTarg) relTarg = e.toElement;
		if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
		if(IsAncestor(relTarg,targ)) return true;
		var days = targ.Days;
		if(days)
		{
			var dayslength = days.length;
			for(var i=0; i<dayslength; i++)
			{
				days[i].ShowLast();
			}
		}
	}
	this.ClickWeek = function(e)
	{
		var targ;
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
		var days = targ.Days;
		while(targ && !days)
		{
			targ=targ.parentNode;
			days=targ.Days;
		}
		if(days)
		{
			Calendar.ClearSelect();
			for(var i=0;i<=6;i++)
			{
				Calendar.DaysSelected.push(days[i]);
			}
			Calendar.HighlightSelected();
		}
		return true;
	}
	this.MouseOverWeek = function(e)
	{
		if (!e) var e = window.event;
		var targ=e.target, relTarg = e.relatedTarget;
		if (!targ) targ = targ = e.srcElement;
		if(!relTarg) relTarg = e.fromElement;
		if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
		Trace('Over: ' + targ.tagName + ':' + ((!relTarg)?'null':relTarg.tagName));
		var days = targ.Days;
		//if(!days && IsAncestor(targ,relTarg)) return true;
		if(days)
		{
			me.ClearHover();
			for(var i=0; i<=6; i++)
			{
				days[i].ShowHover();
			}
		}
	}
	this.MouseOutWeek = function(e)
	{
		if (!e) var e = window.event;
		var targ=e.target, relTarg = e.relatedTarget;
		if (!targ) targ = targ = e.srcElement;
		if(!relTarg) relTarg = e.toElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		var tracestring = 'Out: ' + targ.tagName + ':' + ((!relTarg)?'null':relTarg.tagName);
		var days = targ.Days;
		if (!days && IsAncestor(targ,relTarg))
		{
			tracestring+=' -- No Days & Anc';
			while(relTarg && !(days = relTarg.Days))
			{
				relTarg = relTarg.parentNode;
			}
			if(!days)
			{
				while(targ && !days)
				{
					targ = targ.parentNode;
					if(targ)days = targ.Days;
				}
			}
			else 
			{
				Trace(tracestring+' -- returned');return false;
			}
		}
		if(days && !IsAncestor(relTarg,targ))
		{
			tracestring+=' -- ShowLast';
			for(var i=0; i<=6; i++)
			{
				days[i].ShowLast();
			}
		}
		else tracestring+=' -- Else ';
		Trace(tracestring);
	}
	this.ClearHover = function()
	{
		for(var i=0; i<me.Days.length; i++)
		{
			me.Days[i].ShowLast();
		}
	}
	this.Calendar = Calendar;
	this.Month = Month;
	var iTodayValue = CalendarHelper.Today.valueOf();
	var m_MonthName = this.MonthName = CalendarHelper.Months[Month];
	var m_BeginMonthDate = this.BeginMonthDate = new Date(Year,Month,1);
	var m_EndMonthDate = this.EndMonthDate = new Date(Year,Month,m_BeginMonthDate.getDaysInMonth());
	var startdom = m_BeginMonthDate.getDay();
	var lastdom = m_EndMonthDate.getDay();
	var daysafter = 6-lastdom;
	var selStart = Calendar.SelStartDate;
	var selEnd = Calendar.SelEndDate;
	var m_CalStartDate = this.CalStartDate = m_BeginMonthDate.addDays(-startdom);
	var m_CalEndDate = this.CalEndDate = m_EndMonthDate.addDays(daysafter);

	var m_Days = this.Days = new Array();
	var m_DayLookup = this.DayLookup = new Array();
	for (var i=0,tmpDate=m_CalStartDate; tmpDate<=m_CalEndDate; i++,tmpDate = tmpDate.addDays(1))
	{
		var td = document.createElement('td');
		td.id = tmpDate.getTime();
		if (tmpDate<m_BeginMonthDate || tmpDate>m_EndMonthDate)
		{
			if (Calendar.ShowOtherMonthDays)
			{
				td.innerHTML = tmpDate.getDate();
			}
		}
		else
		{
			td.innerHTML = tmpDate.getDate();
		}
		td.DateValue = new Date(tmpDate);
		td.HoverClass='CalHoverDate';
		var normalclass='Cal';
		var selectclass='Cal';
		if(!Calendar.CanSelectPastDates && tmpDate.valueOf() < iTodayValue)
		{
			normalclass += 'D';
			selectclass += 'D';
			td.CanSelect=false;
		}
		else { 
			if(iTodayValue==tmpDate.valueOf()) normalclass+='T';
			td.CanSelect = true;
		}
		if (tmpDate<m_BeginMonthDate || tmpDate>m_EndMonthDate)
		{
			normalclass += 'O';
			selectclass += 'O';
			if(!Calendar.ShowOtherMonthDays)
				td.CanSelect=false;
		}
		selectclass += 'SelMDate';
		normalclass += 'MDate';
		if(tmpDate >= selStart && tmpDate <= selEnd)
		{
			if(td.CanSelect)
			{
			td.className = selectclass;
			Calendar.DaysSelected.push(td);
			}
			else td.className = normalclass;
		}
		else td.className = normalclass;
		td.LastClass=td.className;
		td.SelectClass=selectclass;
		td.NormalClass=normalclass;
		
		td.ShowHover = ShowHover;
		td.ShowSelect = ShowSelect;
		td.ShowNormal = ShowNormal;
		td.ShowLast = ShowLast;
		td.onmousedown = Calendar.SelStart;
		//addEvent(td,'mousedown',Calendar.SelStart);
		addEvent(td,'mouseout',Calendar.onDateMouseOut);
		addEvent(td,'mouseover',Calendar.onDateMouseOver);
		addEvent(td,'selectstart',ReturnFalse);
		addEvent(td,'drag',ReturnFalse);
		addEvent(td,'mouseup',Calendar.SelEnd);
		m_Days[i] = td;
		m_DayLookup[tmpDate] = td;
	}
	var numweeks = m_Days.length/7;
	var m_Weeks = this.Weeks = new Array(numweeks);
	for(var weeknum=0; weeknum<numweeks; weeknum++)
	{
		var week = new Array(7);
		week[0]= m_Days[weeknum *7 + 0]; 
		week[1]= m_Days[weeknum *7 + 1]; 
		week[2]= m_Days[weeknum *7 + 2]; 
		week[3]= m_Days[weeknum *7 + 3]; 
		week[4]= m_Days[weeknum *7 + 4]; 
		week[5]= m_Days[weeknum *7 + 5]; 
		week[6]= m_Days[weeknum *7 + 6]; 
		m_Weeks[weeknum]=week;
		
	}
	this.DaysSelected = new Array();
	
	var iShowWeek = Calendar.ShowWeekSelect;
	var table = document.createElement('table');
	table.cellSpacing='0px';
	table.className='eventCal';
	var tbody = document.createElement('tbody');
	//Month Header
	var monthtr = document.createElement('tr');
	var monthtd = document.createElement('td');
	monthtd.colSpan = (iShowWeek?8:7);
	var monthtable = document.createElement('table');
	var mtbody = document.createElement('tbody');
	monthtable.border="0";
	monthtable.cellSpacing="0px"
	monthtable.cellPadding="0px"
	monthtable.width="100%"
	monthtable.className="CalMonthT";
	var mtr = document.createElement('tr');
	var mtd = document.createElement('td');
	mtd.className = 'CalPrevMonth';
	mtd.align='left';
	var mprevm = this.PrevMonthLink = document.createElement('a');
	mprevm.href="javascript:void(0);";
	mprevm.onclick = function(){Calendar.changeMonth(-1);}
	mprevm.innerHTML = Calendar.PreviousMonthArrow;
	mtd.appendChild(mprevm);
	mtr.appendChild(mtd);
	mtd = document.createElement('td');
	mtd.className = 'CalMonthName';
	mtd.align='center';
	mtd.innerHTML =  m_MonthName + ' ' + Year;
	mtr.appendChild(mtd);
	mtd = document.createElement('td');
	mtd.className = 'CalNextMonth';
	mtd.align='right';
	var mnextm = this.NextMonthLink = document.createElement('a');
	mnextm.href="javascript:void(0);";
	mnextm.onclick = function(){Calendar.changeMonth(1);}
	mnextm.innerHTML = Calendar.NextMonthArrow;
	mtd.appendChild(mnextm);
	mtr.appendChild(mtd);
	mtbody.appendChild(mtr);
	monthtable.appendChild(mtbody);
	monthtd.appendChild(monthtable);
	//monthtd.innerHTML = '<td align="right" class="CalNextMonth"><a href="javascript:' + Calendar.ID + '.changeMonth(1)">' + Calendar.NextMonthArrow + '</a></td></tr></table>';
	monthtr.appendChild(monthtd);
	tbody.appendChild(monthtr);
	//Day names
	var daynametr = document.createElement('tr');
	if(iShowWeek)
	{
		var monthseltd = document.createElement('td');
		monthseltd.Days = m_Days.slice(startdom, m_Days.length-daysafter);
		var classname = 'Cal';
		if (!Calendar.CanSelectPastDates && m_EndMonthDate.valueOf() < iTodayValue)
		{	
			monthseltd.className ='CalDMonthSel';
			monthseltd.innerHTML = Calendar.DisabledMonthSelect;
		}
		else
		{
			monthseltd.className ='CalMonthSel';
			addEvent(monthseltd,'click',this.ClickMonth);
			addEvent(monthseltd,'mouseover',this.MouseOverMonth);
			addEvent(monthseltd,'mouseout',this.MouseOutMonth);
			monthseltd.innerHTML = Calendar.MonthSelect;
		}
		daynametr.appendChild(monthseltd);
	}
	for(var i=0; i<7;i++)
	{
		var daynametd = document.createElement('td');
		daynametd.className = 'CalDOW';
		daynametd.innerHTML = CalendarHelper.DaysOfWeek[i];
		daynametr.appendChild(daynametd);
	}
	tbody.appendChild(daynametr);
	for(var i=0; i<numweeks; i++)
	{
		var tr = document.createElement('tr');
		if(iShowWeek)
		{
			var weekseltd = document.createElement('td');
			weekseltd.Days = m_Weeks[i];
			var classname = 'Cal';
			if (!Calendar.CanSelectPastDates && m_Weeks[i][6].DateValue < iTodayValue) 
			{	
				weekseltd.className='CalDWeekSel';
				weekseltd.innerHTML = Calendar.DisabledWeekSelect; 
			}
			else
			{
				weekseltd.className='CalWeekSel';
				addEvent(weekseltd,'click',this.ClickWeek);
				addEvent(weekseltd,'mouseover',this.MouseOverWeek);
				addEvent(weekseltd,'mouseout',this.MouseOutWeek);
				weekseltd.innerHTML =Calendar.WeekSelect;
			}
			tr.appendChild(weekseltd);
		}
		tr.appendChild(m_Weeks[i][0]);
		tr.appendChild(m_Weeks[i][1]);
		tr.appendChild(m_Weeks[i][2]);
		tr.appendChild(m_Weeks[i][3]);
		tr.appendChild(m_Weeks[i][4]);
		tr.appendChild(m_Weeks[i][5]);
		tr.appendChild(m_Weeks[i][6]);
		tbody.appendChild(tr);
	}
	table.appendChild(tbody);
	this.TableElement = table;
}
function IsAncestor(tree,node)
{
	while(tree)
	{
		if(tree==node)return true;
		else tree=tree.parentNode;
	}
	return false;
}
