// 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
//
// Additional Notes: modified/redesigned for use within skOOchie by Mark Slemko 2005
// Version: 2.0
//  -- thanks to Denis for the great starting point
// changes: (There are many - so the code is quite different)
//  - improved display to use css class relations in generated html page
//  - added timezone artifacts (incomplete)
//  - improved calendar selection of days
//  - improved x-platform compatibility (incomplete I'm sure)
//  - added functionality for usage with Safari browser
//  - added drop-down time picking
//  - added 'gestured' next-day time picking
//  - improved date display to be non-ambiguous yyyy mm dd
//

// MS: browser detection... I hate this, but it seems necessary right now...
var agt = navigator.userAgent.toLowerCase();
var is_safari = (agt.indexOf("safari") > 0); 

// Global variables
var minutesSincePageLoad = 0;
var lastOpenedWindow = null;

setTimeout("minuteCounter();",60000);

function minuteCounter()
{
	minutesSincePageLoad++;
	setTimeout("minuteCounter();",60000);
}

function padout(number) { return (number < 10) ? '0' + number : number; }

//function trim(s) {
//  while (s.substring(0,1) == ' ') {
//    s = s.substring(1,s.length);
//  }
//  while (s.substring(s.length-1,s.length) == ' ') {
//    s = s.substring(0,s.length-1);
//  }
//  return s;
//}

