function CalendarContainer(oParentClass) {
	this.ParentClass = oParentClass || null;
	this.Parent = null;
	
	this.Properties = null;
	this.Utils = null;
	this.Ajax = null;
	
	this.Container = null;
	this.Header = null;
	this.HeaderTitleBar = null;
	this.DaysOfWeekContainer = null;
	this.DaysOfMonthContainer = null;
	this.DayOfMonth_Anchor = null;
	this.StatusBar = null;
	this.InfoPanel = null;
	
	this.selectedObject = null;
	this.SelectedEventDateElms = [];
	this.SelectedEventDateElm = null;
	this.hilitedNodeObject = null;
	
	this.HeaderBarHeight = 0;
	this.HeaderHeight = 0;
	this.HeaderButtonHeight = 0;
	
	this.ParentWidth = 0;
	this.ParentContainerWidth = 0;
	
	this.lastStoredMessage = "";
	
	this.bInDebugMode = false;
	this.EventDateSelected = false;
	this.bAJAXBusyWorking = false;
	
	this.Initialize = function() {
		var self = this;
		
		if (self.ParentClass) {
			self.bInDebugMode = self.ParentClass.bInDebugMode;
			self.Parent = self.ParentClass.Parent || null;
			self.Ajax = self.ParentClass.Ajax;
			if (self.Parent) {
			
				try {
					self.Properties = new CalendarProperties(self);
					self.Properties.Initialize();
				
					self.Utils = new CalendarUtils(self);
					self.Utils.Initialize();
				} catch(e) {
					if (self.bInDebugMode)
						alert("Unable to load dependencies\n\nError: " + e.message);
				}
				
				if (self.Properties && self.Utils) {
					self.HeaderBarHeight = ((self.Properties.iSquareSize) / 1.3);
					self.HeaderHeight = (self.HeaderBarHeight * 2);
					self.HeaderButtonHeight = self.HeaderBarHeight;
					
					self.ParentWidth = ((self.Properties.iSquareSize * 7) + 10);
					self.ParentContainerWidth = self.Parent.parentNode.offsetWidth;
					
					self.CreateCalendar();
					
					return true;
				} else {
					if (!self.Properties) {
						if (self.bInDebugMode)
							alert("The Calendar could not be loaded because it is dependant on the CalendarProperties JavaScript class, which could not be found");
					}
					if (!self.Utils) {
						if (self.bInDebugMode)
							alert("The Calendar could not be loaded because it is dependant on the CalendarUtils JavaScript class, which could not be found");
					}
				}
			}
		} else {
			if (self.bInDebugMode)
				alert("CalendarContainer: Could not find Parent Class!");
		}
			
		return false;
	};
	
	this.CreateCalendar = function() {
		var self = this;
		
		if (self.Parent.className != "pipiwyg calendar") {
			self.Parent.className = "";
			Element.addClassName(self.Parent, "pipiwyg calendar");
			//self.Parent.className = "pipiwyg_calendar";
		}
			
		self.Parent.style.width = (self.ParentWidth) + "px";
		
		self.drawCalendar();
		
		self.Parent.style.left = (((self.ParentContainerWidth - self.Parent.offsetWidth) / 2)) + "px";
		return;
	};
	
	this.drawCalendar = function() {
		var self = this;
		
		//self.clearCalendarContainer();
		
		self.Parent.appendChild(self.createContainer());
		self.Container.appendChild(self.createHeader());
		self.Container.appendChild(self.createDaysOfWeek());
		self.Container.appendChild(self.createEmptyDaysOfMonth());
		self.Container.appendChild(self.createStatusBar());
		self.Container.appendChild(self.createInfoPanel());
		
		self.Utils.reloadCalendar();
		
		return;
	};
	
	this.clearCalendarContainer = function() {
		var self = this;
		try {	
			while(self.Parent.childNodes.length > 0)
				self.Parent.removeChild(self.Parent.childNodes[0]);
		} catch(e) {
			if (self.bInDebugMode)
				alert("Unable to clear calendar container");
		}
		return;
	};
	
	this.createContainer = function() {
		var self = this;
		
		self.Container = document.createElement("div");
		Element.addClassName(self.Container, "container");
		//self.Container.className = "calendar_header_container";
		
		return self.Container;
	};
	
	this.createHeader = function() {
		var self = this;
		
		self.Header = document.createElement("div");
		Element.addClassName(self.Header, "header");
		//self.Header.className = "calendar_header";
		
		var oHeaderTop = document.createElement("div");
		Element.addClassName(oHeaderTop, "header top");
		//oHeaderTop.className = "calendar_header_top";
		
		oHeaderTop.appendChild(self.createHeaderTitlebar());
		
		var oHeaderBot = document.createElement("div");
		Element.addClassName(oHeaderBot, "header bottom");
		//oHeaderBot.className = "calendar_header_bottom";
		
		oHeaderBot.appendChild(self.createHeaderButton("Next","Year","","","","Goto Next Year (" + parseInt(parseInt(self.Properties.dtCalendar_Year) + 1) + ")"));
		oHeaderBot.appendChild(self.createHeaderButton("Next","Month","","","","Goto Next Month (" + self.Properties.MonthsOfYear[((parseInt(self.Properties.dtCalendar_Month)+1 > 11)?0:(parseInt(self.Properties.dtCalendar_Month) + 1))].substring(0,self.Properties.iShortDayNameLength) + ")"));
		oHeaderBot.appendChild(self.createHeaderButton("Last","Year","","","","Goto Last Year (" + parseInt(parseInt(self.Properties.dtCalendar_Year) - 1) + ")"));
		oHeaderBot.appendChild(self.createHeaderButton("Last","Month","","","","Goto Last Month (" + self.Properties.MonthsOfYear[((parseInt(self.Properties.dtCalendar_Month) - 1 < 0)?11:(parseInt(self.Properties.dtCalendar_Month) - 1))].substring(0,self.Properties.iShortDayNameLength) + ")"));
		oHeaderBot.appendChild(self.createHeaderButton("Today","","Today","JavaScript:void(0);","PipIWYG.Calendar.CalContainer.Utils.GoToToday();","Goto Today (" + self.Properties.dtToday_Date + " " + self.Properties.MonthsOfYear[self.Properties.dtToday_Month].substring(0,self.Properties.iShortDayNameLength) + ")"));
		
		self.Header.appendChild(oHeaderTop);
		self.Header.appendChild(self.addHR());
		self.Header.appendChild(oHeaderBot);
		
		return self.Header;
	};
	
	this.createHeaderTitlebar = function() {
		var self = this;
		
		var oHeaderTitleBar = document.createElement("div");
		Element.addClassName(oHeaderTitleBar, "header titlebar");
		//oHeaderTitleBar.className = "title_bar";
		oHeaderTitleBar.style.padding = "3px 0px 3px 0px";
		oHeaderTitleBar.style.marginLeft = (self.Properties.iSquareSize * 2) + "px";
		oHeaderTitleBar.style.marginRight = (self.Properties.iSquareSize * 2) + "px";
		
		oHeaderTitleBar.style.fontSize = "1.1em";
		oHeaderTitleBar.style.marginLeft = "0px";
		oHeaderTitleBar.style.marginRight = "0px";
		
		self.HeaderTitleBar = oHeaderTitleBar;
		
		return self.HeaderTitleBar;
	};
	
	this.setHeaderTitleBarLabel = function(sLabelValue) {
		var self = this;
		
		var oHeaderTitlebar = self.HeaderTitleBar;
		if (oHeaderTitlebar) {
			if (oHeaderTitlebar.firstChild) {
				var oChild = oHeaderTitlebar.firstChild;
				if (oChild.firstChild)
					oChild.removeChild(oChild.firstChild);
				oChild.appendChild(document.createTextNode(sLabelValue));
			} else {
				var oChild = document.createElement("span");
				oChild.appendChild(document.createTextNode(sLabelValue));
				oHeaderTitlebar.appendChild(oChild);
			}
		}
		return;
	};
	
	/*this.createHeaderTitleButton = function(sButtonLabel) {
		var oHTB = document.createElement("div");
		oHTB.className = "header_button";
		
		var oLabel = document.createTextNode(sButtonLabel);
		oHTB.appendChild(oLabel);
		
		return oHTB;
	};*/
	
	this.createHeaderButton = function(sDirection,sType,sText,sURL,sOnClick,sDesc) {
		var self = this;
		
		var oHeaderButton = null;
		if (sText && sURL) {
			oHeaderButton = document.createElement("div");
			Element.addClassName(oHeaderButton, "titlebar");
			
			//oHeaderButton.className = "header_title_bar";
			oHeaderButton.style.padding = "0px 0px 0px 0px";
			oHeaderButton.style.marginLeft = ((self.Properties.iSquareSize * 2) - 5) + "px";
			oHeaderButton.style.marginRight = ((self.Properties.iSquareSize * 2) - 3) + "px";
			
			if (sURL) {
				var oButtonAnchor = document.createElement("a");
				if (is_safari_pip) oButtonAnchor.style.padding = "4px 0px 2px 0px";
				oButtonAnchor.href = sURL;
				if (is_safari_pip) oButtonAnchor.style.cursor = "pointer";
				if (sOnClick) {
					oButtonAnchor.onclick = function() {
						this.blur();
						return eval(sOnClick);
					}
				}
				if (sText)
					oButtonAnchor.appendChild(document.createTextNode(sText));
					
				if (sDesc) {
					oButtonAnchor.onmouseover = function() {
						if (!self.bAJAXBusyWorking)
							self.Utils.ShowStatusMessage(sDesc,"Info");
						return;
					}
					oButtonAnchor.onmouseout = function() {
						if (!self.bAJAXBusyWorking)
							self.Utils.ShowStatusMessage("","SelectedDate");
						return;
					}
				}
				oHeaderButton.appendChild(oButtonAnchor);
			}
		} else {
			oHeaderButton = document.createElement("span");
			Element.addClassName(oHeaderButton, "button");
			Element.addClassName(oHeaderButton, sDirection.toLowerCase() + "_" + sType.toLowerCase());
			//alert(oHeaderButton.className);
			//oHeaderButton.className = "header_button " + sDirection.toLowerCase() + "_" + sType.toLowerCase() + "_btn";
			oHeaderButton.style.width = (self.Properties.iSquareSize - 3) + "px";
			oHeaderButton.style.marginLeft = ((sDirection == "Last") ? "0px" : "0px");
			oHeaderButton.style.marginRight = ((sDirection == "Next") ? "1px" : "0px");
			
			var oButtonAnchor = document.createElement("a");
			oButtonAnchor.href = "JavaScript:void(0)";
			
			oButtonAnchor.onclick = function() {
				switch(sType) {
					case "Month": {
						if (sDirection == "Next") {
							var iYear = parseInt(self.Properties.dtCalendar_Year);
							var iMonth = parseInt(self.Properties.dtCalendar_Month) + 1;
							if (iMonth > 11) {
								iMonth = 0;
								iYear = iYear + 1;
							}
							var iDate = 1;
							
							self.Properties.setCalendarDate(iYear + "-" + iMonth + "-" + iDate);
						} else
						if (sDirection == "Last") {
							var iYear = parseInt(self.Properties.dtCalendar_Year);
							var iMonth = parseInt(self.Properties.dtCalendar_Month) - 1;
							if (iMonth < 0) {
								iMonth = 11;
								iYear = iYear - 1;
							}
							var iDate = 1;
							self.Properties.setCalendarDate(iYear + "-" + iMonth + "-" + iDate);
						}
					}
					break;
					
					case "Year": {
						if (sDirection == "Next") {
							var iYear = parseInt(self.Properties.dtCalendar_Year) + 1;
							var iMonth = parseInt(self.Properties.dtCalendar_Month);
							var iDate = 1;
							self.Properties.setCalendarDate(iYear + "-" + iMonth + "-" + iDate);
						} else
						if (sDirection == "Last") {
							var iYear = parseInt(self.Properties.dtCalendar_Year) - 1;
							var iMonth = parseInt(self.Properties.dtCalendar_Month);
							var iDate = 1;
							self.Properties.setCalendarDate(iYear + "-" + iMonth + "-" + iDate);
						}
					}
					break;
					
					default: {
						if (self.bInDebugMode)
							alert(sType);
					}
					break;
				}
				
				self.Utils.reloadCalendar();
				
				self.lastStoredMessage = "";
				
				this.blur();
				return;
			}
			
			if (sDesc) {
				oButtonAnchor.onmouseover = function() {
					if (!self.bAJAXBusyWorking)
						self.Utils.ShowStatusMessage(sDesc,"Info");
					return;
				}
				oButtonAnchor.onmouseout = function() {
					if (!self.bAJAXBusyWorking)
						self.Utils.ShowStatusMessage("","SelectedDate");
					return;
				}
			}
			
			var oImg = document.createElement("img");
			var sImgSrc = "lib/png/cal_btn_" + sDirection.toLowerCase();
			if (sType == "Month") {
				sImgSrc += '_m';
			}
			sImgSrc += ".png";
			oImg.src = sImgSrc;
			oImg.style.width = "8px";
			oImg.style.height = "7px";
			oImg.style.position = "relative";
			oImg.style.margin = "auto";
			oImg.style.marginTop = "5px";
			
			oButtonAnchor.appendChild(oImg);
			
			oHeaderButton.appendChild(oButtonAnchor);
		}
		
		return oHeaderButton;
	};
	
	this.createDaysOfWeek = function() {
		var self = this;
		
		self.DaysOfWeekContainer = document.createElement("div");
		Element.addClassName(self.DaysOfWeekContainer, "days_of_week");
		//self.DaysOfWeekContainer.className = "calendar_days_of_week";
		
		var oDayOfWeek = null;
		var oRight = null;
		var oBlock = null;
		var oLeft1 = null;
		var oLeft2 = null;
		var oLeft3 = null;
		var oLeft4 = null;
		var oLeft5 = null;
		
		for (var i = 0; i < self.Properties.DaysOfWeek.length; i++) {
			oDayOfWeek = document.createElement(((i == 5)? "div" : "span"));
			if (!(/MSIE 6/.test(navigator.userAgent))) {
				if ((/Safari/.test(navigator.userAgent))) {
					Element.addClassName(oDayOfWeek, ((i == 5) ? "day_of_week dow_block" : ((i == 6) ? "day_of_week dow_right" : "day_of_week dow_left")));
				} else {
					Element.addClassName(oDayOfWeek, ((i == 5) ? "day_of_week dow_block" : ((i == 6) ? "day_of_week dow_right" : "day_of_week dow_left")));
				}
				//oDayOfWeek.className = ((i == 5) ? "calendar_day_of_week dow_block" : ((i == 6) ? "calendar_day_of_week dow_right" : "calendar_day_of_week dow_left"));
			} else {
				Element.addClassName(oDayOfWeek, ((i == 5) ? "day_of_week dow_left" : ((i == 6) ? "day_of_week dow_right" : "day_of_week dow_left")));
				//oDayOfWeek.className = ((i == 5) ? "calendar_day_of_week dow_left" : ((i == 6) ? "calendar_day_of_week dow_right" : "calendar_day_of_week dow_left"));
			}
			
			oDayOfWeek.appendChild(document.createTextNode(self.Properties.DaysOfWeek[i].substring(0,self.Properties.iShortDayNameLength)));
			
			oDayOfWeek.style.width = ((i == 0 || i == 6) ? ((self.Properties.iSquareSize) + 1) + "px" : ((self.Properties.iSquareSize)) + "px");
			if (i == 6) oDayOfWeek.style.borderRightWidth = "1px";
			
			if (!oRight) oRight = ((i == 6) ? oDayOfWeek : null);
			if (!oBlock) oBlock = ((i == 5) ? oDayOfWeek : null);
			if (!oLeft1) oLeft1 = ((i == 0) ? oDayOfWeek : null);
			if (!oLeft2) oLeft2 = ((i == 1) ? oDayOfWeek : null);
			if (!oLeft3) oLeft3 = ((i == 2) ? oDayOfWeek : null);
			if (!oLeft4) oLeft4 = ((i == 3) ? oDayOfWeek : null);
			if (!oLeft5) oLeft5 = ((i == 4) ? oDayOfWeek : null);
			
			oDayOfWeek = null;
		}
		
		if (!(/MSIE 6/.test(navigator.userAgent))) {
			if ((/Safari/.test(navigator.userAgent))) {
				oBlock.style.marginLeft = ((self.Properties.iSquareSize * 5) + 6) + "px";
				oBlock.style.marginRight = ((self.Properties.iSquareSize) + 2) + "px";
			} else {
				oBlock.style.marginLeft = ((self.Properties.iSquareSize * 5) + 6) + "px";
				oBlock.style.marginRight = ((self.Properties.iSquareSize) + 2) + "px";
			}
		}
		
		self.DaysOfWeekContainer.appendChild(oRight);
		self.DaysOfWeekContainer.appendChild(oLeft1);
		self.DaysOfWeekContainer.appendChild(oLeft2);
		self.DaysOfWeekContainer.appendChild(oLeft3);
		self.DaysOfWeekContainer.appendChild(oLeft4);
		self.DaysOfWeekContainer.appendChild(oLeft5);
		self.DaysOfWeekContainer.appendChild(oBlock);
		
		if ((/MSIE 6/.test(navigator.userAgent))) {
			self.DaysOfWeekContainer.style.height = ((self.Properties.iSquareSize) / 1.3) + "px";
		}
		
		return self.DaysOfWeekContainer;
	};
	
	this.createEmptyDaysOfMonth = function() {
		var self = this;
		
		self.DaysOfMonthContainer = document.createElement("div");
		Element.addClassName(self.DaysOfMonthContainer, "days_of_month");
		//self.DaysOfMonthContainer.className = "calendar_days_of_month";
		self.DaysOfMonthContainer.id = "Days_Of_Month_Container";
		
		var iNumRows = 6;
		var iNumCols = self.Properties.DaysOfWeek.length;
		var iDayOfWeek = 1;
		var iTotalBlocks = 42;
		var iCurrentWeek = 1;
		
		var oDayOfMonth = null;
		var oRight = null;
		var oBlock = null;
		var oLeft1 = null;
		var oLeft2 = null;
		var oLeft3 = null;
		var oLeft4 = null;
		var oLeft5 = null;
		var oWeekRow = null;
		
		for (var i = 1; i <= iTotalBlocks; i++) {
			oDayOfMonth = document.createElement(((iDayOfWeek == 6)? "div" : "span"));
			/*if (/MSIE 6/.test(navigator.userAgent)) {
				oDayOfMonth.className = ((iDayOfWeek == 6) ? "calendar_day_of_month dom_block" : ((iDayOfWeek == 7) ? "calendar_day_of_month dom_right" : "calendar_day_of_month dom_left"));
			} else {
				oDayOfMonth.className = ((iDayOfWeek == 6) ? "calendar_day_of_month dom_block" : ((iDayOfWeek == 7) ? "calendar_day_of_month dom_right" : "calendar_day_of_month dom_left"));
			}*/
			
			if (!(/MSIE 6/.test(navigator.userAgent))) {
				Element.addClassName(oDayOfMonth, ((iDayOfWeek == 6) ? "day_of_month dom_block" : ((iDayOfWeek == 7) ? "day_of_month dom_right" : "day_of_month dom_left")));
				//oDayOfMonth.className = ((iDayOfWeek == 6) ? "calendar_day_of_month dom_block" : ((iDayOfWeek == 7) ? "calendar_day_of_month dom_right" : "calendar_day_of_month dom_left"));
			} else {
				Element.addClassName(oDayOfMonth, ((iDayOfWeek == 6) ? "day_of_month dom_left" : ((iDayOfWeek == 7) ? "day_of_month dom_right" : "day_of_month dom_left")));
				//oDayOfMonth.className = ((iDayOfWeek == 6) ? "calendar_day_of_month dom_left" : ((iDayOfWeek == 7) ? "calendar_day_of_month dom_right" : "calendar_day_of_month dom_left"));
			}
			
			oDayOfMonth.id = "pc_dom_" + i;
			oDayOfMonth.style.width = ((iDayOfWeek == 1 || iDayOfWeek == 7) ? ((self.Properties.iSquareSize) + 1) + "px" : ((self.Properties.iSquareSize)) + "px");
			oDayOfMonth.style.height = ((self.Properties.iSquareSize) / 1.3) + "px";
			
			if (!(/MSIE 6/.test(navigator.userAgent))) {
				if (iDayOfWeek == 6) {
					oDayOfMonth.style.marginLeft = ((self.Properties.iSquareSize * 5) + 6) + "px";
					oDayOfMonth.style.marginRight = ((self.Properties.iSquareSize) + 2) + "px";
				} else
				if (iDayOfWeek == 7) {
					oDayOfMonth.style.marginLeft = "0px";
					oDayOfMonth.style.marginRight = "1px";
				}
				//oBlock.style.marginLeft = ((self.Properties.iSquareSize * 5) + 6) + "px";
				//oBlock.style.marginRight = ((self.Properties.iSquareSize) + 2) + "px";
			}
			
			if (!oRight) oRight = ((iDayOfWeek == 7) ? oDayOfMonth : null);
			if (!oBlock) oBlock = ((iDayOfWeek == 6) ? oDayOfMonth : null);
			if (!oLeft1) oLeft1 = ((iDayOfWeek == 1) ? oDayOfMonth : null);
			if (!oLeft2) oLeft2 = ((iDayOfWeek == 2) ? oDayOfMonth : null);
			if (!oLeft3) oLeft3 = ((iDayOfWeek == 3) ? oDayOfMonth : null);
			if (!oLeft4) oLeft4 = ((iDayOfWeek == 4) ? oDayOfMonth : null);
			if (!oLeft5) oLeft5 = ((iDayOfWeek == 5) ? oDayOfMonth : null);
			
			iDayOfWeek++;
			if (iDayOfWeek > 7) {
				
				oWeekRow = document.createElement("div");
				Element.addClassName(oWeekRow, "week_row");
				//oWeekRow.className = "week_row";
				oWeekRow.id = "pc_wr_" + iCurrentWeek;
				
				if (iCurrentWeek == 1)
					oWeekRow.style.marginTop = "0px";
				if (iCurrentWeek >= self.Properties.iNumOfWeeks)
					oWeekRow.style.marginBottom = "0px";
					
				oWeekRow.style.position = "absolute";
				oWeekRow.style.visibility = "hidden";
				
				oWeekRow.appendChild(oRight);
				oWeekRow.appendChild(oLeft1);
				oWeekRow.appendChild(oLeft2);
				oWeekRow.appendChild(oLeft3);
				oWeekRow.appendChild(oLeft4);
				oWeekRow.appendChild(oLeft5);
				oWeekRow.appendChild(oBlock);
				
				if ((/MSIE 6/.test(navigator.userAgent))) {
					oWeekRow.style.height = ((self.Properties.iSquareSize) / 1.3) + "px";
				}
				
				self.DaysOfMonthContainer.appendChild(oWeekRow);
				
				iDayOfWeek = 1;
				oRight = null;
				oBlock = null;
				oLeft1 = null;
				oLeft2 = null;
				oLeft3 = null;
				oLeft4 = null;
				oLeft5 = null;
				
				iCurrentWeek++;
				//self.Properties.iCurrentWeek++;
			}
		}
		return self.DaysOfMonthContainer;
	}
	
	this.fillDaysOfMonth = function() {
		var self = this;
		
		var iNumOfWeeks = self.Properties.iNumOfWeeks;
		var iNumDaysInCalendar = self.Properties.iNumOfDaysInCalendar;
		
		self.showWeekRows();
		
		var iStartFrom = (1 - self.Properties.iNumDaysVisibleOfLastMonth);
		var iDayOfWeek = 1;
		
		var sDateLabel = "";
		var sAnchorID = "";
		var sClassName = "";
		
		var oDayOfMonth = null;
		
		var iDayOfMonthCounter = 1;
		for (var i = iStartFrom; i <= iNumDaysInCalendar; i++) {
			sClassName = "cdom ";
			if (i < 1) {
				sDateLabel = ((self.Properties.iNumDaysInLastMonth - self.Properties.iNumDaysVisibleOfLastMonth) + iDayOfWeek).toString();
				//sClassName = ((iDayOfWeek == 1 || iDayOfWeek == 7) ? "cdom_weekend_other" : "cdom_week_other");
				sClassName += ((iDayOfWeek == 1 || iDayOfWeek == 7) ? "weekend" : "week");
				sClassName += " other";
				var sTheYear = parseInt(self.Properties.dtCalendar_Year);
				var sTheMonth = parseInt(self.Properties.dtCalendar_Month - 1);
				if (sTheMonth == -1) {
					sTheMonth = 11;
					sTheYear = sTheYear - 1;
				}
				sAnchorID = "pcd_" + sTheYear + "_" + sTheMonth + "_" + parseInt(sDateLabel);
			} else
			if (i >= 1 && i <= self.Properties.iNumDaysInMonth) {
				sDateLabel = (i).toString();
				sClassName += ((iDayOfWeek == 1 || iDayOfWeek == 7) ? "weekend" : "week");
				sAnchorID = "pcd_" + parseInt(self.Properties.dtCalendar_Year) + "_" + parseInt(self.Properties.dtCalendar_Month) + "_" + parseInt(sDateLabel);
			} else
			if (i > self.Properties.iNumDaysInMonth && (i - self.Properties.iNumDaysInMonth) <= self.Properties.iNumDaysVisibleOfNextMonth) {
				sDateLabel = (i - self.Properties.iNumDaysInMonth).toString();
				sClassName += ((iDayOfWeek == 1 || iDayOfWeek == 7) ? "weekend" : "week");
				sClassName += " other";
				var sTheYear = parseInt(self.Properties.dtCalendar_Year);
				var sTheMonth = parseInt(self.Properties.dtCalendar_Month + 1);
				if (sTheMonth == 12) {
					sTheMonth = 0;
					sTheYear = sTheYear + 1;
				}
				sAnchorID = "pcd_" + sTheYear + "_" + sTheMonth + "_" + parseInt(sDateLabel);
			}
			self.DayOfMonth_Anchor = document.createElement("a");
			Element.addClassName(self.DayOfMonth_Anchor, sClassName);
			//alert(sClassName);
			//self.DayOfMonth_Anchor.className = sClassName;
			self.DayOfMonth_Anchor.href = "JavaScript:void(0)";
			self.DayOfMonth_Anchor.id = sAnchorID;
			self.DayOfMonth_Anchor.style.height = (((self.Properties.iSquareSize) / 1.3) - 6) + "px";
			
			self.DayOfMonth_Anchor.onclick = function() {
				self.SelectedEventDateElms = [];
				self.SelectedEventDateElm = null;
				var sNodeVal = this.childNodes[0].nodeValue;
				var sID = this.id;
				var aID = sID.split("_");
				var sNodeYear = aID[1];
				var sNodeMonth = aID[2];
				if (sNodeMonth == "-1") {
					sNodeMonth = "11";
					sNodeYear = parseInt(sNodeYear) - 1;
				}
				var sNodeDate = aID[3];
				var sNodeDateStr = parseInt(sNodeYear) + "-" + parseInt(sNodeMonth) + "-" + parseInt(sNodeDate);
				self.Properties.setNodeDate(sNodeDateStr);
				var sNodeDay = self.Properties.DaysOfWeek[self.Properties.dtNode.getDay()];
				var sDateStr = sNodeYear + "-" + sNodeMonth + "-" + sNodeDate;
				
				self.Utils.selectDate(sDateStr);
				//self.Utils.actionDOMSelect(sDateStr);
				
				if (this.className.indexOf("event") != -1) {
					self.EventDateSelected = true;
					self.Properties.setCalendarDate(parseInt(self.Properties.dtSelected_Year) + "-" + parseInt(self.Properties.dtSelected_Month) + "-" + parseInt(self.Properties.dtSelected_Date));
					self.Utils.getEventDetails();
				} else
				if (this.className.indexOf("other") != -1) {
					self.Properties.setCalendarDate(parseInt(self.Properties.dtSelected_Year) + "-" + parseInt(self.Properties.dtSelected_Month) + "-" + parseInt(self.Properties.dtSelected_Date));
					self.Utils.reloadCalendar();
					self.Utils.ClearInfoPanel();
					self.Utils.ShowDefaultInfoPanelMessage();
				} else {
					self.EventDateSelected = false;
					self.Utils.ClearInfoPanel();
					self.Utils.ShowDefaultInfoPanelMessage();
				}
				this.blur();
				
				return;
			}
			
			self.DayOfMonth_Anchor.onmouseover = function() {
				self.hilitedNodeObject = this;
				
				var sNodeVal = this.childNodes[0].nodeValue;
				
				var sID = this.id;
				var aID = sID.split("_");
				var sNodeYear = aID[1];
				var sNodeMonth = aID[2];
				var sNodeDate = aID[3];
				self.Properties.setNodeDate(parseInt(sNodeYear) + "-" + parseInt(sNodeMonth) + "-" + parseInt(sNodeDate));
				
				//document.title = this.className;
				this.onmouseout = function() {
					self.hilitedNodeObject = null;
					if (!self.bAJAXBusyWorking)
						self.Utils.ShowStatusMessage("","SelectedDate");
					return;
				}
				if (!self.bAJAXBusyWorking)
					self.Utils.ShowStatusMessage("","NodeDate");
				return;
			}
			
			self.DayOfMonth_Anchor.appendChild(document.createTextNode(sDateLabel));
			var sDayOfMonth = "pc_dom_" + iDayOfMonthCounter;
			var oDayOfMonth = document.getElementById(sDayOfMonth);
			if (oDayOfMonth && (iDayOfMonthCounter <= iNumDaysInCalendar)) {
				oDayOfMonth.appendChild(self.DayOfMonth_Anchor);
			}
			iDayOfMonthCounter++;
			iDayOfWeek++;
			if (iDayOfWeek > 7)
				iDayOfWeek = 1;
		}
		
		return;
	};
	
	this.displaySelectedEventDetails = function() {
		var self = this;
		if (self.SelectedEventDateElms.length > 0) {
			for(var i = 0; i < self.SelectedEventDateElms.length; i++) {
				self.InfoPanel.appendChild(self.SelectedEventDateElms[i]);
			}
		}
		return;
	};
	
	this.clearDaysOfMonth = function() {
		var self = this;
		
		var aWeekRows = document.getElementsByClassName("week_row");
		for (i = 0; i < aWeekRows.length; i++) {
			var oWeekRow = aWeekRows[i];
			if (oWeekRow) {
				var iNumChildren = oWeekRow.childNodes.length;
				for (var j = 0; j < iNumChildren; j++) {
					var oChild = oWeekRow.childNodes[j];
					if (oChild) {
						if (oChild.childNodes.length > 0)
							oChild.removeChild(oChild.childNodes[0]);
					}
				}
			}
			self.hideWeekRow(i+1);
		}
		
		return;
	}
	
	this.showWeekRows = function() {
		var self = this;
		
		var iNumOfWeeks = self.Properties.iNumOfWeeks;
		
		if (iNumOfWeeks <= 6) {
			for (var i = 1; i <= iNumOfWeeks; i++) {
				self.showWeekRow(i);
			}
		}
		return;
	};
	
	this.showWeekRow = function(iRowIndex) {
		var self = this;
		
		var sWeekRowID = "pc_wr_" + iRowIndex;
		var oWeekRow = document.getElementById(sWeekRowID);
		if (oWeekRow) {
			oWeekRow.style.position = "relative";
			oWeekRow.style.visibility = "visible";
		}
		return;
	};
	
	this.hideWeekRows = function() {
		var self = this;
		
		var iNumOfWeeks = self.Properties.iNumOfWeeks;
		
		if (iNumOfWeeks < 6) {
			for (var i = 6; i > iNumOfWeeks; i--) {
				self.hideWeekRow(i);
			}
		}
		return;
	};
	
	this.hideWeekRow = function(iRowIndex) {
		var self = this;
		
		var sWeekRowID = "pc_wr_" + iRowIndex;
		var oWeekRow = document.getElementById(sWeekRowID);
		if (oWeekRow) {
			oWeekRow.style.position = "absolute";
			oWeekRow.style.visibility = "hidden";
		}
		
		return;
	}
	
	this.createStatusBar = function() {
		var self = this;
		
		self.StatusBar = document.createElement("div");
		Element.addClassName(self.StatusBar, "statusbar");
		//self.StatusBar.className = "statusbar";
		
		var oTextNode = document.createTextNode("");
		self.StatusBar.appendChild(oTextNode);
		
		return self.StatusBar;
	};
	
	this.createInfoPanel = function() {
		var self = this;
		
		self.InfoPanel = document.createElement("div");
		Element.addClassName(self.InfoPanel, "info_panel");
		//self.InfoPanel.className = "info_panel";
		
		self.Utils.ShowDefaultInfoPanelMessage();
		
		return self.InfoPanel;
	};
	
	this.addHR = function() {
		var oHRDiv = document.createElement("div");
		Element.addClassName(oHRDiv, "hr_div");
		//oHRDiv.className = "HRDiv";
		return oHRDiv;
	};
	
	this.clearFloat = function() {
		var oClearDiv = document.createElement("div");
		oClearDiv.style.position = "relative";
		oClearDiv.style.display = "block";
		oClearDiv.style.clear = "both";
		oClearDiv.style.height = "0px";
		oClearDiv.style.backgroundColor = "transparent";
		return oClearDiv;
	};
}