var calendar = {
	"minYears":parseInt(new Date().getFullYear()),
	"maxYears":parseInt(new Date().getFullYear()+2),
	"iconOpen":"/img/icon_Calendar.gif",
	"iconClose":"/img/icon_Close.gif",
	"object":null,
	"target":null,
	"selectFrame":null,
	"status":0,
	"month":parseInt(new Date().getMonth()),
	"year":parseInt(new Date().getFullYear()),
	"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
	"months":["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],
	"getDays":function(month,year) {
		return 32 - parseInt(new Date(year,month,32).getDate());
	},
	"getFutureDate":function(month,day,year,days) {
		if (month==null) month = parseInt(new Date().getMonth());
		if (day==null) day = parseInt(new Date().getDate());
		if (year==null) year = parseInt(new Date().getFullYear());
		if (isNaN(days)) days = 0;
		var toDate = new Date(year,month,day+days);
		var year = toDate.getFullYear();
			var buffer = {
				"month":toDate.getMonth(),
				"date":toDate.getDate(),
				"year":year
			};
		return buffer;
	},
	"printYears":function(obj,startYear,endYear,selectedYear) {
		if (!startYear) startYear = calendar.minYears;
		if (!endYear) endYear = calendar.maxYears;
		if (!selectedYear) selectedYear = startYear;
		for (var c=startYear; c<=endYear; c++) {
			document.write('<option value="'+c+'"'+((c==selectedYear)?' selected="selected"':'')+'>'+c+'</option>');
		}
	},
	"printMonths":function(obj,selectedMonth) {
		var months = ["January","February","March","April","May","June","July","August","September","October","November","December"];
		if (selectedMonth==null||isNaN(selectedMonth)) selectedMonth = new Date().getMonth();
		for (var c=0; c<months.length; c++) {
			document.write('<option value="'+c+'"'+((c==selectedMonth)?' selected="selected"':'')+'>'+months[c]+'</option>');
		}
	},
	"printDays":function(obj,month,year,selectedDay) {
		var currentDay = new Date().getDate();
		var currentMonth = new Date().getMonth();
		var currentYear = new Date().getFullYear();
		var selects = document.getElementsByTagName('select');
		if (obj && typeof(obj)=="string") obj = selects[obj];
		if (month && isNaN(month) && typeof(month)=="string") month = parseInt(selects[month].value);
		if (year && isNaN(year) && typeof(year)=="string") year = parseInt(selects[year].value);
		if (selectedDay && isNaN(selectedDay) && typeof(selectedDay)=="string") selectedDay = selects[selectedDay].value;
		if (month==null) month = currentMonth;
		if (!year) year = currentYear;
		if (!selectedDay) selectedDay = currentDay;
		var days = calendar.getDays(month,year);
		if (obj && obj.options) {
			for (var c=0; c<obj.options.length; c++) {
				if (obj.options[c].selected) obj.options[c].selected = "";
			}
			if (days > obj.options.length) {
				for (var c=obj.options.length+1; c<=days; c++) {
					var op = document.createElement('option');
					obj.options.add(op);
					op.innerHTML = c;
					op.value = c;
					if (c==selectedDay) op.selected = "selected";
				}
			} else if (days < obj.options.length) {
				for (var c=obj.options.length-1; c>=days; c--) {
					obj.options.remove(c);
				}
				if (obj.options[selectedDay-1]) {
					obj.options[selectedDay-1].selected = "selected";
				} else {
					obj.options[0].selected = "selected";
				}
			}
		} else {
			for (var c=1; c<=days; c++) {
				document.write('<option value="'+c+'"'+((c==selectedDay)?' selected="selected"':'')+'>'+c+'</option>');
			}
		}
	},
	"highlight":function(obj,mode) {
		if (mode == 0) {
			obj.className = obj.className.replace(/(\s*)hover/g,"");
		} else {
			obj.className += " hover";
		}
	},
	"getOffset":function() {
		if (!arguments[0]) return [0,0];
		var obj = arguments[0];
		var offset = [obj.offsetLeft,obj.offsetTop];
		var parent = obj;
		while (parent != null) {
			if (obj.offsetParent) {
				parent = obj.offsetParent;
				if (parent.offsetLeft) offset[0] += parseFloat(parent.offsetLeft);
				if (parent.offsetTop) offset[1] += parseFloat(parent.offsetTop);
				obj = parent;
			} else {
				return offset;
			}
		}
	},
	"generate":function(month,year) {
		var time = new Date();
		month = (!isNaN(month))?month:calendar.month;
		year = (!year || isNaN(year))?calendar.year:year;
		var currentMonth = time.getMonth();
		var currentYear = time.getFullYear();
		var currentDay = time.getDate();
		var selMonth = calendar.monthObject;
		var selYear = calendar.yearObject;
		var selDay = calendar.dayObject;
		var monthName = calendar.months[month];
		var days = calendar.getDays(month,year);
		var firstDay = new Date(year,month,1).getDay();
		var buffer = '<table cellpadding="0" cellspacing="0" style="table-layout:fixed; height:100%; width:100%">';
			buffer += '<tr><td class="controls"><a href="javascript:void(0);"'+((year>calendar.minYears)?'onclick="calendar.previousYear();"':'')+' class="'+((year<=calendar.minYears)?'disabled ':'')+'control">&lt;&lt;</a></td>';
			buffer += '<td class="controls"><a href="javascript:void(0);"'+((month>0||year>calendar.minYears)?'onclick="calendar.previousMonth();"':'')+' class="'+((month>0||year>calendar.minYears)?'':'disabled ')+'control">&lt;</a></td>';
			buffer += '<td class="controls" colspan="3"><a href="javascript:void(0);" onclick="calendar.listMonths(this);" class="list">'+monthName+'</a>&nbsp;<a href="javascript:void(0);" onclick="calendar.listYears(this);" class="list">'+year+'</a></td>';
			buffer += '<td class="controls"><a href="javascript:void(0);"'+((month<11||year<calendar.maxYears)?'onclick="calendar.nextMonth();"':'')+' class="'+((month<11||year<calendar.maxYears)?'':'disabled ')+'control">&gt;</a></td>';
			buffer += '<td class="controls"><a href="javascript:void(0);"'+((year<calendar.maxYears)?'onclick="calendar.nextYear();"':'')+' class="'+((year>=calendar.maxYears)?'disabled ':'')+'control">&gt;&gt;</a></td></tr>';
			for (var c=0; c<7; c++) {
				if (c==0) buffer += '<tr class="weekdays">';
				buffer += '<td>'+calendar.days[c].substr(0,1)+'</td>';
			}
			for (var c=0; c<=41; c++) {
				if (c==0 || c%7==0) buffer += '</tr><tr class="row'+((c%2==0)?"A":"B")+'">';
				var selected = false;
				if (selMonth && selDay && selYear) selected = (selYear.value==year && selMonth.value==month && selDay.value==((c+1)-firstDay));
				if (c>=firstDay && c<days+firstDay) {
					buffer += '<td onclick="calendar.selectDate(this.innerHTML);" onmouseover="calendar.highlight(this,1);" onmouseout="calendar.highlight(this,0);"'+((selected)?' class="selected"':'')+'>'+((c+1)-firstDay).toString()+'</td>';
				} else {
					buffer += '<td class="empty">&nbsp;</td>';
				}
			}
		buffer += '</tr></table>';
		calendar.month = parseInt(month);
		calendar.year = parseInt(year);
		calendar.object.innerHTML = buffer;
		if (calendar.object.style.visibility=="hidden") calendar.show();
	},
	"nextMonth":function() {
		var month = calendar.month + 1;
		var year = calendar.year;
		if (month > 11) {
			month = 0;
			year++;
			if (year > calendar.maxYears) return;
		}
		calendar.generate(month,year);
	},
	"previousMonth":function() {
		var month = calendar.month - 1;
		var year = calendar.year;
		if (month < 0) {
			month = 11;
			year--;
			if (year < calendar.minYears) return;
		}
		calendar.generate(month,year);
	},
	"previousYear":function() {
		var month = calendar.month;
		var year = calendar.year - 1;
		if (year < calendar.minYears) return;
		calendar.generate(month,year);
	},
	"nextYear":function() {
		var month = calendar.month;
		var year = calendar.year + 1;
		if (year > calendar.maxYears) return;
		calendar.generate(month,year);
	},
	"selectDate":function(day) {
		if (calendar.monthObject) calendar.monthObject.value = calendar.month;
		if (calendar.dayObject && calendar.dayObject.options) {
			calendar.printDays(calendar.dayObject,calendar.month,calendar.year);
			calendar.dayObject.value = day;
		}
		if (calendar.yearObject) calendar.yearObject.value = calendar.year;
		if (calendar.monthObject && calendar.monthObject.onchange) calendar.monthObject.onchange();
		if (calendar.dayObject && calendar.dayObject.onchange) calendar.dayObject.onchange();
		if (calendar.yearObject && calendar.yearObject.onchange) calendar.yearObject.onchange();
		if (calendar.handler) calendar.handler(calendar.month,day,calendar.year,calendar.target);
		calendar.hide();
	},
	"selectMonth":function(month) {
		calendar.closeList();
		for (var c=0; c<calendar.months.length; c++) {
			if (calendar.months[c] == month) {
				month = c;
				break;
			}
		}
		calendar.month = parseInt(month);
		calendar.generate(month,calendar.year);
	},
	"selectYear":function(year) {
		calendar.closeList();
		calendar.year = parseInt(year);
		calendar.generate(calendar.month,year);
	},
	"closeList":function() {
		if (!calendar.selectFrame) return;
		calendar.selectFrame.style.visibility = "hidden";
	},
	"listMonths":function(obj) {
		if (!obj) return;
		var buffer = '<table cellpadding="0" cellspacing="0" style="width:55px; table-layout:fixed">';
			for (var c=0; c<calendar.months.length; c++) {
				buffer += '<tr><td align="center" valign="middle" onclick="calendar.selectMonth(this.innerHTML);" onmouseover="calendar.highlight(this,1);" onmouseout="calendar.highlight(this,0);">'+calendar.months[c]+'</td></tr>';
			}
		buffer += '</table>';
		if (!calendar.selectFrame) {
			var frame = document.createElement('div');
			frame.className = "select";
			frame.onmousedown = function(e) {
				if (!e) var e = window.event;
				try {
					e.stopPropagation();
				} catch(err) {
					e.cancelBubble = true;
				}
			}
			calendar.selectFrame = frame;
		} else {
			var frame = calendar.selectFrame;
		}
		calendar.object.appendChild(frame);
		frame.innerHTML = buffer;
		frame.style.width = (obj.offsetWidth*2) + "px";
		var coords = calendar.getOffset(obj);
		var relCoords = calendar.getOffset(calendar.object);
		var x = coords[0] - relCoords[0];
		var y = coords[1] - relCoords[1] + obj.offsetHeight + 2;
		if (frame.style.visibility!="hidden" && frame.style.left==x+"px" && frame.style.top==y+"px") {
			frame.style.visibility = "hidden";
		} else {
			frame.style.left = x + "px";
			frame.style.top = y + "px";
			frame.style.visibility = "visible";
		}
	},
	"listYears":function(obj) {
		if (!obj) return;
		var buffer = '<table cellpadding="0" cellspacing="0" style="width:55px; table-layout:fixed">';
			for (var c=calendar.minYears; c<=calendar.maxYears; c++) {
				buffer += '<tr><td align="center" valign="middle" onclick="calendar.selectYear(this.innerHTML);" onmouseover="calendar.highlight(this,1);" onmouseout="calendar.highlight(this,0);">'+c+'</td></tr>';
			}
		buffer += '</table>';
		if (!calendar.selectFrame) {
			var frame = document.createElement('div');
			frame.className = "select";
			frame.onmousedown = function(e) {
				if (!e) var e = window.event;
				try {
					e.stopPropagation();
				} catch(err) {
					e.cancelBubble = true;
				}
			}
			calendar.selectFrame = frame;
		} else {
			var frame = calendar.selectFrame;
		}
		calendar.object.appendChild(frame);
		frame.innerHTML = buffer;
		frame.style.width = (obj.offsetWidth*2) + "px";
		var coords = calendar.getOffset(obj);
		var relCoords = calendar.getOffset(calendar.object);
		var x = coords[0] - relCoords[0];
		var y = coords[1] - relCoords[1] + obj.offsetHeight + 2;
		if (frame.style.visibility!="hidden" && frame.style.left==x+"px" && frame.style.top==y+"px") {
			calendar.closeList();
		} else {
			frame.style.left = x + "px";
			frame.style.top = y + "px";
			frame.style.visibility = "visible";
		}
	},
	"show":function(obj,x,y,monthObject,dayObject,yearObject,handler) {
		if (calendar.status != 2) {
			calendar.init();
			setTimeout(function(){ calendar.show(obj,x,y,monthObject,dayObject,yearObject,handler) },1);
			return;
		}
		if (isNaN(x)) x=0;
		if (isNaN(y)) y=0;
		var img;
		if (obj) {
			var coords = calendar.getOffset(obj);
			x = coords[0];
			y = coords[1] + obj.offsetHeight + 2;
			if (!obj.onmousedown) obj.onmousedown = function(e) {
				if (!e) var e = window.event;
				try {
					e.stopPropogation();
				} catch(err) {
					e.cancelBubble = true;
				}
			}
			if (obj.childNodes[0] && obj.childNodes[0].tagName.toLowerCase()=="img" && obj.childNodes[0].src.toLowerCase().indexOf('icon')>-1) img = obj.childNodes[0];
		}
		var selects = document.getElementsByTagName('select');
		calendar.monthObject = (!isNaN(monthObject))?{"value":monthObject}:(selects[monthObject])?selects[monthObject]:null;
		calendar.dayObject = (!isNaN(dayObject))?{"value":dayObject}:(selects[dayObject])?selects[dayObject]:null;
		calendar.yearObject = (!isNaN(yearObject))?{"value":yearObject}:(selects[yearObject])?selects[yearObject]:null;
		if (typeof(handler)=="function") calendar.handler = handler;
		if (calendar.monthObject && calendar.monthObject.value!=null) calendar.month = parseInt(calendar.monthObject.value);
		if (calendar.yearObject && calendar.yearObject.value!=null) calendar.year = parseInt(calendar.yearObject.value);
		if (!isNaN(monthObject)) calendar.month = parseInt(monthObject);
		if (!isNaN(yearObject)) calendar.year = parseInt(yearObject);
		with (calendar.object.style) {
			if (visibility!="hidden" && left==x+"px" && top==y+"px") {
				if (img) setTimeout(function(){ img.src = calendar.iconOpen },50);
				calendar.hide();
				return;
			} else {
				if (calendar.target) calendar.hide(true);
				if (obj) calendar.target = obj;
				left = x + "px";
				top = y + "px";
				visibility = "visible";
				calendar.generate();
				if (img) setTimeout(function(){ img.src = calendar.iconClose },50);
			}
		}
		with (calendar.crutch.style) {
			left = x + "px";
			top = y + "px";
			width = (calendar.object.offsetWidth-4) + "px";
			height = (calendar.object.offsetHeight-4) + "px";
			visibility = "visible";
		}
		calendar.slideIntoView();
	},
	"hide":function(retainData) {
		calendar.closeList();
		if (calendar.object) calendar.object.style.visibility = "hidden";
		if (calendar.crutch) calendar.crutch.style.visibility = "hidden";
		if (calendar.target) {
			var obj = calendar.target;
			if (obj.childNodes[0] && obj.childNodes[0].tagName.toLowerCase()=="img" && obj.childNodes[0].src.toLowerCase().indexOf('icon')>-1) {
				obj.childNodes[0].src = calendar.iconOpen;
			}
		}
		if (!retainData) {
			calendar.monthObject = null;
			calendar.dayObject = null;
			calendar.yearObject = null;
		}
		calendar.target = null;
	},
	"slideIntoView":function() {
		var calOverflow = 0;
		var peak = calendar.object.offsetTop + calendar.object.offsetHeight + 5;
		calOverflow = peak - (document.documentElement.clientHeight+document.documentElement.scrollTop);
		if (calOverflow > 0) {
			var scroll = 2;
			if (calOverflow-scroll < 0) scroll = calOverflow;
			document.documentElement.scrollTop += scroll;
			setTimeout("calendar.slideIntoView();",1);
		}
	},
	"preload":function() {
		var images = [calendar.iconClose,"/img/list_off.gif","/img/list_on.gif"];
		var img = [];
		for (var c=0; c<images.length; c++) {
			img[c] = new Image();
			img[c].src = images[c];
		}
	},
	"init":function() {
		if (calendar.status > 0) return;
		calendar.status = 1;
		var base = document.createElement('div');
		base.className = "calendar";
		base.onmousedown = function(e) {
			if (!e) var e = window.event;
			try {
				e.stopPropagation();
			} catch(err) {
				e.cancelBubble = true;
			}
			calendar.closeList();
		}
		var crutch = document.createElement('iframe');
		crutch.src = "/blank.html";
		crutch.className = "calendar";
		crutch.frameBorder = 0;
		crutch.style.zIndex = 50;
		if (document.body.childNodes[0]) {
			document.body.insertBefore(base,document.body.childNodes[0]);
			document.body.insertBefore(crutch,base.nextSibling);
		} else {
			document.body.appendChild(base);
			document.body.appendChild(crutch);
		}
		calendar.object = base;
		calendar.crutch = crutch;
		var time = new Date();
		var month = time.getMonth();
		var year = time.getFullYear();
		calendar.generate(month,year);
		var MDHook = (document.onmousedown)?document.onmousedown:function(){};
		document.onmousedown = function(e) {
			MDHook();
			if (!e) var e = window.event;
			var target = e.srcElement || e.target;
			if (!target) return true;
			var isCalendar = false;
			var obj = target;
			if (obj.tagName.toLowerCase()=="img" && obj.src.indexOf('icon_Close')>-1) isCalendar = true;
			while (obj.parentNode) {
				obj = obj.parentNode;
				if (obj.parentNode == calendar.object) {
					isCalendar = true;
					break;
				}
			}
			if (isCalendar) return false;
			calendar.hide();
		}
		calendar.status = 2;
	}
};
calendar.preload();