/*********************************************************************
 *
 * A calculator for converting between written date/time and the
 * cocoa time since reference date
 *
 * @author : Andrew Rahn
 *
 * Copyright 2009 Andrew Rahn All Rights Reserved
 *
 ********************************************************************/

// Javascript lacks sprintf or equivalent, so this
// function provides formatted number values.
function zeroPad( value, leng )
{
	var result = "000000000000" + value;
	return result.substring( result.length - leng );
}

//--------------------------------------------------------------------

// don't allow infinite recursion should
// the browser trigger when we set the value.
var norecurse = false;
var kFileTimeRefDate = 126227808000000000;

function updateViews( cocoaSecs )
{
	if( norecurse ){ return; }
	norecurse = true;
	mydate = new Date;
	mydate.setTime( cocoaSecs * 1000 + 978307200000 );
	var myyear   = zeroPad( mydate.getUTCFullYear(), 4 );
	var mymonth  = zeroPad( mydate.getUTCMonth() + 1, 2 );
	var myday    = zeroPad( mydate.getUTCDate(), 2 );
	var myhour   = zeroPad( mydate.getUTCHours(), 2 );
	var myminute = zeroPad( mydate.getUTCMinutes(), 2 );
	var mysecond = zeroPad( mydate.getUTCSeconds(), 2 );
	
	var dateField = document.getElementById( "date" );
	var dateString = myyear + "/" + mymonth + "/" + myday;
	dateField.value = dateString;

	var timeField = document.getElementById( "time" );
	var timeString = myhour + ":" + myminute + ":" + mysecond
	timeField.value = timeString;

	var secondsField = document.getElementById( "cocoaSeconds" );
	secondsField.value = cocoaSecs;

	var filetime = Math.floor( cocoaSecs * 10000000 + kFileTimeRefDate );
	var bigPart = Math.floor( filetime / 0x100000000 );
	var lilPart = filetime % 0x100000000;
	
	var filetimeHigh = document.getElementById( "filtetimeHigh" );
	filetimeHigh.value = bigPart.toString( 16 );

	var filetimeLow = document.getElementById( "filtetimeLow" );
	filetimeLow.value = lilPart.toString( 16 );

	norecurse = false;
}

//--------------------------------------------------------------------

function fromDateTime()
{
	var dateField = document.getElementById( "date" );
	var timeField = document.getElementById( "time" );
	var datePart = /(\d{1,4})\/(\d{1,2})\/(\d{1,2})/.exec( dateField.value );
	year  = datePart[ 1 ];
	month = datePart[ 2 ] - 1;
	day   = datePart[ 3 ];
	var timePart = /(\d{1,2}):(\d{1,2}):(\d{1,2})/.exec( timeField.value );
	hour  = timePart[ 1 ];
	minute= timePart[ 2 ];
	second= timePart[ 3 ];
	var cocoaSecs = Date.UTC( year,month,day,hour,minute,second) / 1000 - 978307200; 
	
	updateViews( cocoaSecs );
}

//--------------------------------------------------------------------

function fromSeconds()
{
	var secondsField = document.getElementById( "cocoaSeconds" );
	updateViews( secondsField.value);
}

//--------------------------------------------------------------------

function fromFileTime()
{
	var low = document.getElementById( "filtetimeLow" );
	var hi = document.getElementById( "filtetimeHigh" );
	var val = parseInt( low.value, 16 ) + 0x100000000 * parseInt( hi.value, 16 );
	val = val - kFileTimeRefDate;
	val = val / 10000000;
	updateViews( val );
}

//--------------------------------------------------------------------

function initialize()
{
	today = new Date();
	utcmillisecs = today.getTime();
	updateViews( Math.floor( utcmillisecs/1000 - 978307200 ) );
}


