// Copyright (C) 1998 - 2009 NICT, Hiroshi Toriyama, All Rights Reserved. 

var JSToffset = 9 * 3600000;  // JST = UTC + 9H
var Nservers = 0, Prev = 99, Loopcount = 20;
var Jdisable = 0, Interval = 100;  // Refresh every 100ms
var Server = [];
var LEAP, NEXT, SL;
var TZoffset, LocalClock, Start, Timer;
var Offset, Offset0, Offset1;

var Lang = "J";
/*
var msg = {
	E: [	"<h1>No response from time servers.<\/h1><h2>Please reload after a while.<\/h2>",
		"<h1>Some of time servers didn\'t respond.<\/h1><h2>Displayed time can be incorrect.<\/h2>",
		" correct.",
		" second(s) fast.",
		" second(s) slow." ],
	J: [	"<h1>サーバからの時刻取得に失敗しました。<\/h1><h2>少し時間がたってから再読み込みしてください。<\/h2>",
 "<h2>一部サーバからの時刻取得に失敗しました。<\/h2><h2>不正確な時刻が表示されている可能性があります。<\/h2>",
 "合っています",
 " 秒 進んでいます",
 " 秒 遅れています" ] 
};
*/
function jsont(json)
{
	if( Jdisable ) return;
	var now = new Date();
	if( json["st"] == null || json["it"] == null ) return;
	if( json["leap"] == null || json["next"] == null ) return;
	json["rt"] = now.getTime() / 1000;  // Record Receive time
	Server.push( json );
}

function addscript(url) {  // Dynamic loading of JSONP script
	var now = new Date();  // Record Initiation time
	var script     = document.createElement('script'); 
	script.type    = 'text/javascript'; 
	script.charset = 'UTF-8';
	script.src     = url + "?" + ( now.getTime() / 1000 );
	Nservers++;  // Number of servers
	document.getElementsByTagName('head')[0].appendChild(script);
}

function startclock(l) {
	if ( l == "E" ) Lang = "E";
	addscript( "http://133.243.238.242/cgi-bin/jsont" );
	addscript( "http://133.243.238.162/cgi-bin/jsont" );
	startc();
}

function stopclock() {
	if ( Timer != null ) clearInterval(Timer);
}

function errmsg(msgnum) {
	var msgbox;
	msgbox = document.getElementById( "ServerStat" );
	if ( null != msgbox )  msgbox.innerHTML = msg[Lang][msgnum];
}

/*
function showmsg() {
	var msgbox, msg;

	msg  = '<center><h3>時刻取得結果<\/h3><\/center>';
	if( Server.length > 0 ) {
		msg += 'server0: ' + Server[0]["id"] + ' , RTT = ';
		msg += Math.floor( 1000 * (Server[0]["rt"] - Server[0]["it"]) );
		msg += ' ms , (PC Clock - JST) = ' + Math.floor( - Offset0 ) + ' ms<br />';
	}
	else msg += 'server0: unavailable<br>';

	if( Server.length > 1 ) {
		msg += 'server1: ' + Server[1]["id"] + ' , RTT = ';
		msg += Math.floor( 1000 * (Server[1]["rt"] - Server[1]["it"]) );
		msg += ' ms , (PC Clock - JST) = ' + Math.floor( - Offset1 ) + ' ms<br />';
	}
	else msg += 'server1: unavailable<br>';

	msg += "取得した時刻の誤差は、上記 RTT ＋ 処理系の誤差（通常 30ms 程度）に収まると考えられます。<br />"

	msgbox = document.getElementById( "ServerStat" );
	if ( null != msgbox ) msgbox.innerHTML = msg;
}
*/

function startc() {

	if ( ( Server.length < Nservers ) && ( Loopcount-- > 0 ) ) {
		setTimeout("startc()",100);
		return;
	}
	Jdisable = 1; // No more return packets will be processed

	if ( Server.length == 0 ) {
		errmsg( 0 );
		return;
	}

	Offset0 = 1000 * Server[0]["st"] - 500 * Server[0]["it"] - 500 * Server[0]["rt"];
	Offset = Offset0;

	if ( Server.length >= 2 ) {
		Offset1 = 1000 * Server[1]["st"] - 500 * Server[1]["it"] - 500 * Server[1]["rt"];
		if( Math.abs( Offset0 - Offset1 ) < 200 ) {
			Offset = ( Offset0 + Offset1 ) / 2;
		} else {
			Server.pop();
		}
	}
	if ( Server.length == 1 ) errmsg( 1 );

	LEAP = Server[0]["leap"];  // Total leap seconds before NEXT Leap
	NEXT = Server[0]["next"];  // Next Leap (UNIX TIME)

	LocalClock = new Date();

	TZoffset = LocalClock.getTimezoneOffset() * 60000;
	if (TZoffset > 12 * 3600000) TZoffset -= ( 24 * 3600000 );

	Start = Math.floor( ( Offset + LocalClock.getTime() ) / 1000 );

	SL = LEAP;
	if ( Start >= NEXT ) SL = SL + 1;	// TAI - UTC at startup

	Timer = setInterval("showtime()", Interval);
}

function ToDateStr(t, flg)
{
	var h, m, s, YY, MM, DD;

	h = t.getUTCHours();
	m = t.getUTCMinutes();
	s = t.getUTCSeconds();
	if ( flg != 0 ) s = 60;

	if (h < 10) h = "0" + h;
	if (m < 10) m = "0" + m;
	if (s < 10) s = "0" + s;

	YY = t.getUTCFullYear();
	MM = t.getUTCMonth() + 1;
	DD = t.getUTCDate();
	if (MM < 10) MM = "0" + MM;
	if (DD < 10) DD = "0" + DD;

//	return (YY + "/" + MM + "/" + DD + " " + h + ":" + m + ":" + s);
	return (YY + "年 " + MM + "月 " + DD + "日");
}

function showtime()
{
	var now, loffset, flg, temp, sec, utcms, utcsec;
	var JST, UTC, TAI, LOC, CMP, CL;

	now = new Date();
	lofset = Offset;
	utcms = now.getTime() + Offset + Interval / 2;
	utcsec = Math.floor( utcms / 1000 );

	CL = LEAP;
	if ( utcsec >= NEXT ) CL = CL + 1;	// Current TAI - UTC
	temp = utcms - ( CL - SL ) * 1000;

	flg = 0;
	if ( utcsec == NEXT ) flg = 1;

	JST = new Date( temp + JSToffset );
	document.clock.JST.value = ToDateStr(JST, flg);
/*
	sec = Math.round( ( Offset / 1000 - ( CL - SL ) ) * 10 ) / 10;
	if( Math.abs(sec) < 0.1 ) {
		document.clock.offset.value = msg[Lang][2];
	} else {
		document.clock.offset.value = Math.abs(sec) +
			((sec < 0) ? msg[Lang][3] : msg[Lang][4]);
	}
*/
}

