// Title: Timestamp picker
// Description: See the demo at url
// URL: http://www.geocities.com/tspicker/
// Version: 1.0.a (Date selector only)
// Date: 12-12-2001 (mm-dd-yyyy)
// Author: Denis Gritcyuk <denis@softcomplex.com>; <tspicker@yahoo.com>
// Notes: Permission given to use this script in any kind of applications if
//    header lines are left unchanged. Feel free to contact the author
//    for feature requests and/or donations
//
// Modification: Dave Robertson (dave@factory44.net):  Added drop-down menus
//    for quickly changing months and years.  NS4x must reload the popup,
//    otherwise the onChange= event handler will fail.  stupid netscape.


function show_calendar(str_target, str_datetime) {
    body_color    = "#CCCCCC"
    border_color  = "#444444"
    header_color  = "#999999"
    hilite_color  = "#43D75F"
    weekend_color = "#EEEEEE"

	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)

	if (!str2dt(str_datetime) && str_datetime != "") return;
	var dt_datetime = (str_datetime == null || str_datetime =="" ?  new Date() : str2dt(str_datetime));
	var dt_prev_month = new Date(dt_datetime);
	dt_prev_month.setMonth(dt_datetime.getMonth()-1);
	var dt_next_month = new Date(dt_datetime);
	dt_next_month.setMonth(dt_datetime.getMonth()+1);
	var dt_firstday = new Date(dt_datetime);
	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);

	// html generation (feel free to tune it for your particular application)
	// print calendar header
	var str_buffer = new String (
		"<html>\n"+
		"<head>\n"+
		"	<title>Calendar</title>\n"+
		"<style>"+
		".calText { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px}"+
		"</style>"+
		"</head>\n"+
		"<body bgcolor=\"" + body_color + "\">\n"+
		"<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n"+
		"<tr><td bgcolor=\"" + border_color + "\">\n"+
		"<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"100%\">\n"+
		"<tr>\n	<td bgcolor=\"" + border_color + "\"><a href=\"javascript:window.opener.show_calendar('"+
		str_target+"', '"+ dt2dtstr(dt_prev_month)+"');\">"+
		"<img src=\"../scripts/arrow_prev.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"previous month\"></a></td>\n"+
		"	<td bgcolor=\"" + border_color + "\" colspan=\"5\" align=\"center\">"+
		"<font color=\"white\" face=\"tahoma, verdana\" size=\"2\"><b>"
		+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</b></font></td>\n"+
		"	<td bgcolor=\"" + border_color + "\" align=\"right\"><a href=\"javascript:window.opener.show_calendar('"
		+str_target+"', '"+dt2dtstr(dt_next_month)+"');\">"+
		"<img src=\"../scripts/arrow_next.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"next month\"></a></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=\"" + header_color + "\" align=\"right\">"+
		"<font color=\"black\" face=\"tahoma, verdana\" size=\"2\">"+
		week_days[(n_weekstart+n)%7]+"</font></td>\n";
	// print calendar table
	str_buffer += "</tr>\n";
	while (dt_current_day.getMonth() == dt_datetime.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_datetime.getDate() &&
					dt_current_day.getMonth() == dt_datetime.getMonth())
					// print current date
					str_buffer += "	<td bgcolor=\"" + hilite_color + "\" align=\"right\">";
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer += "	<td bgcolor=\"" + weekend_color + "\" align=\"right\">";
				else
					// print working days of current month
					str_buffer += "	<td bgcolor=\"white\" align=\"right\">";

				if (dt_current_day.getMonth() == dt_datetime.getMonth())
					// print days of current month
					str_buffer += "<a href=\"javascript:window.opener."+str_target+
					".value='"+dt2dtstr(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='"+dt2dtstr(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 +=
		"</table>\n" +
		"</tr>\n</td>\n</table>\n" +
        "<br><table width=100% border=0 cellpadding=0 cellspacing=0><tr>" +
        "<form>" +
        "<td class=calText>"+
        "<select name='jumpMonth' onChange =\"window.opener.show_calendar('"+str_target+"', this.options[this.options.selectedIndex].value + '/" + dt_datetime.getDate() + "/" + dt_datetime.getFullYear() + "'); if (document.layers) history.go(0)\" class=calText>"
        for (mi = 0; mi < arr_months.length; mi++) {
            str_buffer += "<option value='"+(mi+1)+"'"
            if (arr_months[dt_datetime.getMonth()] == arr_months[mi])
                str_buffer += " selected";
            str_buffer += ">"+arr_months[mi]+"</option>"
        }
        str_buffer += "</select></td>" +

        "<td align=right class=calText>"+
        "<select name='jumpYear' onChange =\"window.opener.show_calendar('"+str_target+"', '" + (dt_datetime.getMonth()+1) + "/" + dt_datetime.getDate() + "/' + this.options[this.options.selectedIndex].value); if (document.layers) history.go(0)\" class=calText>"
        for (yi = (dt_datetime.getFullYear() - 5); yi < (dt_datetime.getFullYear() + 6); yi++) {
            str_buffer += "<option value='" + yi + "'"
            if (yi == dt_datetime.getFullYear())
                str_buffer += " selected";
            str_buffer += ">" + yi + "</option>"
        }
        str_buffer += "</select></td>" +
        "</form>" +
        "</tr></table>" +
		"</body>\n" +
		"</html>\n";


	var vWinCal = window.open("", "Calendar",
		"width=200,height=250,status=no,resizable=yes,top=200,left=200");
	vWinCal.opener = self;
	vWinCal.focus();
	var calc_doc = vWinCal.document;
	calc_doc.write (str_buffer);
	calc_doc.close();
}
// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt (str_datetime) {
	var re_date = /^(\d+)\/(\d+)\/(\d+)$/;
	if (!re_date.exec(str_datetime) && str_datetime != "") {
		alert("Invalid Datetime format: "+ str_datetime); return false
    }

    // Patch for non-y2k compliant systems.
    var nowYear = parseInt(RegExp.$3)
    if (nowYear<50) {nowYear += 2000}
    if (nowYear<100 && nowYear>=50){nowYear += 1900}
	return (new Date (nowYear, RegExp.$1-1, RegExp.$2));
}
function dt2dtstr (dt_datetime) {
	return (new String (
			(dt_datetime.getMonth()+1)+"/"+dt_datetime.getDate()+"/"+dt_datetime.getFullYear()));
}