function show_calendar(str_target, str_datetime, utc_hours, utc_minutes) {
	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 timezone = "";
	// figure out the difference in time
	
	var today = new Date();
	var hour = today.getHours();
	//var hourUTC = today.getUTCHours();
	var diff = hour - utc_hours;
	var hourdifference = Math.abs(diff);
	if (diff != 0) {
		diff = diff/(Math.abs(diff));
	}
	var minute = today.getMinutes();
	var minuteUTC = today.getUTCMinutes();
	var minutedifference;
	if (Math.abs(minute - minuteUTC) > 2 && minuteUTC < 30 && diff < 0) { hourdifference--; }
	if (Math.abs(minute - minuteUTC) > 2 && minuteUTC > 30 && diff > 0) { hourdifference--; }
	if (Math.abs(minute - minuteUTC) > 2) {
		minutedifference = "30";
	} else {
		minutedifference = "00";
	}
	if (timezone.length == 0) {
		if (hourdifference < 10) { 
			timezone = "0";
		}
		if (diff < 0) {
			timezone = "-" + timezone;
			diff = -1;
		} else {
			timezone = "+" + timezone;
			diff = 1;
		}
		timezone = timezone + hourdifference + minutedifference;
	}
	
	var dt_datetime;
	
	if (str_datetime == null || str_datetime == "") {
		var expires = new Date(); 
		expires.setTime(expires.getTime() + (1000*60*60)); // one hour
		tempDate = getCookie("last_date_set");
		if (tempDate == null || tempDate == "") {
			dt_datetime = new Date();
			dt_datetime.setMinutes(0);
		} else {
			dt_datetime = str2dt(tempDate);
			var dateArray = tempDate.split(' ');
			var zonePart = dateArray[dateArray.length-1];
			if (zonePart.length == 5 && (zonePart.slice(0,1) == '-' || zonePart.slice(0,1) == '+')) // make sure it is a zone.
			{
				timezone = zonePart;
			}
		}
		setCookie("last_date_set",dt2dtstr(dt_datetime)+" "+dt2tmstr(dt_datetime)+" "+timezone,expires);
	} else {
		dt_datetime = str2dt(str_datetime);
		var dateArray = str_datetime.split(' ');
		var zonePart = dateArray[dateArray.length-1];
		if (zonePart.length == 5 && (zonePart.slice(0,1) == '-' || zonePart.slice(0,1) == '+')) // make sure it is a zone.
		{
			timezone = zonePart;
		}
		setCookie("last_date_set",str_datetime,expires);
	}
	var daylight = (dt_datetime.getMonth()<10&&dt_datetime.getMonth()>2); // 0-11

	// adjust for delay
	utc_minutes += minutesSincePageLoad;
	while (utc_minutes > 60) {
		utc_minutes-=60;
		utc_hours++;
	}
	while (utc_hours > 23) {
		utc_hours -= 24;
	}
	
	hourdifference = timezone.slice(0,3);
	minutedifference = timezone.slice(4,5);

	var adj_hours = eval(utc_hours) + eval(hourdifference);
	while (adj_hours < 0) adj_hours += 24;
	var adj_minutes = eval(utc_minutes) + eval(minutedifference);
	while (adj_minutes > 60) adj_minutes -= 60;
	
	// setup date display	
	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 dt_tzo = timezone;
	
	// html generation (feel free to tune it for your particular application)
	// print calendar header
	var str_buffer = new String (
		"<html>\n"
		+"<head>\n"
		+"	<title>Please select a date and time.</title>\n"
		+"<script>\n"
 		+"function goprev() {\n"
		+"	window.opener.show_calendar('"+str_target+"', '"+ dt2dtstr(dt_prev_month)+"'+document.cal.hours.value+document.cal.minutes.value+' '+document.cal.zone.value,"+utc_hours+","+utc_minutes+");\n"
		+"  if (!document.all && " + !is_safari + ") {\n"
		+"	try {"
		+"			window.close();"
		+"		} catch(e) "
		+"		{alert(e)}"
		+"  }\n"
		+"}\n"
		+"function gonext() {\n"
		+"	window.opener.show_calendar('"+str_target+"', '"+dt2dtstr(dt_next_month)+"'+document.cal.hours.value+document.cal.minutes.value+' '+document.cal.zone.value,"+utc_hours+","+utc_minutes+");\n"
		+"  if (!document.all && " + !is_safari + ") {\n"
		+"	try {\n"
		+"			window.close();\n"
		+"		} catch(e) {}\n"
		+"  }\n"
		+"}\n"
		+"function ClearAllReferences() {\n"
		+"	var obj=document.getElementsByTagName('td');\n"
		+"	for (i=0; i<obj.length; i++) {\n"
		+"	  if (obj[i].className.length > 0) {\n"
		+"	    obj[i].className=obj[i].getAttribute('record');\n"
		+"	    obj[i].style.fontSize='12pt';\n"
		+"	  }\n"
		+"  }\n"
		+"}\n"
		+"function UpdateTime(change) {\n"
		+" if (change!='') {\n"
		+"	var hourdifference = change.slice(0,3);\n"
		+"	var minutedifference = change.slice(4,5);\n"
		+"  var adj_hours = "+utc_hours+" + eval(hourdifference);\n"
		+"  while (adj_hours < 0) adj_hours += 24;\n"
		+"  var adj_minutes = "+utc_minutes+" + eval(minutedifference);\n"
		+"  while (adj_minutes > 60) { adj_minutes -= 60; adj_hours++; }\n"
		+"	document.cal.servertime.value= ((adj_hours > 12) ? ((adj_hours-12) + ':' + padout(adj_minutes) + (adj_hours==24?'am':'pm')) : (adj_hours + ':' + padout(adj_minutes) + (adj_hours+12<24?'am':'pm') ));\n"
		+" } else {\n"
		+" 	document.cal.servertime.value=''+"+utc_hours+"+':'+"+utc_minutes+"\n"
		+" }\n"
		+"}\n"
		+"function padout(number) { return (number < 10) ? '0' + number : number; }\n"
		+"function nextday() {\n"
		+"	var obj=document.getElementsByTagName('td');\n"
		+"	for (i=0; i<obj.length; i++) {\n"
		+"	  if (obj[i].className.length > 0 && obj[i].className == 'weekselectedday') {\n"
		+"	    if (obj[i+1].className.length > 0) {\n"
		+"        obj[i+1].className=obj[i].className;\n"
		+"	      obj[i+1].style.fontSize=obj[i].style.fontSize;\n"
		+"	    }\n"
		+"	    obj[i].className=obj[i].getAttribute('record');\n"
		+"	    obj[i].style.fontSize='12pt';\n"
		+"      break;\n"
		+"	  }\n"
		+"  }\n"
		+"}\n"
		+"function adjustDate(change) {\n"
		+"  var hour = change.value;\n"
		+"  var day = 0;\n"
		+"  if (hour >= 24) {\n"
		+"    change.value = hour-24;\n"
		+"    day = 1*24*60*60*1000;\n"
		+"    nextday();\n"
		+"  }\n"
		+"  dateIn = document.cal.datetext.value.replace(/-/g,'/');\n"
		+"  var date = new Date(dateIn);\n"
		+"  date.setTime(date.getTime() + day);\n"
		+"  document.cal.datetext.value = date.getFullYear() + '-' + padout(date.getMonth() + 1) + '-' + padout(date.getDate());\n"
		+"}\n"
		+"function adjustZone(timezone) {\n"
		+"	var obj=document.cal.DSTime;\n"
		+"	if (obj.checked == true) {\n"
		+"		var hourdifference = timezone.slice(0,3);\n"
		+"		var minutedifference = timezone.slice(4,5);\n"
		+"		timezone='';\n"
		+"		hourdifference = eval(hourdifference) + 1;\n"
		+"		if (Math.abs(hourdifference) < 10) { \n"
		+"			timezone = '0';\n"
		+"		}\n"
		+"		if (hourdifference < 0) {\n"
		+"			timezone = '-' + timezone;\n"
		+"			diff = -1;\n"
		+"		} else {\n"
		+"			timezone = '+' + timezone;\n"
		+"			diff = 1;\n"
		+"		}\n"
		+"		timezone = timezone + Math.abs(hourdifference) + padout(minutedifference);\n"
		+"	}\n"
		+"  return timezone;\n"
		+"}\n"
		+"</script>\n"
		+"<style>\n"
		+"td { font-family:sans-serif; cursor:pointer;cursor:hand;}\n"
		+".weektoday { background-color:#FFB6C1; font-size:12pt;}\n"
		+".weekselectedday { background-color:#F8F879;font-weight:bold; font-size:12pt;}\n"
		+".weekendday { background-color:#DBEAF5; font-size:12pt;}\n"
		+".monthendday { background-color:#DBEAF5; color:gray; font-size:12pt;}\n"
		+".weekday { background-color:white; font-size:12pt;}\n"
		+".monthweekday { background-color:white; color:gray; font-size:12pt;}\n"
		+"</style>\n"
		+"</head>\n"
		+"<body bgcolor=\"White\">\n"
		+"<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\" width=\"100%\">"
		+"<tr><td bgcolor=\"#4682B4\">\n<form name=\"cal\">\n"
		+"<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"100%\">"
		+"<tr><td bgcolor=\"#4682B4\">"
		+"<img src=\"/skoochie/component/datepick/prev.gif\" width=\"16\" height=\"16\" border=\"0\" alt=\"previous month\" onclick=\"goprev();\">"
		+"</td><td bgcolor=\"#4682B4\" colspan=\"5\">"
		+"<font color=\"white\" face=\"tahoma, verdana\" style=\"font-size:13px\">"+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</font></td>"
		+"<td bgcolor=\"#4682B4\" align=\"right\">"
		+"<img src=\"/skoochie/component/datepick/next.gif\" width=\"16\" height=\"16\" border=\"0\" alt=\"next month\" onclick=\"gonext();\">"
		+"</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=\"#87CEFA\">"+
		"<font color=\"white\" face=\"tahoma, verdana\" style=\"font-size:13px\">"+
		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++) {
				today = new Date();
				if (dt_current_day.getDate() == today.getDate() &&
					dt_current_day.getMonth() == today.getMonth()
					&& !(dt_current_day.getDate() == dt_datetime.getDate() &&
					dt_current_day.getMonth() == dt_datetime.getMonth())) {
					// print current date
					str_buffer += "	<td class='weekday' record='weekday' align=\"right\" ";
				}
				else if (dt_current_day.getDate() == dt_datetime.getDate() &&
					dt_current_day.getMonth() == dt_datetime.getMonth()) {
					// print current date
					str_buffer += "	<td class='weekselectedday' ";
					if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6) {
						str_buffer += "record='weekendday' align=\"right\" ";
					} else {
						str_buffer += "record='weekday' align=\"right\" ";
					}
				}
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6) {
					// weekend days
					if (dt_current_day.getMonth() == dt_datetime.getMonth()) {
						str_buffer += "	<td class='weekendday' record='weekendday' align=\"right\" ";
					} else {
						str_buffer += "	<td class='monthendday' record='monthendday' align=\"right\" ";
					}
				} else if (dt_current_day.getMonth() == dt_datetime.getMonth()) {
					// print working days of current month
					str_buffer += "	<td class='weekday' record='weekday' align=\"right\" ";
				} else {
					// print working days of other month
					str_buffer += "	<td class='monthweekday' record='monthweekday' align=\"right\" ";
				}
				
				if (dt_current_day.getMonth() == dt_datetime.getMonth()) {
					// print days of current month
					str_buffer += " onclick=\"javascript:document.cal.datetext.value='"+dt2dtstr(dt_current_day)+"';"
					+" ClearAllReferences(); this.className='weekselectedday';\" >";
				} else {
					// print days of other months
					str_buffer += " onclick=\"javascript:document.cal.datetext.value='"+dt2dtstr(dt_current_day)+"';"
					+"ClearAllReferences(); this.className='weekselectedday';\" >";
				}
				if (dt_current_day.getDate() < 10) {
					str_buffer += "&nbsp;&nbsp;&nbsp;";
				}
				str_buffer += dt_current_day.getDate()+"</td>\n";
				dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		str_buffer += "</tr>\n";
	}
	// adjust for daylight savings
	if (daylight) {
		// cut up the timezone again...
		hourdifference = timezone.slice(0,3);
		minutedifference = timezone.slice(4,5);
		
		hourdifference = eval(hourdifference) - 1;
		if (Math.abs(hourdifference) < 10) { 
			timezone = "0";
		}
		if (hourdifference < 0) {
			timezone = "-" + timezone;
			diff = -1;
		} else {
			timezone = "+" + timezone;
			diff = 1;
		}
		timezone = timezone + Math.abs(hourdifference) + padout(minutedifference);
		
		dt_tzo = timezone;
	}
	
	// print calendar footer
	str_buffer +=
		"<tr><td colspan='7' bgcolor=\"#87CEFA\" align='center'><input type='text' name='datetext' size='10' value='"+dt2dtstr(dt_datetime)+"'>"+
		" <span style=\"font-size:13px\">@</span> <select name='hours' onchange='adjustDate(this);'>"+
			"<option value='0' " + ((dt_datetime.getHours()==0)?"selected=''":"")+ ">12am</option>" +
			"<option value='1' " + ((dt_datetime.getHours()==1)?"selected=''":"")+ ">1 am</option>" +
			"<option value='2' " + ((dt_datetime.getHours()==2)?"selected=''":"")+ ">2 am</option>" +
			"<option value='3' " + ((dt_datetime.getHours()==3)?"selected=''":"")+ ">3 am</option>" +
			"<option value='4' " + ((dt_datetime.getHours()==4)?"selected=''":"")+ ">4 am</option>" +
			"<option value='5' " + ((dt_datetime.getHours()==5)?"selected=''":"")+ ">5 am</option>" +
			"<option value='6' " + ((dt_datetime.getHours()==6)?"selected=''":"")+ ">6 am</option>" +
			"<option value='7' " + ((dt_datetime.getHours()==7)?"selected=''":"")+ ">7 am</option>" +
			"<option value='8' " + ((dt_datetime.getHours()==8)?"selected=''":"")+ ">8 am</option>" +
			"<option value='9' " + ((dt_datetime.getHours()==9)?"selected=''":"")+ ">9 am</option>" +
			"<option value='10' " + ((dt_datetime.getHours()==10)?"selected=''":"")+ ">10am</option>" +
			"<option value='11' " + ((dt_datetime.getHours()==11)?"selected=''":"")+ ">11am</option>" +
			"<option value='12' " + ((dt_datetime.getHours()==12)?"selected=''":"")+ ">12pm</option>" +
			"<option value='13' " + ((dt_datetime.getHours()==13)?"selected=''":"")+ ">1 pm</option>" +
			"<option value='14' " + ((dt_datetime.getHours()==14)?"selected=''":"")+ ">2 pm</option>" +
			"<option value='15' " + ((dt_datetime.getHours()==15)?"selected=''":"")+ ">3 pm</option>" +
			"<option value='16' " + ((dt_datetime.getHours()==16)?"selected=''":"")+ ">4 pm</option>" +
			"<option value='17' " + ((dt_datetime.getHours()==17)?"selected=''":"")+ ">5 pm</option>" +
			"<option value='18' " + ((dt_datetime.getHours()==18)?"selected=''":"")+ ">6 pm</option>" +
			"<option value='19' " + ((dt_datetime.getHours()==19)?"selected=''":"")+ ">7 pm</option>" +
			"<option value='20' " + ((dt_datetime.getHours()==20)?"selected=''":"")+ ">8 pm</option>" +
			"<option value='21' " + ((dt_datetime.getHours()==21)?"selected=''":"")+ ">9 pm</option>" +
			"<option value='22' " + ((dt_datetime.getHours()==22)?"selected=''":"")+ ">10pm</option>" +
			"<option value='23' " + ((dt_datetime.getHours()==23)?"selected=''":"")+ ">11pm</option>" +
			"<option value='24' " + ((dt_datetime.getHours()==24)?"selected=''":"")+ ">12am</option>" +
			"<option value='25' " + ((dt_datetime.getHours()==25)?"selected=''":"")+ ">1 am</option>" +
			"<option value='26' " + ((dt_datetime.getHours()==26)?"selected=''":"")+ ">2 am</option>" +
			"<option value='27' " + ((dt_datetime.getHours()==27)?"selected=''":"")+ ">3 am</option>" +
			"<option value='28' " + ((dt_datetime.getHours()==28)?"selected=''":"")+ ">4 am</option>" +
		"</select>:<select name='minutes'>"+
			"<option value=':00' " + ((dt_datetime.getMinutes()>=0)?"selected=''":"")+ ">00</option>" +
			"<option value=':05' " + ((dt_datetime.getMinutes()>=5)?"selected=''":"")+ ">05</option>" +
			"<option value=':10' " + ((dt_datetime.getMinutes()>=10)?"selected=''":"")+ ">10</option>" +
			"<option value=':15' " + ((dt_datetime.getMinutes()>=15)?"selected=''":"")+ ">15</option>" +
			"<option value=':20' " + ((dt_datetime.getMinutes()>=20)?"selected=''":"")+ ">20</option>" +
			"<option value=':25' " + ((dt_datetime.getMinutes()>=25)?"selected=''":"")+ ">25</option>" +
			"<option value=':30' " + ((dt_datetime.getMinutes()>=30)?"selected=''":"")+ ">30</option>" +
			"<option value=':35' " + ((dt_datetime.getMinutes()>=35)?"selected=''":"")+ ">35</option>" +
			"<option value=':40' " + ((dt_datetime.getMinutes()>=40)?"selected=''":"")+ ">40</option>" +
			"<option value=':45' " + ((dt_datetime.getMinutes()>=45)?"selected=''":"")+ ">45</option>" +
			"<option value=':50' " + ((dt_datetime.getMinutes()>=50)?"selected=''":"")+ ">50</option>" +
			"<option value=':55' " + ((dt_datetime.getMinutes()>=55)?"selected=''":"")+ ">55</option>" +
		"</select>"+
		"</td></tr>" +
		"<tr><td colspan=\"7\" bgcolor=\"#87CEFA\" align='center'>"+
		"<font color=\"White\" face=\"tahoma, verdana\" style=\"font-size:13px\">"+
		"<select name=\"zone\" id='zone' onChange='UpdateTime(this.value)' width='10'>"+
			"<option value='-0700'>(GMT -0700) Mountain</option>" +
			"<option value='' "+ ((dt_tzo == "+0000")?"selected=''":"") +     ">(GMT +0000) Greenwich</option>" +
			"<option value='-0330' "+ ((dt_tzo == '-0330')?"selected=''":"") +">(GMT -0330) Newfoundland</option>" +
			"<option value='-0400' "+ ((dt_tzo == '-0400')?"selected=''":"") +">(GMT -0400) Atlantic</option>" +
			"<option value='-0500' "+ ((dt_tzo == '-0500')?"selected=''":"") +">(GMT -0500) Eastern</option>" +
			"<option value='-0600' "+ ((dt_tzo == '-0600')?"selected=''":"") +">(GMT -0600) Central</option>" +
			"<option value='-0700' "+ ((dt_tzo == '-0700')?"selected=''":"") +">(GMT -0700) Mountain</option>" +
			"<option value='-0800' "+ ((dt_tzo == '-0800')?"selected=''":"") +">(GMT -0800) Pacific</option>" +
			"<option value='-0900' "+ ((dt_tzo == '-0900')?"selected=''":"") +">(GMT -0900) Alaska</option>" +
 			"<option value='-1000' "+ ((dt_tzo == '-1000')?"selected=''":"") +">(GMT -1000) Hawaii</option>" +
 			"<option value='+1000' "+ ((dt_tzo == '+1000')?"selected=''":"") +">(GMT +1000) Australian Eastern</option>" +
 			"<option value='+0930' "+ ((dt_tzo == '+0930')?"selected=''":"") +">(GMT +0930) Australian Central</option>" +
 			"<option value='+0800' "+ ((dt_tzo == '+0800')?"selected=''":"") +">(GMT +0800) Australian Western</option>" +
 			"<option value='+0530' "+ ((dt_tzo == '+0530')?"selected=''":"") +">(GMT +0530) India</option>" +
 			"<option value='+0200' "+ ((dt_tzo == '+0200')?"selected=''":"") +">(GMT +0200) Central Africa</option>" +
 		"</select>"
 		+"<br /><span style='color:black'>Observe Daylight Savings?</span><input type='checkbox' name='DSTime' id='DSTime' "+((daylight)?"checked='checked'":"")+" onclick='UpdateTime(adjustZone(document.cal.zone.value))'/>"
		+"</font></td></tr>"+
		"<tr><td colspan='7' align='center'><input type='button' value='Select' onclick=\"javascript:var dateString=document.cal.datetext.value+' '+document.cal.hours.value+document.cal.minutes.value+' '+adjustZone(document.cal.zone.value); window.opener."
			+str_target+".value=dateString;window.opener.setCookie('last_date_set',dateString);window.close();\">"
			+"&nbsp;&nbsp;&nbsp;<input type='button' value='Cancel' onclick='window.close();' />"
		+"</td></tr>\n"
		+"<tr>\n<td colspan='7'><font color=\"White\" face=\"tahoma, verdana\" style=\"font-size:13px\">"
		+"The current time in the selected time zone is about: <input readonly='true' type='text' name='servertime' size='5' value='"
		+((adj_hours >= 12) ? (((adj_hours==12)?12:adj_hours-12) + ":" + padout(adj_minutes) + "pm") : (adj_hours + ":" + padout(adj_minutes) + "am" )) +
		"'> (Match this time to your watch.)</font></td>\n</tr>\n" +
		"</table></form>\n" +
		"</td>\n</tr>\n</table>\n" +
		"</body>\n" +
		"</html>\n";

	if (lastOpenedWindow != null) 
	{
		if (!document.all && !is_safari) {
			try {
				lastOpenedWindow.close();
			} catch(e) 
			{}
		}
	}
	var features = "width=260,height=390,alwaysRaised=yes,scrollbars=no,status=no,resizable=yes,top="+(yWindow+yMousePos-150)+",left="+(xWindow+xMousePos-100);
	lastOpenedWindow = window.open("", "Calendar", features);
	lastOpenedWindow.focus();
	lastOpenedWindow.opener = self;
	var calc_doc = lastOpenedWindow.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 regexstring = "^(\\d+)[\\-/](\\d+)[\\-/](\\d+)\\s+(\\d+)\:(\\d+).*$";
	var re_date = new RegExp(regexstring);
	var success = re_date.exec(str_datetime);
	if (!success) {
		//alert("Invalid Datetime format: "+ str_datetime);
		return (new Date());
	}
	return (new Date (RegExp.$1, RegExp.$2-1, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6));
}
function dt2dtstr (dt_datetime) {
	return (new String (
			dt_datetime.getFullYear()+"-"+(((dt_datetime.getMonth())<9)?0:'')+(dt_datetime.getMonth()+1)+"-"+((dt_datetime.getDate()<10)?0:'')+dt_datetime.getDate()+" "));
//			dt_datetime.getDate()+"-"+(dt_datetime.getMonth()+1)+"-"+dt_datetime.getFullYear()+" "));
}
function dt2tmstr (dt_datetime) {
	var min = dt_datetime.getMinutes();
	return (new String (dt_datetime.getHours()+":"+((min<10)?"0":"")+min));
}

