// NetPoint 2.01
// Copyright © 2003 Respond Group Limited.
// Respond ® is a registered trademark of Respond Group Limited.

// This class will create a popup calendar by writting HTML into a child window.

function CalendarPopup()
{
	var c;
	if (arguments.length>0)
		 {c = new PopupWindow(arguments[0]);}
	else 
		{c = new PopupWindow();
		c.setSize(165,160);}
	c.offsetX = -152;
	c.offsetY = 25;
	c.autoHide();

	// Calendar-specific properties
	c.monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	c.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	c.dayHeaders = new Array("S","M","T","W","T","F","S");
	c.returnFunction = "CalendarPopup_tmpReturnFunction";
	c.weekStartDay = 0;
	c.isShowYearNavigation = false;
	c.displayType = "date";
	c.disabledWeekDays = new Object();
	c.yearSelectStartOffset = 2;
	c.currentDate = null;
	c.todayText="Today";
	c.TimeInterval = 0;
	c.IncludeTimes = 0;
	c.TimeIsMandatory = 0;
	window.CalendarPopup_targetInput = null;
	window.CalendarPopup_dateFormat = "mm/dd/yyyy";

	// Method mappings
	c.setReturnFunction = CalendarPopup_setReturnFunction;
	c.setMonthNames = CalendarPopup_setMonthNames;
	c.setMonthAbbreviations = CalendarPopup_setMonthAbbreviations;
	c.setDayHeaders = CalendarPopup_setDayHeaders;
	c.setWeekStartDay = CalendarPopup_setWeekStartDay;
	c.setDisplayType = CalendarPopup_setDisplayType;
	c.setDisabledWeekDays = CalendarPopup_setDisabledWeekDays;
	c.setYearSelectStartOffset = CalendarPopup_setYearSelectStartOffset;
	c.setTodayText = CalendarPopup_setTodayText;
	c.showYearNavigation = CalendarPopup_showYearNavigation;
	c.showCalendar = CalendarPopup_showCalendar;
	c.hideCalendar = CalendarPopup_hideCalendar;
	c.getStyles = CalendarPopup_getStyles;
	c.refreshCalendar = CalendarPopup_refreshCalendar;
	c.getCalendar = CalendarPopup_getCalendar;
	c.getTimeControls = CalendarPopup_getTimeControls;
	c.formatTime = CalendarPopup_formatTime;
	c.returnValidTimeInterval = CalendarPopup_returnValidTimeInterval;
	c.setTimeControlProperties = CalendarPopup_setTimeControlProperties;
	c.getFormattedMinutes = CalendarPopup_getFormattedMinutes;
	c.select = CalendarPopup_select;

	// Return the object
	return c;
}

// Temporary default functions to be called when items clicked, so no error is thrown
function CalendarPopup_tmpReturnFunction(y,m,d,index) { 
	var LHours = 0;
	var LMinutes = 0;
	var calObject = window.popupWindowObjects[index];
	if (calObject.IncludeTimes) {
		if (arguments[4] && arguments[5]) {
			LHours = arguments[4];
			LMinutes = calObject.getFormattedMinutes(arguments[5])
		}
		else {
			LHours = calObject.HourControl.options[calObject.HourControl.selectedIndex].value;
			LMinutes = calObject.MinuteControl.options[calObject.MinuteControl.selectedIndex].value;
			if ((LHours == "") || (LMinutes == "")) {
				// If there is no time element then remove the time formatting
				window.CalendarPopup_dateFormat = window.CalendarPopup_dateFormat.replace(/hh:nn/,""); }
		}
	}
	if (window.CalendarPopup_targetInput!=null) {
		var d = new Date(y,m-1,d,LHours,LMinutes,0);
		window.CalendarPopup_targetInput.value = formatDate(d,window.CalendarPopup_dateFormat);
		}
	else {
		alert('Use setReturnFunction() to define which function will get the clicked results!'); 
		}
	}

