//This calendar is used to select available dates for the visit request.

function show_calendar(str_target, str_date) {
	var arr_months = ["January", "February", "March", "April", "May", "June",
		"July", "August", "September", "October", "November", "December"];
	var week_days = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
	var n_weekstart = 0; // day week starts from (normally 0 or 1)

	var dt_date = (str_date == null || str_date =="" ?  new Date() : str2date(str_date));
	var dt_prev_month = new Date(dt_date);
	dt_prev_month.setMonth(dt_date.getMonth()-1);
	var dt_next_month = new Date(dt_date);
	dt_next_month.setMonth(dt_date.getMonth()+1);
	var dt_firstday = new Date(dt_date);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	var dt_lastday = new Date(dt_next_month);
	dt_lastday.setDate(0);
	var dt_today = new Date();
	
	// print calendar header
	var str_buffer = new String (
		"<html>\n"+
		"<head>\n"+
		"	<title>Calendar</title>\n"+
		"</head>\n"+
		"<body bgcolor=\"White\">\n"+
		"<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n"+
		"<tr><td bgcolor=\"#000080\">\n"+
		"<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"100%\">\n"+
		"<tr>\n	<td bgcolor=\"#FFCC00\"><a href=\"javascript:window.opener.show_calendar('"+
		str_target+"', '"+ date2str(dt_prev_month)+	"');\">");

		if(!startmo(dt_date))
			str_buffer += "<img src=\"back.jpg\" width=\"19\" height=\"19\" border=\"0\""+
			" alt=\"previous month\"></a></td>\n";
		else
			str_buffer += "</td>\n";

		str_buffer += "	<td bgcolor=\"#FFCC00\" colspan=\"5\" align=\"center\">"+
		"<font color=\"#000080\" face=\"tahoma, verdana\" size=\"2\"><b>"
		+arr_months[dt_date.getMonth()]+" "+dt_date.getFullYear()+"</b></font></td>\n"+
		"	<td bgcolor=\"#FFCC00\" align=\"right\"><a href=\"javascript:window.opener.show_calendar('"
		+str_target+"', '"+date2str(dt_next_month)+"');\">";

		if(!endmo(dt_date))
			str_buffer += "<img src=\"forward.jpg\" width=\"19\" height=\"19\" border=\"0\""+
			" alt=\"next month\"></a></td>\n</tr>\n";
		else
			str_buffer += "</td>\n</tr>\n";

	var dt_current_day = new Date(dt_firstday);
	// print weekdays titles
	str_buffer += "<tr>\n";
	for (var n=0; n<7; n++)
		str_buffer += "	<td bgcolor=\"#EBEBEB\" align=\"center\">"+
		"<font color=\"#000080\" face=\"tahoma, verdana\" size=\"2\"><b>"+
		week_days[(n_weekstart+n)%7]+"</b></font></td>\n";
	// print calendar table
	str_buffer += "</tr>\n";
	while (dt_current_day.getMonth() == dt_date.getMonth() ||
		dt_current_day.getMonth() == dt_firstday.getMonth()) {
		// print row heder
		str_buffer += "<tr>\n";
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
				if (dt_current_day.getDate() == dt_today.getDate() &&
					dt_current_day.getMonth() == dt_today.getMonth() && 
					dt_current_day.getFullYear() == dt_today.getFullYear())
					// print current date
					str_buffer += "	<td bgcolor=\"#FFCC00\" align=\"right\">";
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days and blockout dates
					str_buffer += "	<td bgcolor=\"#EBEBEB\" align=\"right\">";
				else
					// print working days of current month
					str_buffer += "	<td bgcolor=\"white\" align=\"right\">";

			if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6 || blockout(dt_current_day) || dt_current_day < dt_today)
				// block weekends
				if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6 || dt_current_day.toLocaleDateString() == dt_today.toLocaleDateString())
					str_buffer += "<font color=\"black\" face=\"tahoma, verdana\" size=\"2\">";
				else
					str_buffer += "<font color=\"#FFCC00\" face=\"tahoma, verdana\" size=\"2\">";
			else
				if (dt_current_day.getMonth() == dt_date.getMonth())
					// print days of current month
						str_buffer += "<a href=\"javascript:window.opener."+str_target+
						".value='"+date2str(dt_current_day)+"'; window.close();\">"+
						"<font color=\"black\" face=\"tahoma, verdana\" size=\"2\">";
				else 
					// print days of other months
						str_buffer += "<a href=\"javascript:window.opener."+str_target+
						".value='"+date2str(dt_current_day)+"'; window.close();\">"+
						"<font color=\"gray\" face=\"tahoma, verdana\" size=\"2\">";
					str_buffer += dt_current_day.getDate()+"</font></a></td>\n";
					dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		str_buffer += "</tr>\n";
	}

	// print calendar footer
	str_buffer +=
		"<form name=\"cal\">\n"
		"</form>\n" +
		"</table>\n" +
		"</tr>\n</td>\n</table>\n" +
		"</body>\n" +
		"</html>\n";

	var vWinCal = window.open("", "Calendar", 
		"width=200,height=200,status=no,resizable=no,top=200,left=200");
	vWinCal.opener = self;
	var calc_doc = vWinCal.document;
	calc_doc.write (str_buffer);
	calc_doc.close();
}

function startmo(dt_date)
// disable the back arrow to past months
{
	dt_start_mo = new Date();
	
	if (dt_date.getMonth() == dt_start_mo.getMonth() && dt_date.getFullYear() == dt_start_mo.getFullYear())
		return true;

	return false;
}

