// Title: Timestamp picker
// 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>
// Adapt dropdown month and zear: Ivan Stojanovic <istojanovic@gmail.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

String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }

var arr_months	= ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"]; 
var week_days	= ["Sa", "Mo", "Th", "We", "Tu", "Fr", "Sa"];
var n_weekstart = 1; // day week starts from (normally 0 or 1)

function show_calendar(str_target, str_datetime, format) 
{
	str_datetime = str_datetime.trim();
	
	var dt_datetime 	= (str_datetime == null || str_datetime == "" ?  new Date() : str2dt(str_datetime, format));
	var dt_prev_year	= new Date(dt_datetime);	dt_prev_year.setMonth(dt_datetime.getMonth()-12);
	var dt_next_year	= new Date(dt_datetime);	dt_next_year.setMonth(dt_datetime.getMonth()+12);
	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);
	
	var current_day		= dt_datetime.getDate();
	var current_month	= dt_datetime.getMonth();
	var current_year	= dt_datetime.getFullYear();
		
	// 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>\n"+
		"	input	{font-family:Verdana,Arial; font-size: 9px; color:#000000; }\n"+
		"	.tdhead	{font-family:Verdana,Arial; font-size: 9px; color:#ffffff; background-color : #003366;}\n"+
		"	.tdpuscp{font-family:Verdana,Arial; font-size: 9px; color:#000000; background-color : #ffffff;}\n"+
		"	.tdsn	{font-family:Verdana,Arial; font-size: 9px; color:#000000; background-color : #DBEAF5;}\n"+
		"	.tdmark {font-family:Verdana,Arial; font-size: 9px; color:#000000; background-color : #FFB6C1;}\n"+
		"	a		{font-family:Verdana,Arial; font-size: 9px; color:#000000; }\n"+
		"	a.ostali{font-family:Verdana,Arial; font-size: 9px; color:#aaaaaa; }\n"+
		"	a.navig	{font-family:Verdana,Arial; font-size: 9px; color:#ffffff; font-weight:bold; }\n"+
		"</style>"+
		"</head>\n"+
		"<body leftmargin=0 topmargin=0 marginwidth=0 marginheight=0 onload=\"window.focus();\">\n"+
		"<table cellspacing=0 border=0 cellpaddnig=0 width=158>\n"+
		"<tr><td class=tdhead>\n"+
		"<table cellspacing=1 cellpadding=2 border=0 width=158>\n"+
		"<tr>\n"+
		"<td class=tdhead colspan=2>\n"+
		"<select name=\"monthId\" onchange=\"window.opener.show_calendar('" + str_target + "', this.value, '" + format + "');\">\n");
		
		for (var m=1; m<13; m++) {
			if (m-1 == current_month)
				str_buffer += "	<option value='" + current_day + '.' + m + "." + current_year + "' selected>" + arr_months[m-1] + "</option>\n";
			else
				str_buffer += "	<option value='" + current_day + '.' + m + "." + current_year + "'>" + arr_months[m-1] + "</option>\n";
		}
		
		str_buffer +=  "</select>\n"+
		"</td>\n"+
		"<td class=tdhead colspan=2 align=center>"+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</td>\n"+
		"<td class=tdhead colspan=3 align=right>\n"+
		"<select name=\"yearId\" onchange=\"window.opener.show_calendar('" + str_target + "', this.value, '" + format + "');\">\n";
		
		for (var y=1950; y<2051; y++) {
			if (y == current_year)
				str_buffer += "	<option value='" + current_day + '.' + (current_month+1) + "." + y + "' selected>" + y + "</option>\n";
			else
				str_buffer += "	<option value='" + current_day + '.' + (current_month+1) + "." + y + "'>" + y + "</option>\n";
		}
		
		str_buffer +=  "</select>\n"+
		"</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 class=tdhead>"+week_days[(n_weekstart+n)%7]+"</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 align=right>\n";
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
			if (dt_current_day.getMonth() == dt_datetime.getMonth()) {
			
				if (dt_current_day.getDate() == dt_datetime.getDate() && dt_current_day.getMonth() == dt_datetime.getMonth())
					// print current date
					str_buffer += "	<td class=tdmark>";
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer += "	<td class=tdsn>";
				else
					// print working days of current month
					str_buffer += "	<td class=tdpuscp>";

				// print days of current month
				str_buffer += "<a href=\"javascript:window.opener."+str_target+".value='"+dt2dtstr(dt_current_day, format)+"'; window.close();\">";
				
			} else {
				str_buffer += "	<td class=tdpuscp>";
				// print days of other months
				str_buffer += "<a href=\"javascript:window.opener."+str_target+".value='"+dt2dtstr(dt_current_day, format)+"'; window.close();\" class='ostali'>";
			}
			str_buffer += dt_current_day.getDate()+"</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" +
		"</body>\n" +
		"</html>\n";

	var vWinCal = window.open("", "Calendar", "width=165,height=150,menubar=no,status=no,location=no,toolbar=no,scrollbars=no,resizable=no,top=50,left=50");
	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, format) 
{
	switch (format) {
		case 'ddmmyyyy' :
			var re_date = /^(\d+)[\.\/\s](\d+)[\.\/\s](\d+)$/;
			if (!re_date.exec(str_datetime)) return alert("Invalid Datetime format: "+ str_datetime);
			return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1));
			break;
		case 'mmddyyyy' :
			var re_date = /^(\d+)[\.\/\s](\d+)[\.\/\s](\d+)$/;
			if (!re_date.exec(str_datetime)) return alert("Invalid Datetime format: "+ str_datetime);
			return (new Date (RegExp.$3, RegExp.$1-1, RegExp.$2));
			break;
		case 'ddmmmyyyy' :
			var re_date = /^(\d+)\.([a-zA-Z_]+)\.(\d+)$/;
			if (!re_date.exec(str_datetime)) return alert("Invalid Datetime format: "+ str_datetime);
			return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1));
			break;
		default:
			var re_date = /^(\d+)[\.\/\s](\d+)[\.\/\s](\d+)$/;
			if (!re_date.exec(str_datetime)) return alert("Invalid Datetime format: "+ str_datetime);
			return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1));
	}
	
	return new Date();
}

function dt2dtstr (dt_datetime, format) 
{
	switch (format) {
		case 'ddmmyyyy' :
			return (new String (dt_datetime.getDate()+"."+(dt_datetime.getMonth()+1)+"."+dt_datetime.getFullYear()));
			break;
		case 'mmddyyyy' :
			return (new String ((dt_datetime.getMonth()+1)+"."+dt_datetime.getDate()+"."+dt_datetime.getFullYear()));
			break;
		case 'ddmmmyyyy' :
			return (new String (dt_datetime.getDate()+" "+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()));
			break;
		default:
			return (new String (dt_datetime.getDate()+"."+(dt_datetime.getMonth()+1)+"."+dt_datetime.getFullYear()));
	}
	
	return '';
}