// Function to set the time control flags.
function CalendarPopup_setTimeControlProperties(PIncludeTime, PTimeInterval, PTimeIsMandatory) {
	this.IncludeTimes = PIncludeTime;
	this.TimeInterval = PTimeInterval;
	this.TimeIsMandatory = PTimeIsMandatory;
}

// Function populate the minute control depending on the value of the hour control.
function CalendarPopup_PopulateMinuteCombo(index) { 
	var calObject = window.popupWindowObjects[index];
    var LSelectedHour = calObject.HourControl.options[calObject.HourControl.selectedIndex].value;
    var LSelectedMinute = calObject.MinuteControl.options[calObject.MinuteControl.selectedIndex].value;
	for (var LCount = 0; LCount < calObject.MinuteControl.length; LCount++)
	{
		var LControlValue = calObject.MinuteControl.options[LCount].value;
		if (((LControlValue == "") && (LSelectedHour == "")) || ((LControlValue !== "") && (LSelectedHour !== "") && (LSelectedMinute =="")))
		{
		    calObject.MinuteControl.options[LCount].selected = true;
		    return true;
		}		
	}
}

// Function populate the hour control depending on the value of the minute control.
function CalendarPopup_PopulateHourCombo(index) { 
	var calObject = window.popupWindowObjects[index];
    var LSelectedHour = calObject.HourControl.options[calObject.HourControl.selectedIndex].value;
    var LSelectedMinute = calObject.MinuteControl.options[calObject.MinuteControl.selectedIndex].value;
	for (var LCount = 0; LCount < calObject.HourControl.length; LCount++)
	{
		var LControlValue = calObject.HourControl.options[LCount].value;
		if (((LControlValue == "") && (LSelectedMinute == "")) || ((LControlValue !== "") && (LSelectedMinute !== "") && (LSelectedHour =="")))
		{
			calObject.HourControl.options[LCount].selected = true;
			return true;
		}		
	}
}

// Function to format the minutes to the nearest minutes interval.
function CalendarPopup_getFormattedMinutes(PMinutes) {
	// Validate a value has been passed in.
	if (PMinutes == "") return PMinutes;
	var LMinutes = new Number();
	var LMinutes = PMinutes;
	
	// Determine the value closest to the step interval.
	var LTimeInterval = this.returnValidTimeInterval();
	var LModValue = LMinutes % LTimeInterval;
	var LMidTimeInterval = Math.floor(LTimeInterval/2);
	var LUpperValue = LMinutes + (LTimeInterval - LModValue);
	var LLowerValue = LMinutes - LModValue;
	
	//Format the correct value.
	if ((LModValue >= LMidTimeInterval) && (LUpperValue <= 59)) var LFormatedMinutes = this.formatTime(LUpperValue);
	else var LFormatedMinutes = this.formatTime(LLowerValue);
	
	// Return the formatted value.
	return LFormatedMinutes
}

// Function to build the HTML to display the time controls.	
function CalendarPopup_getTimeControls() {
	// Initialise.
	if (this.type == "WINDOW") { var windowref = "window.opener."; }
	else { var windowref = ""; }
	var LResult = "";
	
	// Create the hour select control.
	LResult += "<Select name='cboHours' class='timecombo' id='cboHours' onChange='javascript:"+windowref+"CalendarPopup_PopulateMinuteCombo("+this.index+");'>\n";
	if (!this.TimeIsMandatory) LResult += "<Option value = ''></Option>\n";
	var LCurrentHour = this.currentDate.getHours();
	for (var LCount = 0; LCount < 24; LCount++) {
		var LHour = this.formatTime(LCount);
		if (LCurrentHour == LCount) LResult += "<Option selected value = " + LHour + ">" + LHour + "</Option>\n";
		else LResult += "<Option value = " + LHour + ">" + LHour + "</Option>\n";	
	} 
	LResult += "</Select>";
	
	// Create the minute select control.
	var LInterval = this.returnValidTimeInterval();
	LResult += "<Select name='cboMinutes' class='timecombo' id='cboMinutes' onChange='javascript:"+windowref+"CalendarPopup_PopulateHourCombo("+this.index+");'>\n";
	if (!this.TimeIsMandatory) LResult += "<Option value = ''></Option>\n";
	var LCurrentMinute = this.getFormattedMinutes(this.currentDate.getMinutes());
	for (var LCount = 0; LCount < 60; LCount += LInterval) {
		var LMinute = this.formatTime(LCount);
		if (LCurrentMinute == LCount) LResult += "<Option selected value = " + LMinute + ">" + LMinute + "</Option>\n";
		else LResult += "<Option value = " + LMinute + ">" + LMinute + "</Option>\n";		
	} 
	LResult += "</Select>";
	
	// Return the html.
	return LResult;
}