function endmo(dt_date)
// limit the calendar to 90 days
{	
	dt_end_mo = new Date();
	dt_end_mo.setDate(dt_end_mo.getDate()+90);

	if (dt_date.getMonth() == dt_end_mo.getMonth() && dt_date.getFullYear() == dt_end_mo.getFullYear())
		return true;

	return false;
}

// date parsing and formatting routines.

function date2str (dt_date)
{
	var pick_month;
	switch (dt_date.getMonth()+1)
	{
		case 1: 
			pick_month = 'January'
		break
		case 2:
			pick_month = 'February'
		break
		case 3:
			pick_month = 'March'
		break
		case 4:
			pick_month = 'April'
		break
		case 5:
			pick_month = 'May'
		break
		case 6:
			pick_month = 'June'
		break
		case 7:
			pick_month = 'July'
		break
		case 8:
			pick_month = 'August'
		break
		case 9:
			pick_month = 'September'
		break
		case 10:
			pick_month = 'October'
		break
		case 11:
			pick_month = 'November'
		break
		case 12:
			pick_month = 'December'
	}

	var pick_day;
	switch (dt_date.getDay())
	{
		case 0: 
			pick_day = 'Sunday'
		break
		case 1:
			pick_day = 'Monday'
		break
		case 2:
			pick_day = 'Tuesday'
		break
		case 3:
			pick_day = 'Wednesday'
		break
		case 4:
			pick_day = 'Thursday'
		break
		case 5:
			pick_day = 'Friday'
		break
		case 6:
			pick_day = 'Saturday'
	}

	return (new String (pick_day + ", " + pick_month +" "+dt_date.getDate()+", "+dt_date.getFullYear()));

}

function str2date (str_date)
{
	var parse_date = str_date;
	// strip out weekday
	parse_start = parse_date.indexOf(", ")+2;
	parse_date = parse_date.substr(parse_start);
	// convert month string to number
	var parse_month;
	parse_month = parse_date.substr(0, parse_date.indexOf(" "));
	parse_date = parse_date.substr(parse_date.indexOf(" ") + 1);
			switch (parse_month)
			{
			case parse_month = 'January': 
				parse_month = 1
			break
			case parse_month = 'February':
				parse_month = 2
			break
			case parse_month = 'March':
				parse_month = 3
			break
			case parse_month = 'April':
				parse_month = 4
			break
			case parse_month = 'May':
				parse_month = 5
			break
			case parse_month = 'June':
				parse_month = 6
			break
			case parse_month = 'July':
				parse_month = 7
			break
			case parse_month = 'August':
				parse_month = 8
			break
			case parse_month = 'September':
				parse_month = 9
			break
			case parse_month = 'October':
				parse_month = 10
			break
			case parse_month = 'November':
				parse_month = 11
			break
			case parse_month = 'December':
				parse_month = 12
			}
	//parse out the day of the month
	parse_day = parse_date.substr(0, parse_date.indexOf(","));
	//parse out the year	
	parse_year = parse_date.substr(parse_date.length -4);
	//validate the date
	str_date = parse_month + "-" + parse_day + "-" + parse_year;
	var re_date = /^(\d+)\-(\d+)\-(\d+)/;
	if (!re_date.exec(str_date))
		return alert("Invalid date format: "+ str_date);
	return (new Date (RegExp.$3, RegExp.$1-1, RegExp.$2));
	
	return (new String (pick_month +" "+dt_date.getDate()+", "+dt_date.getFullYear()));

}

// this function is to block out unavailable dates.
function blockout(dt_current_day)
{
	
	block_date = (dt_current_day.getMonth()+1) + "-" + dt_current_day.getDate() + "-" + dt_current_day.getFullYear();

	switch (block_date)
	{
	
	// January

		// New Year's Day
		case (block_date = "1-2-2012"):
			return true;
		break

		// Martin Luther King Holiday (3rd Monday)
		case (block_date = "1-16-2012"): 
			return true;
		break


	// February

		// President's Day Holiday (3rd Monday)
		case (block_date = "2-20-2012"): 
			return true;
		break

	// March


	// April


	// May

		// Memorial Day Holiday (Last Monday)
		case (block_date = "5-28-2012"): 
			return true;
		break

	// June


	// July

		// Independence Day Holiday
		case (block_date = "7-4-2012"): 
			return true;
		break

	// August


	// September

		//Labor Day Holiday (1st Monday)
		case (block_date = "9-3-2012"): 
			return true;
		break

	// October

		// Native American (Columbus) Day Holiday (2nd Monday)
		case (block_date = "10-8-2012"): 
			return true;
		break

	// November

		// Veteran's Day Holiday
		case (block_date = "11-12-2012"):
			return true;
		break
		
		// per Deb (10-18-2011)
		case (block_date = "11-23-2011"):
			return true;
		break

		// Thanksgiving Holiday (4th Thursday)
		case (block_date = "11-24-2011"):
			return true;
		break

		// Thanksgiving Holiday
		case (block_date = "11-25-2011"):
			return true;
		break

		// Thanksgiving Holiday (4th Thursday)
		case (block_date = "11-22-2012"):
			return true;
		break

		// Thanksgiving Holiday
		case (block_date = "11-23-2012"):
			return true;
		break

	
	// December

		// per Deb (11-17-2011)
		case (block_date = "12-22-2011"):
			return true;
		break

		// per Deb (11-17-2011)
		case (block_date = "12-23-2011"):
			return true;
		break

		//Christmas Holiday
		case (block_date = "12-26-2011"):
			return true;
		break

		//Christmas Holiday
		case (block_date = "12-24-2012"):
			return true;
		break

		//Christmas Holiday
		case (block_date = "12-25-2012"):
			return true;
		break

	}

		return false;
}
