
/*DateChooser 2.9
February 13,2008
For usage details see http:Creative Commons Attribution 2.0 License
http:*/
if (!objPHPDate) {
	var objPHPDate = {aDay:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], aShortDay:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], aLetterDay:["S", "M", "T", "W", "T", "F", "S"], aMonth:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], aShortMonth:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], aSuffix:["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "st"], sTimezoneOffset:"", GetTimezoneOffset:function () {
		var objLocal = new Date();
		objLocal.setHours(12);
		objLocal.setMinutes(0);
		objLocal.setSeconds(0);
		objLocal.setMilliseconds(0);
		var objUTC = new Date();
		objUTC.setMilliseconds(objLocal.getUTCMilliseconds());
		objUTC.setSeconds(objLocal.getUTCSeconds());
		objUTC.setMinutes(objLocal.getUTCMinutes());
		objUTC.setHours(objLocal.getUTCHours());
		objUTC.setDate(objLocal.getUTCDate());
		objUTC.setMonth(objLocal.getUTCMonth());
		objUTC.setFullYear(objLocal.getUTCFullYear());
		this.sTimezoneOffset = ((objLocal.getTime() - objUTC.getTime()) / (1000 * 3600));
		var bNegative = (this.sTimezoneOffset < 0);
		this.sTimezoneOffset = bNegative ? (this.sTimezoneOffset + "").substring(1) : this.sTimezoneOffset + "";
		this.sTimezoneOffset = this.sTimezoneOffset.replace(/\.5/, (parseInt("$1", 10) * 60) + "");
		this.sTimezoneOffset += (this.sTimezoneOffset.substring(this.sTimezoneOffset.length - 3) != ":30") ? ":00" : "";
		this.sTimezoneOffset = (this.sTimezoneOffset.substr(0, this.sTimezoneOffset.indexOf(":")).length == 1) ? "0" + this.sTimezoneOffset : this.sTimezoneOffset;
		this.sTimezoneOffset = bNegative ? "-" + this.sTimezoneOffset : "+" + this.sTimezoneOffset;
		delete objLocal;
		delete objUTC;
		return true;
	}, PHPDate:function () {
		var sFormat = (arguments.length > 0) ? arguments[0] : "";
		var nYear = this.getFullYear();
		var sYear = nYear + "";
		var nMonth = this.getMonth();
		var sMonth = (nMonth + 1) + "";
		var sPaddedMonth = (sMonth.length == 1) ? "0" + sMonth : sMonth;
		var nDate = this.getDate();
		var sDate = nDate + "";
		var sPaddedDate = (sDate.length == 1) ? "0" + sDate : sDate;
		var nDay = this.getDay();
		var sDay = nDay + "";
		sFormat = sFormat.replace(/([cDdFjLlMmNnrSUwYy])/g, "y5-cal-regexp:$1");
		sFormat = sFormat.replace(/y5-cal-regexp:c/g, sYear + "-" + sPaddedMonth + "-" + sPaddedDate + "T00:00:00" + objPHPDate.sTimezoneOffset);
		sFormat = sFormat.replace(/y5-cal-regexp:D/g, objPHPDate.aShortDay[nDay]);
		sFormat = sFormat.replace(/y5-cal-regexp:d/g, sPaddedDate);
		sFormat = sFormat.replace(/y5-cal-regexp:F/g, objPHPDate.aMonth[nMonth]);
		sFormat = sFormat.replace(/y5-cal-regexp:j/g, nDate);
		sFormat = sFormat.replace(/y5-cal-regexp:L/g, objPHPDate.aLetterDay[nDay]);
		sFormat = sFormat.replace(/y5-cal-regexp:l/g, objPHPDate.aDay[nDay]);
		sFormat = sFormat.replace(/y5-cal-regexp:M/g, objPHPDate.aShortMonth[nMonth]);
		sFormat = sFormat.replace(/y5-cal-regexp:m/g, sPaddedMonth);
		sFormat = sFormat.replace(/y5-cal-regexp:N/g, (nDay == 0) ? 7 : nDay);
		sFormat = sFormat.replace(/y5-cal-regexp:n/g, sMonth);
		sFormat = sFormat.replace(/y5-cal-regexp:r/g, objPHPDate.aShortDay[nDay] + ", " + sPaddedDate + " " + objPHPDate.aShortMonth[nMonth] + " " + sYear + " 00:00:00 " + objPHPDate.sTimezoneOffset.replace(/:/, ""));
		sFormat = sFormat.replace(/y5-cal-regexp:S/g, objPHPDate.aSuffix[nDate]);
		sFormat = sFormat.replace(/y5-cal-regexp:U/g, parseInt((this.getTime() / 1000), 10));
		sFormat = sFormat.replace(/y5-cal-regexp:w/g, nDay);
		sFormat = sFormat.replace(/y5-cal-regexp:Y/g, sYear);
		sFormat = sFormat.replace(/y5-cal-regexp:y/g, sYear.substring(2));
		return sFormat;
	}};
	objPHPDate.GetTimezoneOffset();
	Date.prototype.getPHPDate = objPHPDate.PHPDate;
}
function DateChooser() {
	var nWeekStartDay = 0;
	var nXOffset = 0;
	var nYOffset = 0;
	var nTimeout = 0;
	var objAllowedDays = {"0":true, "1":true, "2":true, "3":true, "4":true, "5":true, "6":true};
	var fnUpdate = null;
	var sDefaultIcon = false;
	var objUpdateFields = {};
	var objEarliestDate = null;
	var objLatestDate = null;
	if (!arguments || !document.getElementById || !document.getElementsByTagName) {
		return null;
	}
	var ndBodyElement = document.getElementsByTagName("body").length ? document.getElementsByTagName("body")[0] : document;
	var objTimeout = null;
	var ndFrame = null;
	/*@cc_on@*/
	/*@if(@_jscript_version<6)
if(document.getElementById('iframehack'))
{ndFrame=document.getElementById('iframehack');}
else
{ndFrame=xb.createElement('iframe');ndFrame.id='iframehack';ndFrame.src='javascript:null;';ndFrame.scrolling='no';ndFrame.frameBorder=0;ndFrame.style.border='0';ndFrame.style.padding=0;ndFrame.style.display='none';ndFrame.style.position='absolute';ndFrame.style.zIndex='5000';ndBodyElement.appendChild(ndFrame);}/*@end@*/
	var nDateChooserID = 0;
	while (document.getElementById("calendar" + nDateChooserID)) {
		++nDateChooserID;
	}
	var sDateChooserID = "calendar" + nDateChooserID;
	var objSelectedDate = null;
	var objStartDate = new Date();
	objStartDate.setHours(12);
	objStartDate.setMinutes(0);
	objStartDate.setSeconds(0);
	objStartDate.setMilliseconds(0);
	var objMonthYear = new Date(objStartDate);
	objMonthYear.setDate(1);
	var ndDateChooser = xb.createElement("div");
	ndDateChooser.id = sDateChooserID;
	ndDateChooser.className = "calendar";
	ndDateChooser.style.visibility = "hidden";
	ndDateChooser.style.position = "absolute";
	ndDateChooser.style.zIndex = "5001";
	ndDateChooser.style.top = "0";
	ndDateChooser.style.left = "0";
	ndBodyElement.appendChild(ndDateChooser);
	var AddClickEvents = function () {
		var aNavLinks = ndDateChooser.getElementsByTagName("thead")[0].getElementsByTagName("a");
		for (var nNavLink = 0; aNavLinks[nNavLink]; ++nNavLink) {
			events.add(aNavLinks[nNavLink], "click", function (e) {
				e = e || events.fix(event);
				var ndClicked = e.target || e.srcElement;
				if (ndClicked.nodeName == "#text") {
					ndClicked = ndClicked.parentNode;
				}
				var sClass = ndClicked.className;
				if (sClass == "previousyear") {
					objMonthYear.setFullYear(objMonthYear.getFullYear() - 1);
					if (objEarliestDate && objEarliestDate.getTime() > objMonthYear.getTime()) {
						objMonthYear.setMonth(objEarliestDate.getMonth());
						objMonthYear.setFullYear(objEarliestDate.getFullYear());
					}
				} else {
					if (sClass == "previousmonth") {
						objMonthYear.setMonth(objMonthYear.getMonth() - 1);
						if (objEarliestDate && objEarliestDate.getTime() > objMonthYear.getTime()) {
							objMonthYear.setMonth(objEarliestDate.getMonth());
							objMonthYear.setFullYear(objEarliestDate.getFullYear());
						}
					} else {
						if (sClass == "currentdate") {
							objMonthYear.setMonth(objStartDate.getMonth());
							objMonthYear.setFullYear(objStartDate.getFullYear());
						} else {
							if (sClass == "nextmonth") {
								objMonthYear.setMonth(objMonthYear.getMonth() + 1);
								if (objLatestDate && objLatestDate.getTime() < objMonthYear.getTime()) {
									objMonthYear.setMonth(objLatestDate.getMonth());
									objMonthYear.setFullYear(objLatestDate.getFullYear());
								}
							} else {
								if (sClass == "nextyear") {
									objMonthYear.setFullYear(objMonthYear.getFullYear() + 1);
									if (objLatestDate && objLatestDate.getTime() < objMonthYear.getTime()) {
										objMonthYear.setMonth(objLatestDate.getMonth());
										objMonthYear.setFullYear(objLatestDate.getFullYear());
									}
								}
							}
						}
					}
				}
				RefreshDisplay();
				return false;
			});
		}
		var aDateLinks = ndDateChooser.getElementsByTagName("tbody")[0].getElementsByTagName("a");
		for (var nDateLink = 0; aDateLinks[nDateLink]; ++nDateLink) {
			events.add(aDateLinks[nDateLink], "click", function (e) {
				e = e || events.fix(event);
				var ndClicked = e.target || e.srcElement;
				if (ndClicked.nodeName == "#text") {
					ndClicked = ndClicked.parentNode;
				}
				for (var nLink = 0; aDateLinks[nLink]; ++nLink) {
					if (aDateLinks[nLink].className == "selecteddate") {
						aDateLinks[nLink].removeAttribute("class");
					}
				}
				var objTempDate = new Date(objMonthYear);
				objTempDate.setDate(parseInt(ndClicked.childNodes[0].nodeValue, 10));
				var nTime = objTempDate.getTime();
				var sWeekday = objTempDate.getPHPDate("w");
				delete objTempDate;
				if (objEarliestDate && objEarliestDate.getTime() > nTime) {
					return false;
				}
				if (objLatestDate && objLatestDate.getTime() < nTime) {
					return false;
				}
				if (!objAllowedDays[sWeekday]) {
					return false;
				}
				objMonthYear.setTime(nTime);
				objMonthYear.setDate(1);
				if (!objSelectedDate) {
					objSelectedDate = new Date(nTime);
				}
				objSelectedDate.setTime(nTime);
				ndClicked.className = "selecteddate";
				if (ndFrame) {
					ndFrame.style.display = "none";
				}
				ndDateChooser.style.visibility = "hidden";
				if (objTimeout) {
					clearTimeout(objTimeout);
				}
				UpdateFields();
				if (fnUpdate) {
					fnUpdate(objSelectedDate);
				}
				return false;
			});
		}
		return true;
	};
	var UpdateFields = function () {
		if (!objSelectedDate) {
			return true;
		}
		for (var sFieldName in objUpdateFields) {
			var ndField = document.getElementById(sFieldName);
			if (ndField) {
				ndField.value = objSelectedDate.getPHPDate(objUpdateFields[sFieldName]);
			}
		}
		return true;
	};
	var RefreshDisplay = function () {
		var ndTable, ndTHead, ndTR, ndTH, ndA, ndTBody, ndTD, nTime, sWeekday;
		var sClass = "";
		var objTempDate = new Date(objMonthYear);
		var objToday = new Date();
		objToday.setHours(12);
		objToday.setMinutes(0);
		objToday.setSeconds(0);
		objToday.setMilliseconds(0);
		ndTable = xb.createElement("table");
		ndTable.setAttribute("summary", "DateChooser");
		ndTHead = xb.createElement("thead");
		ndTable.appendChild(ndTHead);
		ndTR = xb.createElement("tr");
		ndTHead.appendChild(ndTR);
		ndTH = xb.createElement("th");
		ndTR.appendChild(ndTH);
		ndA = xb.createElement("a");
		ndA.className = "previousyear";
		ndA.setAttribute("href", "#");
		ndA.setAttribute("title", "Previous Year");
		ndTH.appendChild(ndA);
		ndA.appendChild(document.createTextNode(String.fromCharCode(171)));
		ndTH = xb.createElement("th");
		ndTR.appendChild(ndTH);
		ndA = xb.createElement("a");
		ndA.className = "previousmonth";
		ndA.setAttribute("href", "#");
		ndA.setAttribute("title", "Previous Month");
		ndTH.appendChild(ndA);
		ndA.appendChild(document.createTextNode(String.fromCharCode(60)));
		ndTH = xb.createElement("th");
		ndTH.setAttribute("colspan", "3");
		ndTH.colSpan = "3";
		ndTR.appendChild(ndTH);
		ndA = xb.createElement("a");
		ndA.className = "currentdate";
		ndA.setAttribute("href", "#");
		ndA.setAttribute("title", "Current Date");
		ndTH.appendChild(ndA);
		ndA.appendChild(document.createTextNode(objMonthYear.getPHPDate("M Y")));
		ndTH = xb.createElement("th");
		ndTR.appendChild(ndTH);
		ndA = xb.createElement("a");
		ndA.className = "nextmonth";
		ndA.setAttribute("href", "#");
		ndA.setAttribute("title", "Next Month");
		ndTH.appendChild(ndA);
		ndA.appendChild(document.createTextNode(String.fromCharCode(62)));
		ndTH = xb.createElement("th");
		ndTR.appendChild(ndTH);
		ndA = xb.createElement("a");
		ndA.className = "nextyear";
		ndA.setAttribute("href", "#");
		ndA.setAttribute("title", "Next Year");
		ndTH.appendChild(ndA);
		ndA.appendChild(document.createTextNode(String.fromCharCode(187)));
		ndTR = xb.createElement("tr");
		ndTHead.appendChild(ndTR);
		for (var nDay = 0; objPHPDate.aLetterDay[nDay]; ++nDay) {
			ndTD = xb.createElement("td");
			ndTR.appendChild(ndTD);
			ndTD.appendChild(document.createTextNode(objPHPDate.aLetterDay[(nWeekStartDay + nDay) % objPHPDate.aLetterDay.length]));
		}
		ndTBody = xb.createElement("tbody");
		ndTable.appendChild(ndTBody);
		while (objTempDate.getMonth() == objMonthYear.getMonth()) {
			ndTR = xb.createElement("tr");
			ndTBody.appendChild(ndTR);
			for (nDay = 0; nDay < 7; ++nDay) {
				var nWeek = (nWeekStartDay + nDay) % objPHPDate.aLetterDay.length;
				if ((objTempDate.getUTCDay() == nWeek) && (objTempDate.getMonth() == objMonthYear.getMonth())) {
					nTime = objTempDate.getTime();
					sWeekday = objTempDate.getPHPDate("w");
					sClass = (objSelectedDate && (objTempDate.getTime() == objSelectedDate.getTime())) ? "selectedday" : "";
					sClass += (objTempDate.getTime() == objToday.getTime()) ? " today" : "";
					sClass = ((sClass.length > 0) && (sClass[1] == " ")) ? sClass.substr(1, sClass.length - 1) : sClass;
					ndTD = xb.createElement("td");
					if ((objEarliestDate && objEarliestDate.getTime() > nTime) || (objLatestDate && objLatestDate.getTime() < nTime) || !objAllowedDays[sWeekday]) {
						ndTD.className = "invalidday";
					}
					ndTR.appendChild(ndTD);
					ndA = xb.createElement("a");
					if (sClass.length > 0) {
						ndA.className = sClass;
					}
					ndA.setAttribute("href", "#");
					ndTD.appendChild(ndA);
					ndA.appendChild(document.createTextNode(objTempDate.getDate()));
					objTempDate.setDate(objTempDate.getDate() + 1);
				} else {
					ndTD = xb.createElement("td");
					ndTR.appendChild(ndTD);
				}
			}
		}
		while (ndDateChooser.hasChildNodes()) {
			ndDateChooser.removeChild(ndDateChooser.firstChild);
		}
		ndDateChooser.appendChild(ndTable);
		if (ndFrame) {
			ndFrame.style.display = "block";
			ndFrame.style.top = ndDateChooser.style.top;
			ndFrame.style.left = ndDateChooser.style.left;
			ndFrame.style.width = (ndTable.clientWidth + 2) + "px";
			ndFrame.style.height = (ndTable.clientHeight + 4) + "px";
		}
		AddClickEvents();
		delete objTempDate;
		delete objToday;
		return true;
	};
	var DisplayDateChooser = function () {
		var sPositionX = (arguments.length > 0) ? arguments[0] : "auto";
		var sPositionY = (arguments.length > 1) ? arguments[1] : "auto";
		var ndStyle = ndDateChooser.style;
		ndStyle.top = sPositionY + "";
		ndStyle.left = sPositionX + "";
		ndDateChooser.style.visibility = "visible";
		if (objTimeout) {
			clearTimeout(objTimeout);
		}
		if (objSelectedDate) {
			objMonthYear.setTime(objSelectedDate.getTime());
		} else {
			objMonthYear.setTime(objStartDate.getTime());
		}
		objMonthYear.setHours(12);
		objMonthYear.setMinutes(0);
		objMonthYear.setSeconds(0);
		objMonthYear.setMilliseconds(0);
		objMonthYear.setDate(1);
		return RefreshDisplay();
	};
	var GetPosition = function (ndNode) {
		var nTop = 0, nLeft = 0;
		if (ndNode.offsetParent) {
			nTop = ndNode.offsetTop;
			nLeft = ndNode.offsetLeft;
			while (ndNode.offsetParent) {
				ndNode = ndNode.offsetParent;
				nTop += ndNode.offsetTop;
				nLeft += ndNode.offsetLeft;
			}
		}
		return ({"top":nTop, "left":nLeft});
	};
	this.displayPosition = function () {
		var sPositionX = (arguments.length > 0) ? arguments[0] : "auto";
		var sPositionY = (arguments.length > 1) ? arguments[1] : "auto";
		return DisplayDateChooser(sPositionX, sPositionY);
	};
	this.display = function (e) {
		e = e || events.fix(event);
		var ndClicked = e.target || e.srcElement;
		if (ndClicked.nodeName == "#text") {
			ndClicked = ndClicked.parentNode;
		}
		var objPosition = GetPosition(ndClicked);
		DisplayDateChooser(objPosition.left + nXOffset + "px", objPosition.top + nYOffset + "px");
		return false;
	};
	this.setXOffset = function () {
		nXOffset = ((arguments.length > 0) && (typeof (arguments[0]) == "number")) ? parseInt(arguments[0], 10) : nXOffset;
		return true;
	};
	this.setYOffset = function () {
		nYOffset = ((arguments.length > 0) && (typeof (arguments[0]) == "number")) ? parseInt(arguments[0], 10) : nYOffset;
		return true;
	};
	this.setCloseTime = function () {
		nTimeout = ((arguments.length > 0) && (typeof (arguments[0]) == "number") && (arguments[0] >= 0)) ? arguments[0] : nTimeout;
		return true;
	};
	this.setUpdateFunction = function () {
		if ((arguments.length > 0) && (typeof (arguments[0]) == "function")) {
			fnUpdate = arguments[0];
		}
		return true;
	};
	this.setUpdateField = function () {
		objUpdateFields = {};
		if ((typeof (arguments[0]) == "string") && (typeof (arguments[1]) == "string") && document.getElementById(arguments[0])) {
			objUpdateFields[arguments[0]] = arguments[1];
		} else {
			if ((typeof (arguments[0]) == "object") && (typeof (arguments[1]) == "object")) {
				for (var nField = 0; arguments[0][nField] !== undefined; ++nField) {
					if (nField >= arguments[1].length) {
						break;
					}
					objUpdateFields[arguments[0][nField]] = arguments[1][nField];
				}
			} else {
				if (typeof (arguments[0]) == "object") {
					objUpdateFields = arguments[0];
				}
			}
		}
		return true;
	};
	this.setLink = function () {
		var sLinkText = ((arguments.length > 0) && (typeof (arguments[0]) == "string")) ? arguments[0] : "Choose a date";
		var ndNode = ((arguments.length > 1) && (typeof (arguments[1]) == "string")) ? document.getElementById(arguments[1]) : null;
		var bPlaceRight = ((arguments.length <= 2) || arguments[2]);
		var sTitleText = ((arguments.length > 3) && (typeof (arguments[3]) == "string")) ? arguments[3] : "Click to choose a date";
		if (!ndNode) {
			return false;
		}
		var ndAnchor = xb.createElement("a");
		ndAnchor.className = "calendarlink";
		ndAnchor.href = "#";
		if (sTitleText.length > 0) {
			ndAnchor.setAttribute("title", sTitleText);
		}
		ndAnchor.appendChild(document.createTextNode(sLinkText));
		if (bPlaceRight) {
			if (ndNode.nextSibling) {
				ndNode.parentNode.insertBefore(ndAnchor, ndNode.nextSibling);
			} else {
				ndNode.parentNode.appendChild(ndAnchor);
			}
		} else {
			ndNode.parentNode.insertBefore(ndAnchor, ndNode);
		}
		events.add(ndAnchor, "click", this.display);
		return true;
	};
	this.setIcon = function () {
		var sIconFile = ((arguments.length > 0) && (typeof (arguments[0]) == "string")) ? arguments[0] : sDefaultIcon;
		var ndNode = ((arguments.length > 1) && (typeof (arguments[1]) == "string")) ? document.getElementById(arguments[1]) : null;
		var bPlaceRight = ((arguments.length <= 2) || arguments[2]);
		var sTitleText = ((arguments.length > 3) && (typeof (arguments[3]) == "string")) ? arguments[3] : "Click to choose a date";
		if (!ndNode || !sIconFile) {
			return false;
		}
		var ndIcon = xb.createElement("img");
		ndIcon.className = "calendaricon";
		ndIcon.src = sIconFile;
		ndIcon.setAttribute("alt", "DateChooser Icon " + (nDateChooserID + 1));
		if (sTitleText.length > 0) {
			ndIcon.setAttribute("title", sTitleText);
		}
		if (bPlaceRight) {
			if (ndNode.nextSibling) {
				ndNode.parentNode.insertBefore(ndIcon, ndNode.nextSibling);
			} else {
				ndNode.parentNode.appendChild(ndIcon);
			}
		} else {
			ndNode.parentNode.insertBefore(ndIcon, ndNode);
		}
		events.add(ndIcon, "click", this.display);
		return true;
	};
	this.setStartDate = function () {
		if (!arguments.length || !(typeof (arguments[0]) == "object") || !arguments[0].getTime) {
			return false;
		}
		objStartDate.setTime(arguments[0].getTime());
		objStartDate.setHours(12);
		objStartDate.setMinutes(0);
		objStartDate.setSeconds(0);
		objStartDate.setMilliseconds(0);
		if (objEarliestDate && objEarliestDate.getTime() > objStartDate.getTime()) {
			objStartDate.setTime(objEarliestDate.getTime());
		} else {
			if (objLatestDate && objLatestDate.getTime() < objStartDate.getTime()) {
				objStartDate.setTime(objLatestDate.getTime());
			}
		}
		objMonthYear.setMonth(objStartDate.getMonth());
		objMonthYear.setFullYear(objStartDate.getFullYear());
		if (!objSelectedDate) {
			objSelectedDate = new Date(objStartDate);
		}
		objSelectedDate.setTime(objStartDate);
		return true;
	};
	this.setEarliestDate = function () {
		if (!arguments.length || (typeof (arguments[0]) != "object") || !arguments[0].getTime) {
			return false;
		}
		objEarliestDate = new Date();
		objEarliestDate.setTime(arguments[0].getTime());
		objEarliestDate.setHours(12);
		objEarliestDate.setMinutes(0);
		objEarliestDate.setSeconds(0);
		objEarliestDate.setMilliseconds(0);
		if (objEarliestDate.getTime() > objStartDate.getTime()) {
			objStartDate.setTime(objEarliestDate.getTime());
			objMonthYear.setMonth(objEarliestDate.getMonth());
			objMonthYear.setFullYear(objEarliestDate.getFullYear());
		}
		if (objSelectedDate && (objEarliestDate.getTime() > objSelectedDate.getTime())) {
			objSelectedDate.setTime(objEarliestDate.getTime());
			objMonthYear.setMonth(objEarliestDate.getMonth());
			objMonthYear.setFullYear(objEarliestDate.getFullYear());
		}
		return true;
	};
	this.setLatestDate = function () {
		if (!arguments.length || !(typeof (arguments[0]) == "object") || !arguments[0].getTime) {
			return false;
		}
		objLatestDate = new Date();
		objLatestDate.setTime(arguments[0].getTime());
		objLatestDate.setHours(12);
		objLatestDate.setMinutes(0);
		objLatestDate.setSeconds(0);
		objLatestDate.setMilliseconds(0);
		if (objLatestDate.getTime() < objStartDate.getTime()) {
			objStartDate.setTime(objLatestDate.getTime());
			objMonthYear.setMonth(objLatestDate.getMonth());
			objMonthYear.setFullYear(objLatestDate.getFullYear());
		}
		if (objSelectedDate && (objLatestDate.getTime() < objSelectedDate.getTime())) {
			objSelectedDate.setTime(objLatestDate.getTime());
			objMonthYear.setMonth(objLatestDate.getMonth());
			objMonthYear.setFullYear(objLatestDate.getFullYear());
		}
		return true;
	};
	this.setAllowedDays = function () {
		if (!arguments.length || !(typeof (arguments[0]) == "object")) {
			return false;
		}
		var nCount;
		for (nCount = 0; nCount < 7; ++nCount) {
			objAllowedDays[nCount + ""] = false;
		}
		for (nCount = 0; arguments[0][nCount] !== undefined; ++nCount) {
			objAllowedDays[arguments[0][nCount] + ""] = true;
		}
		return true;
	};
	this.setWeekStartDay = function () {
		if (!arguments.length || !(typeof (arguments[0]) == "number")) {
			return false;
		}
		var nNewStartDay = parseInt(arguments[0], 10);
		if ((nNewStartDay < 0) || (nNewStartDay > 6)) {
			return false;
		}
		nWeekStartDay = nNewStartDay;
		return true;
	};
	this.getSelectedDate = function () {
		return objSelectedDate;
	};
	this.setSelectedDate = function (objDate) {
		if (!objSelectedDate) {
			objSelectedDate = new Date(objDate);
		}
		objSelectedDate.setTime(objDate.getTime());
		objSelectedDate.setHours(12);
		objSelectedDate.setMinutes(0);
		objSelectedDate.setSeconds(0);
		objSelectedDate.setMilliseconds(0);
		UpdateFields();
		return true;
	};
	this.updateFields = function () {
		return UpdateFields();
	};
	var clickWindow = function (e) {
		e = e || events.fix(event);
		var ndTarget = e.target || e.srcElement;
		if (ndTarget.nodeName == "#text") {
			ndTarget = ndTarget.parentNode;
		}
		while (ndTarget && (ndTarget != document)) {
			if (ndTarget.className == "calendar") {
				return true;
			}
			ndTarget = ndTarget.parentNode;
		}
		for (var nCount = 0; nCount <= nDateChooserID; ++nCount) {
			if (ndFrame) {
				ndFrame.style.display = "none";
			}
			document.getElementById("calendar" + nCount).style.visibility = "hidden";
		}
		return true;
	};
	var mouseoverDateChooser = function () {
		if (objTimeout) {
			clearTimeout(objTimeout);
		}
		return true;
	};
	var mouseoutDateChooser = function () {
		if (nTimeout > 0) {
			objTimeout = setTimeout("document.getElementById(\"" + sDateChooserID + "\").style.visibility = \"hidden\"; if (document.getElementById(\"iframehack\")) document.getElementById(\"iframehack\").style.display = \"none\";", nTimeout);
		}
		return true;
	};
	events.add(ndDateChooser, "mouseover", mouseoverDateChooser);
	events.add(ndDateChooser, "mouseout", mouseoutDateChooser);
	events.add(document, "mousedown", clickWindow);
	return true;
}
if (!Array.prototype.push) {
	Array.prototype.push = function () {
		for (var nCount = 0; arguments[nCount] !== undefined; nCount++) {
			this[this.length] = arguments[nCount];
		}
		return this.length;
	};
}
if (!xb) {
	var xb = {createElement:function (sElement) {
		if (document.createElementNS) {
			return document.createElementNS("http://www.w3.org/1999/xhtml", sElement);
		}
		if (document.createElement) {
			return document.createElement(sElement);
		}
		return null;
	}, getElementsByAttribute:function (ndNode, sAttributeName, sAttributeValue) {
		var aReturnElements = [];
		if (!ndNode.all && !ndNode.getElementsByTagName) {
			return aReturnElements;
		}
		var rAttributeValue = RegExp("(^|\\s)" + sAttributeValue + "(\\s|$)");
		var sValue, aElements = ndNode.all || ndNode.getElementsByTagName("*");
		for (var nIndex = 0; aElements[nIndex]; ++nIndex) {
			if (!aElements[nIndex].getAttribute) {
				continue;
			}
			sValue = (sAttributeName == "class") ? aElements[nIndex].className : aElements[nIndex].getAttribute(sAttributeName);
			if ((typeof (sValue) != "string") || (sValue.length == 0)) {
				continue;
			}
			if (rAttributeValue.test(sValue)) {
				aReturnElements.push(aElements[nIndex]);
			}
		}
		return aReturnElements;
	}, getOption:function (ndNode, sOption) {
		var sText = ndNode.getAttribute(sOption);
		if (sText) {
			return sText;
		}
		var sDefault = (arguments.length == 3) ? arguments[2] : false;
		var aMatch = ndNode.className.match(RegExp("(?:^|\\s)" + sOption + "=(?:\\'|\\\")([^\\'\\\"]+)(?:\\'|\\\"|$)"));
		return aMatch ? aMatch[1] : sDefault;
	}};
}
if (!events) {
	var events = {nEventID:1, add:function (ndElement, sType, fnHandler) {
		if (!fnHandler.$$nEventID) {
			fnHandler.$$nEventID = this.nEventID++;
		}
		if (ndElement.objEvents === undefined) {
			ndElement.objEvents = {};
		}
		var aHandlers = ndElement.objEvents[sType];
		if (!aHandlers) {
			aHandlers = ndElement.objEvents[sType] = {};
			if (ndElement["on" + sType]) {
				aHandlers[0] = ndElement["on" + sType];
			}
		}
		aHandlers[fnHandler.$$nEventID] = fnHandler;
		ndElement["on" + sType] = this.handle;
		return true;
	}, handle:function (e) {
		e = e || events.fix(event);
		var bReturn = true, aHandlers = this.objEvents[e.type];
		for (var nIndex in aHandlers) {
			this.$$handle = aHandlers[nIndex];
			if (this.$$handle(e) === false) {
				bReturn = false;
			}
		}
		return bReturn;
	}, fix:function (e) {
		e.preventDefault = this.fix.preventDefault;
		e.stopPropagation = this.fix.stopPropagation;
		return e;
	}};
	events.fix.preventDefault = function () {
		this.returnValue = false;
		return true;
	};
	events.fix.stopPropagation = function () {
		this.cancelBubble = true;
		return true;
	};
}
events.add(window, "load", function () {
	var ndDateChooser, ndElement, sLastID, sLinkID, objUpdateField, objDate, aPatternNodes;
	var sDateFormat, sIcon, sText, sXOffset, sYOffset, sCloseTime, sOnUpdate, sStartDate, sEarliestDate, sLatestDate, sAllowedDays, sWeekStartDay, sLinkPosition;
	var nFieldID = 0;
	objDate = new Date();
	objDate.setHours(12);
	objDate.setMinutes(0);
	objDate.setMilliseconds(0);
	var aElements = xb.getElementsByAttribute(document, "class", "datechooser");
	for (var nIndex = 0; aElements[nIndex]; ++nIndex) {
		ndDateChooser = aElements[nIndex];
		if (!ndDateChooser.id) {
			ndDateChooser.id = "dc-id-" + (++nFieldID);
		}
		sLastID = ndDateChooser.id;
		sDateFormat = xb.getOption(ndDateChooser, "dc-dateformat");
		sIcon = xb.getOption(ndDateChooser, "dc-iconlink");
		sText = xb.getOption(ndDateChooser, "dc-textlink");
		sXOffset = xb.getOption(ndDateChooser, "dc-offset-x");
		sYOffset = xb.getOption(ndDateChooser, "dc-offset-y");
		sCloseTime = xb.getOption(ndDateChooser, "dc-closetime");
		sOnUpdate = xb.getOption(ndDateChooser, "dc-onupdate");
		sStartDate = xb.getOption(ndDateChooser, "dc-startdate");
		sEarliestDate = xb.getOption(ndDateChooser, "dc-earliestdate");
		sLatestDate = xb.getOption(ndDateChooser, "dc-latestdate");
		sAllowedDays = xb.getOption(ndDateChooser, "dc-alloweddays");
		sWeekStartDay = xb.getOption(ndDateChooser, "dc-weekstartday");
		sLinkPosition = xb.getOption(ndDateChooser, "dc-linkposition");
		if (sLinkPosition) {
			sLinkID = ndDateChooser.id;
		}
		objUpdateField = {};
		if (sDateFormat) {
			objUpdateField[ndDateChooser.id] = sDateFormat;
		}
		aPatternNodes = ndDateChooser.all || ndDateChooser.getElementsByTagName("*");
		for (var nPattern = 0; aPatternNodes[nPattern]; ++nPattern) {
			ndElement = aPatternNodes[nPattern];
			sDateFormat = xb.getOption(ndElement, "dc-dateformat");
			if (!sDateFormat) {
				continue;
			}
			if (!ndElement.id) {
				ndElement.id = "dc-id-" + (++nFieldID);
			}
			sLastID = ndElement.id;
			objUpdateField[sLastID] = sDateFormat;
			if (!sLinkPosition) {
				xb.getOption(ndElement, "dc-linkposition");
			}
			if (sLinkPosition) {
				sLinkID = sLastID;
			}
		}
		if (!sLinkPosition) {
			sLinkID = sLastID;
			sLinkPosition = "right";
		}
		ndDateChooser.DateChooser = new DateChooser();
		if (sXOffset) {
			ndDateChooser.DateChooser.setXOffset(sXOffset);
		}
		if (sYOffset) {
			ndDateChooser.DateChooser.setYOffset(sYOffset);
		}
		if (sCloseTime) {
			ndDateChooser.DateChooser.setCloseTime(sCloseTime);
		}
		if (sOnUpdate) {
			ndDateChooser.DateChooser.setUpdateFunction(eval(sOnUpdate));
		}
		if (sStartDate) {
			objDate = new Date();
			objDate.setDate(parseInt(sStartDate.substring(2, 4), 10));
			objDate.setMonth(parseInt(sStartDate.substring(0, 2), 10) - 1);
			objDate.setFullYear(parseInt(sStartDate.substring(4), 10));
			ndDateChooser.DateChooser.setStartDate(objDate);
		}
		if (sEarliestDate) {
			objDate = new Date();
			objDate.setDate(parseInt(sEarliestDate.substring(2, 4), 10));
			objDate.setMonth(parseInt(sEarliestDate.substring(0, 2), 10) - 1);
			objDate.setFullYear(parseInt(sEarliestDate.substring(4), 10));
			ndDateChooser.DateChooser.setEarliestDate(objDate);
		}
		if (sLatestDate) {
			objDate = new Date();
			objDate.setDate(parseInt(sLatestDate.substring(2, 4), 10));
			objDate.setMonth(parseInt(sLatestDate.substring(0, 2), 10) - 1);
			objDate.setFullYear(parseInt(sLatestDate.substring(4), 10));
			ndDateChooser.DateChooser.setLatestDate(objDate);
		}
		if (sAllowedDays) {
			ndDateChooser.DateChooser.setAllowedDays(sAllowedDays.split(","));
		}
		if (sWeekStartDay) {
			ndDateChooser.DateChooser.setWeekStartDay(parseInt(sWeekStartDay, 10));
		}
		if (sIcon) {
			ndDateChooser.DateChooser.setIcon(sIcon, sLinkID, (sLinkPosition != "left"));
		}
		if (sText) {
			ndDateChooser.DateChooser.setLink(sText, sLinkID, (sLinkPosition != "left"));
		}
		ndDateChooser.DateChooser.setUpdateField(objUpdateField);
	}
	delete objDate;
	return true;
});