// Function to return a valid time interval.
function CalendarPopup_returnValidTimeInterval() {
	var LTimeInterval = new Number();
	switch(this.TimeInterval) {
	case "1" :
		LTimeInterval = 1;
		break;
	case "2" :
		LTimeInterval = 2;
		break;
	case "5" :
		LTimeInterval = 5;
		break;
	case "10" :
		LTimeInterval = 10;
		break;
	case "15" :
		LTimeInterval = 15;
		break;
	case "20" :
		LTimeInterval = 20;
		break;
	case "30" :
		LTimeInterval = 30;
		break;
	default :
		LTimeInterval = 5;
		break;
	}
return LTimeInterval;
}

// Function to format the number passed in ie. 1 becomes 01
function CalendarPopup_formatTime(PValueToFormat) {
	var LValue = PValueToFormat.toString();
	if (LValue.length == 1) LReturn = "0" + LValue;
	else LReturn = LValue;
	return LReturn;
}

// Set the name of the functions to call to get the clicked item
function CalendarPopup_setReturnFunction(name) { this.returnFunction = name; }

// Over-ride the built-in month names
function CalendarPopup_setMonthNames() {
	for (var i=0; i<arguments.length; i++) { this.monthNames[i] = arguments[i]; }
	}

// Over-ride the built-in month abbreviations
function CalendarPopup_setMonthAbbreviations() {
	for (var i=0; i<arguments.length; i++) { this.monthAbbreviations[i] = arguments[i]; }
	}

// Over-ride the built-in column headers for each day
function CalendarPopup_setDayHeaders() {
	for (var i=0; i<arguments.length; i++) { this.dayHeaders[i] = arguments[i]; }
	}

// Set the day of the week (0-7) that the calendar display starts on
// This is for countries other than the US whose calendar displays start on Monday(1), for example
function CalendarPopup_setWeekStartDay(day) { this.weekStartDay = day; }

// Show next/last year navigation links
function CalendarPopup_showYearNavigation() { this.isShowYearNavigation = true; }

// Which type of calendar to display
function CalendarPopup_setDisplayType(type) {
	if (type!="date") { alert("Invalid display type!"); return false; }
	this.displayType=type;
	}

// How many years back to start by default for year display
function CalendarPopup_setYearSelectStartOffset(num) { this.yearSelectStartOffset=num; }

// Set which weekdays should not be clickable
function CalendarPopup_setDisabledWeekDays() {
	this.disabledWeekDays = new Object();
	for (var i=0; i<arguments.length; i++) { this.disabledWeekDays[arguments[i]] = true; }
	}
	
// Set the text to use for the "Today" link
function CalendarPopup_setTodayText(text) {
	this.todayText = text;
	}

// 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) { 
		calObject.populate(calObject.getCalendar(arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]));
		}
	else {
		calObject.populate(calObject.getCalendar());
		}
	calObject.refresh();
	}

// Populate the calendar and display it
function CalendarPopup_showCalendar(anchorname) {
	this.populate(this.getCalendar());
	this.showPopup(anchorname);
	}

