/* 
CALENDAR POPUP
Based on Matt Kruse's CalendarPopup (10/02/01) 
*/ 

// CONSTRUCTOR for the CalendarPopup Object
function CalendarPopup() {
	var newCalendar;
	if (arguments.length>0) {
		newCalendar = new PopupWindow(arguments[0]);
		}
	else {
		newCalendar = new PopupWindow();
		newCalendar.setSize(206,222);
		}
	newCalendar.offsetX = -150;
	newCalendar.offsetY = 25;
	newCalendar.autoHide();
	// Calendar-specific properties
	newCalendar.monthNames = MONTH_NAMES;
	newCalendar.dayHeaders = DAYOFWEEK_HEADER_NAMES;
	newCalendar.weekStartDay = WEEK_START_DAY;
	newCalendar.dateFormat = "M/D/YYYY";
	newCalendar.inputText = null;
	newCalendar.startYear = 0;
	newCalendar.startMonth = 0;
	newCalendar.startDate = 0;
	// Method mappings
	newCalendar.showCalendar = CalendarPopup_showCalendar;
	newCalendar.hideCalendar = CalendarPopup_hideCalendar;
	newCalendar.getStyles = CalendarPopup_getStyles;
	newCalendar.refreshCalendar = CalendarPopup_refreshCalendar;
	newCalendar.getCalendar = CalendarPopup_getCalendar;
	newCalendar.formatYearMonthDate = formatYearMonthDate;
	// Return the object
	return newCalendar;
	}
	
// Hide a calendar object
function CalendarPopup_hideCalendar() {
	if (arguments.length > 0) {
		window.popupWindowObjects[arguments[0]].hidePopup();
		}
	else {
		this.hidePopup();
		}
	}

// Refresh the contents of the calendar display
function CalendarPopup_refreshCalendar(index) {
	var calObject = window.popupWindowObjects[index];
	if (arguments.length>1) { 
		// swap month and year before calling
		calObject.populate(calObject.getCalendar(arguments[2],arguments[1]));
		}
	else {
		calObject.populate(calObject.getCalendar());
		}
	calObject.refresh();
	}

// Populate the calendar and display it
function CalendarPopup_showCalendar(anchorname,input,format) {
	this.inputText = input;
	this.dateFormat = format;
	// initialize start date from text field
	if (eval('document.' + input + '.value') != "") {
		var startDate = getDateFromFormat(eval('document.' +input + '.value'), format);
		if (startDate != 0) {
			this.startYear = startDate.getFullYear();
			this.startMonth = startDate.getMonth()+1;
			this.startDate = startDate.getDate();
			}
		}
	// manually set start date
	if (arguments.length>3) {
		this.startYear = arguments[3];
		this.startMonth = arguments[4];
		this.startDate = arguments[5];
		}
	this.populate(this.getCalendar());
	this.showPopup(anchorname);
	}

// Get style block needed to display the calendar correctly
function CalendarPopup_getStyles() {
	var result = "";
	result += "<STYLE>\n";
	result += "TD.cal { font-family:arial; font-size: 10pt; font-weight: bold; color:#ffffff;}\n";
	result += "TD.calmonth { font-family:arial; font-size: 10pt; text-align: right;}\n";
	result += "TD.caltoday { font-family:arial; font-size: 10pt; text-align: right; color: white; background-color:#C0C0C0; border-width:1; border-type:solid; border-color:#800000; }\n";
	result += "A.todaylink { font-family:arial; font-size: 10pt; height: 20px; color: black; }\n";
	result += "A.cal { text-decoration:none; color:#ffffff; }\n";
	result += "A.calthismonth { text-decoration:none; color:#000000; }\n";
	result += "A.calothermonth { text-decoration:none; color:#808080; }\n";
	result += "</STYLE>\n";
	return result;
	}

