// Title: Timestamp picker
// Description: See the demo at url
// URL: http://us.geocities.com/tspicker/
// Script featured on: http://javascriptkit.com/script/script2/timestamp.shtml
// Version: 1.0
// Date: 12-05-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
//
// Modified by: Brennan Sellner <brennan@alumni.cmu.edu>
// Added: no time option
//	  different output methods
//	  Americanized date separator (YYYY/MM/DD)
//        blank input option
//	  Support for MM-DD-YYYY


// Alternative calls:
// show_calendar(str_date_target, str_date, book_picktime, str_time_target, str_time)
// show_calendar(str_month_target, str_month, book_picktime, str_day_target, str_day, str_year_target, str_year)
function show_calendar(str_target, str_datetime, bool_picktime) {
	var argv = show_calendar.arguments;
	var argc = argv.length;
	var str_date_target, str_time_target;
	var str_year_target, str_month_target, str_day_target;

	// argv is 0-indexed
	// Munge multiple arguments into one datetime field
	// If we have 5 arguments, we have separate date & time fields
	if(argc == 5) {
		str_datetime = str_datetime + " " + argv[4];
		str_date_target = str_target;
		str_time_target = argv[3];
	}
	// If we have 7 arguments, we have separate day, month, and year fields
	else if(argc == 7) {
		str_datetime = argv[6] + "-" + str_datetime + "-" + argv[4];
		str_year_target = argv[5];
		str_month_target = str_target;
		str_day_target = argv[3];
	}

	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 = 1; // day week starts from (normally 0 or 1)

	var dt_datetime = (str_datetime == null || str_datetime =="" || str_datetime == "0000-00-00" ?  new Date() : str2dt(str_datetime));
	if(str_datetime == null || str_datetime == "") {
		dt_datetime.setSeconds(0);
	}
	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_prev_year = new Date(dt_datetime);
	dt_prev_year.setYear(dt_datetime.getFullYear()-1);
	var dt_next_year = new Date(dt_datetime);
	dt_next_year.setYear(dt_datetime.getFullYear()+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);
	
	var str_sc_tail_py = "";
	var str_sc_tail_pm = "";
	var str_sc_tail_nm = "";
	var str_sc_tail_ny = "";
	var str_pm = "'"+ dt2dtstr(dt_prev_month)+"'+document.cal.time.value";
	var str_py = "'"+ dt2dtstr(dt_prev_year)+"'+document.cal.time.value";
	var str_nm = "'"+ dt2dtstr(dt_next_month)+"'+document.cal.time.value";
	var str_ny = "'"+ dt2dtstr(dt_next_year)+"'+document.cal.time.value";
	if(argc == 5) {
		str_sc_tail_py = ", '" + argv[3] + "', '" + argv[4] + "'";
		str_sc_tail_pm = ", '" + argv[3] + "', '" + argv[4] + "'";
		str_sc_tail_nm = ", '" + argv[3] + "', '" + argv[4] + "'";
		str_sc_tail_ny = ", '" + argv[3] + "', '" + argv[4] + "'";
		str_pm = "'"+ dt2dtstr(dt_prev_month)+"'";
		str_py = "'"+ dt2dtstr(dt_prev_year)+"'";
		str_nm = "'"+ dt2dtstr(dt_next_month)+"'";
		str_ny = "'"+ dt2dtstr(dt_next_year)+"'";
	} else if(argc == 7) {
		str_sc_tail_py = ", '" + argv[3] + "', '" + argv[4] + "', '" + argv[5] + "', '" + dt_prev_year.getFullYear() + "'";
		str_sc_tail_pm = ", '" + argv[3] + "', '" + argv[4] + "', '" + argv[5] + "', '" + dt_prev_month.getFullYear() + "'";
		str_sc_tail_nm = ", '" + argv[3] + "', '" + argv[4] + "', '" + argv[5] + "', '" + dt_next_month.getFullYear() + "'";
		str_sc_tail_ny = ", '" + argv[3] + "', '" + argv[4] + "', '" + argv[5] + "', '" + dt_next_year.getFullYear() + "'";
		str_pm = "'" + (dt_prev_month.getMonth()+1) + "'";
		str_py = "'" + (dt_prev_year.getMonth()+1) + "'";
		str_nm = "'" + (dt_next_month.getMonth()+1) + "'";
		str_ny = "'" + (dt_next_year.getMonth()+1) + "'";
	}

	// html generation (feel free to tune it for your particular application)d
	// print calendar header
	var str_buffer = new String (
		"<html>\n"+
		"<head>\n"+
		"	<title>Calendar</title>\n"+
		"</head>\n"+
		"<body bgcolor=\"#000000\">\n"+
		"<table class=\"clsOTable\" cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"100%\">\n"+
		"<tr>\n	<td bgcolor=\"#000000\">"+
		"<a href=\"javascript:window.opener.show_calendar('"+
		str_target+"', "+str_py+", "+bool_picktime+str_sc_tail_py+");\">"+
		"<img src=\"./CommonImages/prevYear.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"previous year\"></a></td>\n\t<td bgcolor=\"#000000\"><a href=\"javascript:window.opener.show_calendar('"+
		str_target+"', "+str_pm+", "+bool_picktime+str_sc_tail_pm+");\">"+
		"<img src=\"./CommonImages/prev.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"previous month\"></a></td>\n"+
		"\t<td bgcolor=\"#000000\" colspan=\"3\">"+
		"<font color=\"#FFFF22\" face=\"tahoma, verdana\" size=\"2\"><center>"
		+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</center></font></td>\n"+
		"\t<td bgcolor=\"#000000\" align=\"right\"><a href=\"javascript:window.opener.show_calendar('"
		+str_target+"', "+str_nm+", "+bool_picktime+str_sc_tail_nm+");\">"+
		"<img src=\"./CommonImages/next.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"next month\"></a></td>\n\t<td bgcolor=\"#000000\">"+
		"<a href=\"javascript:window.opener.show_calendar('"
		+str_target+"', "+str_ny+", "+bool_picktime+str_sc_tail_ny+");\">"+
		"<img src=\"./CommonImages/nextYear.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"next year\"></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=\"#666666\">"+
		"<font color=\"#FFFF00\" 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 header
		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=\"#888888\" align=\"right\">";
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer += "	<td bgcolor=\"#444444\" align=\"right\">";
				else
					// print working days of current month
					str_buffer += "	<td bgcolor=\"#333333\" align=\"right\">";

				if(argc == 5) {
					str_buffer += "<a href=\"javascript:window.opener."+str_date_target+
						".value='"+dt2dtstr(dt_current_day)+"'; "+
						"window.opener."+str_time_target+".value=document.cal.time.value; window.close();\">";
				} else if(argc == 7) {
					str_buffer += "<a href=\"javascript:"+
						"window.opener."+str_year_target+".value='"+dt_current_day.getFullYear()+"'; "+
						"window.opener."+str_month_target+".value='"+mk2dig(dt_current_day.getMonth()+1)+"'; "+
						"window.opener."+str_day_target+".value='"+mk2dig(dt_current_day.getDate())+"'; "+	
						"window.close();\">";
				} else {
					str_buffer += "<a href=\"javascript:window.opener."+str_target+
						".value='"+dt2dtstr(dt_current_day)+"'+document.cal.time.value; window.close();\">";
				}
				if (dt_current_day.getMonth() == dt_datetime.getMonth())
					// print days of current month
					str_buffer +=
					"<font color=\"#FFFF00\" face=\"tahoma, verdana\" size=\"2\">";
				else 
					// print days of other months
					str_buffer +=
					"<font color=\"AAAA00\" 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
	if(bool_picktime) {
		str_buffer +=
			"<form name=\"cal\" onSubmit=\"return false;\">\n<tr><td colspan=\"7\" bgcolor=\"#666666\">"+
			"<font color=\"#FFFF00\" face=\"tahoma, verdana\" size=\"2\">"+
			"Time: <input type=\"text\" name=\"time\" value=\""+dt2tmstr(dt_datetime)+
			"\" size=\"8\" maxlength=\"8\"></font></td></tr>\n</form>\n";
  	}
	// An empty placeholder if we're not picking time
	if(!bool_picktime) {
		str_buffer +=
			"<form name=\"cal\"><input type=\"hidden\" name=\"time\" value=\"\"></form>";
	}
	str_buffer +=
		"</table>\n</body>\n" +
		"</html>\n";

	var vWinCal;
	if(bool_picktime) {
		vWinCal = window.open("", "Calendar", 
			"width=200,height=225,status=no,resizable=yes,top=200,left=450");
	} else {
		vWinCal = window.open("", "Calendar", 
			"width=200,height=200,status=no,resizable=yes,top=200,left=450");
	}
	vWinCal.opener = self;
	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_empty = /^\s*$/;
	if(re_empty.exec(str_datetime)) {
		return (new Date());
 	}
	var re_date = /^(\d+)[\-\/](\d+)[\-\/](\d+)\s+(\d+)\:(\d+)\:(\d+)\s*$/;
	var year;
	var month;
	var day;
	var hours;
	var minutes;
	if (!re_date.exec(str_datetime)) {
		var re_date_only = /^(\d+)[\-\/](\d+)[\-\/](\d+)\s*$/;
		if(!re_date_only.exec(str_datetime)) {
			var re_date_nosec = /^(\d+)[\-\/](\d+)[\-\/](\d+)\s+(\d+)\:(\d+)\s*$/;
			if(!re_date_nosec.exec(str_datetime)) {
				return alert("Invalid Datetime format: "+ str_datetime);
			} else {
				year = RegExp.$1; month = RegExp.$2; day = RegExp.$3; hours = RegExp.$4; minutes = RegExp.$5;
			}
		} else {
			year = RegExp.$1; month = RegExp.$2; day = RegExp.$3; hours = 12; minutes = 0;
		}
	} else {
	    year = RegExp.$1; month = RegExp.$2; day = RegExp.$3; hours = RegExp.$4; minutes = RegExp.$5;
	}
	// "Cast" everything to integers
	year = year - 0; month = month - 0; day = day - 0; hours = hours - 0; minutes = minutes - 0;
	if(day > year) { // We have MM-DD-YYYY format, I think
	   var tmp = year;
	   year = day;
	   day = month;
	   month = tmp;
	}
	return (new Date (year, month - 1, day, hours, minutes, 0));
}
function dt2dtstr (dt_datetime) {
	return (new String (
			(dt_datetime.getFullYear() + "\-" + (dt_datetime.getMonth()+1)+"\-"+dt_datetime.getDate()+" ")));
}
function dt2tmstr (dt_datetime) {
	if(dt_datetime.getSeconds() != 0) {
		return (new String (
				dt_datetime.getHours()+":"+mk2dig(dt_datetime.getMinutes())+":"+mk2dig(dt_datetime.getSeconds())));
	} else {
		return (new String (
				dt_datetime.getHours()+":"+mk2dig(dt_datetime.getMinutes())));
	}
}

function mk2dig (int_number) {
	if(int_number < 10 && int_number >= 0) {
		return (new String ("0" + int_number));
	} else {
		return int_number;
	}
}