// Simple method to interface popup calendar with a text-entry box
function CalendarPopup_select(PInputObject, PLinkName, PFormat, PIncludeTime, PTimeInterval, PTimeIsMandatory) {
	if (!window.getDateFromFormat) {
		alert("calendar.select: To use this method you must also include 'NetPoint.js' for date formatting");
		return;
		}
	if (this.displayType!="date") {
		alert("calendar.select: This function can only be used with displayType 'date''");
		return;
		}
	if (PInputObject.type!="text" && PInputObject.type!="hidden" && PInputObject.type!="textarea") { 
		alert("calendar.select: Input object passed is not a valid form input object"); 
		window.CalendarPopup_targetInput=null;
		return;
		}
	window.CalendarPopup_targetInput = PInputObject;
	if (PInputObject.value!="") {
		var time = getDateFromFormat(PInputObject.value, PFormat);
		if (time==0) { this.currentDate=null; }
		else { this.currentDate=new Date(time); }
		}
	else { this.currentDate=null; }
	window.CalendarPopup_dateFormat = PFormat;
	
	// Set the time properties.
	if (PIncludeTime) {
		this.setTimeControlProperties(PIncludeTime, PTimeInterval, PTimeIsMandatory);
		this.setSize(165,190);
	}
	this.showCalendar(PLinkName);
	}
	
// 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: 8pt; }\n";
	result += "TD.calmonth { font-family:arial; font-size: 8pt; text-align: right;}\n";
	result += "TD.caltoday { font-family:arial; font-size: 8pt; text-align: right; color: white; background-color:#C0C0C0; border-width:1; border-type:solid; border-color:#800000; }\n";
	result += "A.textlink { font-family:arial; font-size: 8pt; height: 20px; color: black; }\n";
	result += ".disabledtextlink { font-family:arial; font-size: 8pt; height: 20px; color: #808080; }\n";
	result += "A.cal { text-decoration:none; color:#000000; }\n";
	result += "A.calthismonth { text-decoration:none; color:#000000; }\n";
	result += "A.calothermonth { text-decoration:none; color:#808080; }\n";
	result += ".calnotclickable { color:#808080; }\n";
	result += ".timecombo { font-family:arial; font-size: 7pt; height: 18px; color: black; }\n";
	result += "</STYLE>\n";
	return result;
	}