// Return a string containing all the calendar code to be displayed
// If the this.startDate is specified then we are use the startDate instead of today.
function CalendarPopup_getCalendar() {
	var now = new Date();
	var date = 1;
	if (arguments.length > 0) { var year = arguments[0]; }
		else { var year = now.getFullYear(); }
	if (arguments.length > 1) { var month = arguments[1]; }
		else { var month = now.getMonth()+1; }
	if (this.startDate > 0) {
		// set displayed month/year
		if (arguments.length == 0) {
			year = this.startYear;
			month = this.startMonth;
			date = this.startDate;
			}
		// set start date
		now.setFullYear(this.startYear);
		now.setMonth(this.startMonth-1);
		now.setDate(this.startDate);
		}
	// limit 1900 <= year <= 9999,  Note: SQL does not support dates < 1752
	if (year < 1900) { year = 1900; }
	if (year > 9999) { year = 9999; }
	var daysinmonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
	if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) { // leap year
		daysinmonth[2] = 29;
		}
	var current_month = new Date(year,month-1,1);
	var display_year = year;
	var display_month = month;
	var display_date = 1;
	var weekday = current_month.getDay();
	var offset = 0;
	if (weekday >= this.weekStartDay) {
		offset = weekday - this.weekStartDay;
		}
	else {
		offset = 7-this.weekStartDay+weekday;
		}
	if (offset > 0) {
		display_month--;
		if (display_month < 1) { display_month = 12; display_year--; }
		display_date = daysinmonth[display_month]-offset+1;
		}
	var next_month = month+1;
	var next_month_year = year;
	if (next_month > 12) {
		if (next_month_year >= 9999) { // limit max year 9999
			next_month=12; next_month_year=9999;
			}
		else {
			next_month=1; next_month_year++;
			}
		}
	var last_month = month-1;
	var last_month_year = year;
	if (last_month < 1) {
		if (last_month_year <= 1900) { // limit min year 1900
			last_month=1; last_month_year=1900;
			}
		else {
			last_month=12; last_month_year--;
			}
		}
	var date_class;
	var result = "";
	if (this.type == "WINDOW") {
		var windowref = "window.opener.";
		}
	else {
		var windowref = "";
		} 
	// If POPUP, write entire HTML document
	if (this.type == "WINDOW") {
		result += "<HTML><HEAD><TITLE>Calendar</TITLE>"+this.getStyles()+"</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
		result += '<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=3>\n';
		result += '<TR><TD BGCOLOR="#4682B4">\n';
		result += '<TABLE WIDTH=100% BORDER=0 CELLSPACING=1 CELLPADDING=0>\n';
		}
	else {
		result += '<TABLE WIDTH=206 HEIGHT=230 BORDER=1 BORDERCOLOR="#808080" CELLSPACING=0 CELLPADDING=1>\n';
		result += '<TR><TD>\n';
		result += '<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0>\n';
		}
	// month and year
	result += '<TR BGCOLOR="#C0C0C0">\n';
	result += '	<TD BGCOLOR="#4682B4" CLASS="cal" WIDTH=15% ALIGN=CENTER VALIGN=MIDDLE><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+last_month+','+last_month_year+');"><IMG SRC="images/cal_prev.gif" BORDER=0></A></TD>\n';
	result += '	<TD BGCOLOR="#4682B4" CLASS="cal" WIDTH=70% ALIGN=CENTER>'+this.monthNames[month-1]+'</TD>\n';
	result += '	<TD BGCOLOR="#4682B4" CLASS="cal" WIDTH=15% ALIGN=CENTER VALIGN=MIDDLE><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+next_month+','+next_month_year+');"><IMG SRC="images/cal_next.gif" BORDER=0></A></TD>\n';
	result += '</TR>\n';
	result += '<TR><TD BGCOLOR="#C0C0C0" COLSPAN=3 HEIGHT=1><IMG SRC="../images/spacer.gif" WIDTH=1 HEIGHT=1></TD></TR>\n';	// horiz line
	result += '<TR BGCOLOR="#4682B4">\n';	
	result += '	<TD BGCOLOR="#4682B4" CLASS="cal" WIDTH=15% ALIGN=CENTER VALIGN=MIDDLE><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+month+','+(year-1)+');"><IMG SRC="images/cal_prev.gif" BORDER=0></A></TD>\n';
	result += '	<TD BGCOLOR="#4682B4" CLASS="cal" WIDTH=70% ALIGN=CENTER>'+year+'</TD>\n';
	result += '	<TD BGCOLOR="#4682B4" CLASS="cal" WIDTH=15% ALIGN=CENTER VALIGN=MIDDLE><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+month+','+(year+1)+');"><IMG SRC="images/cal_next.gif" BORDER=0></A></TD>\n';
	result += '</TR></TABLE>\n';
	// days of week
	result += '<TABLE WIDTH=100% BORDER=0 CELLSPACING=1 CELLPADDING=3>\n';
	result += '<TR>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=14%>'+this.dayHeaders[(this.weekStartDay)%7]+'</TD>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=14%>'+this.dayHeaders[(this.weekStartDay+1)%7]+'</TD>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=15%>'+this.dayHeaders[(this.weekStartDay+2)%7]+'</TD>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=14%>'+this.dayHeaders[(this.weekStartDay+3)%7]+'</TD>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=14%>'+this.dayHeaders[(this.weekStartDay+4)%7]+'</TD>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=15%>'+this.dayHeaders[(this.weekStartDay+5)%7]+'</TD>\n';
	result += '	<TD BGCOLOR="#87CEFA" CLASS="cal" ALIGN=LEFT WIDTH=14%>'+this.dayHeaders[(this.weekStartDay+6)%7]+'</TD>\n';
	result += '</TR>\n';
	// dates
	for (var row=1; row<=6; row++) {
		result += '<TR>\n';
		for (var col=1; col<=7; col++) {
			if (display_month == month) {
				date_class = "calthismonth";
				}
			else {
				date_class = "calothermonth";
				}
			if ((display_month == now.getMonth()+1) && (display_date==now.getDate()) && (display_year==now.getFullYear())) {
				td_class="caltoday";
				}
			else {
				td_class="calmonth";
				}
			// highlight weekend differently (e.g. Sat and Sun)
			if (col==7-((this.weekStartDay+6)%7) || col==7-(this.weekStartDay%7)) {
				result += '	<TD BGCOLOR="#DBEAF5" ALIGN=RIGHT CLASS="'+td_class+'"><A HREF="javascript:'+windowref+'document.'+this.inputText+'.value=\''+this.formatYearMonthDate(display_year,display_month,display_date,this.dateFormat)+'\';'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+display_date+'</A></TD>\n';
				}
			else {
				result += '	<TD BGCOLOR="#FFFFFF" ALIGN=RIGHT CLASS="'+td_class+'"><A HREF="javascript:'+windowref+'document.'+this.inputText+'.value=\''+this.formatYearMonthDate(display_year,display_month,display_date,this.dateFormat)+'\';'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+display_date+'</A></TD>\n';
				}
			display_date++;
			if (display_date > daysinmonth[display_month]) {
				display_date=1;
				display_month++;
				}
			if (display_month > 12) {
				display_month=1;
				display_year++;
				}
			}
		result += '</TR>';
		}
	result += '<TR>\n';
	result += '	<TD COLSPAN=7 ALIGN=CENTER>\n';
	result += '	&nbsp;\n';
	result += '	</TD></TR></TABLE></TD></TR></TABLE>\n';
	if (this.type == "WINDOW") {
		result += "</TD></TR></TABLE></BODY></HTML>\n";
		}
	return result;
	}