// Return a string containing all the calendar code to be displayed
function CalendarPopup_getCalendar() {
	var now = new Date();
	// Reference to window
	if (this.type == "WINDOW") { var windowref = "window.opener."; }
	else { var windowref = ""; }
	var result = "";
	// If POPUP, write entire HTML document
	if (this.type == "WINDOW") {
		result += "<HTML><HEAD><TITLE>NetPoint Calendar</TITLE>"+this.getStyles()+"<script>function setFocus(){document.getElementById(\'todaybutton\').focus()}</script></HEAD><BODY onLoad=\"setTimeout(\'setFocus()\',100);\" MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
		result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
		}
	else {
		result += '<TABLE WIDTH=144 BORDER=1 BORDERWIDTH=1 BORDERCOLOR="#808080" CELLSPACING=0 CELLPADDING=1>\n';
		result += '<TR><TD ALIGN=CENTER>\n';
		result += '<CENTER>\n';
		}

	// Generate the HTML code
	if (this.currentDate==null) { this.currentDate = now; }
	if (arguments.length > 0) { var month = arguments[0]; }
		else { var month = this.currentDate.getMonth()+1; }
	if (arguments.length > 1) { var year = arguments[1]; }
		else { var year = this.currentDate.getFullYear(); }
	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) ) {
		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) { next_month=1; next_month_year++; }
	var last_month = month-1;
	var last_month_year = year;
	if (last_month < 1) { last_month=12; last_month_year--; }
	var date_class;
	if (this.type!="WINDOW") {
		result += '<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
		}
	result += '<TR BGCOLOR="#C0C0C0">\n';
	var refresh = 'javascript:'+windowref+'CalendarPopup_refreshCalendar';
	if (this.isShowYearNavigation) {
		var td = '<TD BGCOLOR="#C0C0C0" CLASS="cal" ALIGN=CENTER VALIGN=MIDDLE ';
		result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+last_month+','+last_month_year+');">&lt;</A></B></TD>';
		result += td + ' WIDTH=58>'+this.monthNames[month-1]+'</TD>';
		result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+next_month+','+next_month_year+');">&gt;</A></B></TD>';
		result += td + ' WIDTH=10>&nbsp;</TD>';
		result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+month+','+(year-1)+');">&lt;</A></B></TD>';
		result += td + ' WIDTH=36>'+year+'</TD>';
		result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+month+','+(year+1)+');">&gt;</A></B></TD>';
		}
	else {
		result += '	<TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=22 ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+last_month+','+last_month_year+');">&lt;&lt;</A></B></TD>\n';
		result += '	<TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=100 ALIGN=CENTER>'+this.monthNames[month-1]+' '+year+'</TD>\n';
		result += '	<TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=22 ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+next_month+','+next_month_year+');">&gt;&gt;</A></B></TD>\n';
		}
	result += '</TR></TABLE>\n';
	result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
	result += '<TR>\n';
	var td = '	<TD CLASS="cal" ALIGN=RIGHT WIDTH=14%>';
	for (var j=0; j<7; j++) {
		result += td+this.dayHeaders[(this.weekStartDay+j)%7]+'</TD>\n';
		}
	result += '</TR>\n';
	result += '<TR><TD COLSPAN=7 ALIGN=CENTER><IMG SRC="graypixel.gif" WIDTH=120 HEIGHT=1></TD></TR>\n';
	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 == this.currentDate.getMonth()+1) && (display_date==this.currentDate.getDate()) && (display_year==this.currentDate.getFullYear())) {
				td_class="caltoday";
				}
			else {
				td_class="calmonth";
				}
			if (this.disabledWeekDays[col-1]) {
				date_class="calnotclickable";
				result += '	<TD CLASS="'+td_class+'"><SPAN CLASS="'+date_class+'">'+display_date+'</SPAN></TD>\n';
				}
			else {
				var selected_date = display_date;
				var selected_month = display_month;
				var selected_year = display_year;
				if (this.displayType=="week-end") {
					var d = new Date(selected_year,selected_month-1,selected_date,0,0,0,0);
					d.setDate(d.getDate() + (7-col));
					selected_year = d.getYear();
					if (selected_year < 1000) { selected_year += 1900; }
					selected_month = d.getMonth()+1;
					selected_date = d.getDate();
					}
				result += '	<TD CLASS="'+td_class+'"><A HREF="javascript:'+windowref+this.returnFunction+'('+selected_year+','+selected_month+','+selected_date+',\''+this.index+'\');'+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>';
		}
	var current_weekday = now.getDay();
	result += '<TR><TD COLSPAN=7 ALIGN=CENTER><IMG SRC="graypixel.gif" WIDTH=120 HEIGHT=1></TD></TR>\n';
	result += '<TR>\n';
	result += '	<TD COLSPAN=7 ALIGN=CENTER>\n';
	if (this.disabledWeekDays[current_weekday+1]) {
		result += '		<SPAN CLASS="disabledtextlink">'+this.todayText+'</SPAN>\n';
		}
	else {
		result += '		<A id="todaybutton" CLASS="textlink" HREF="javascript:'+windowref+this.returnFunction+'(\''+now.getFullYear()+'\',\''+(now.getMonth()+1)+'\',\''+now.getDate()+'\',\''+this.index+'\',\''+now.getHours()+'\',\''+now.getMinutes()+'\');'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');">'+this.todayText+'</A>\n';
		}
	result += '		<BR>\n';

	// Add time controls.
	if (this.IncludeTimes) result += '<TR><TD COLSPAN=7 ALIGN=CENTER>'+this.getTimeControls()+'</TD></TR>\n';
	result += '	</TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';

	// Common
	if (this.type == "WINDOW") {
		result += "</BODY></HTML>\n";
		}
	return result;
	}
