(function () {
/* ------------------------------------------------------------------
* 本スクリプト内でグローバルな値を格納するオブジェクトを定義
* ---------------------------------------------------------------- */
var g = new Object();

/* ------------------------------------------------------------------
* windowにloadイベントリスナーをセット
* ページが読み込まれたらinit関数が実行される。
* ---------------------------------------------------------------- */
if(window.addEventListener) {
// W3C準拠ブラウザ用
	window.addEventListener("load", init, false);
} else if(window.attachEvent) {
// Internet Explorer用
	window.attachEvent("onload", init);
}

/* ------------------------------------------------------------------
* ページがロードされた時の初期化処理
* ---------------------------------------------------------------- */
function init() {
// canvas要素のノードオブジェクト
	var canvas = document.getElementById('world_clock');

// 2Dコンテキスト
	g.ctx = canvas.getContext('2d');

// Canvasのサイズを特定
	g.w = parseInt(canvas.width);
	g.h = parseInt(canvas.height);

// Canvasの中心座標を特定
	g.x = 34;
	g.y = 147;

// 時計の半径を特定
	g.r = Math.min(g.x, g.y) * 0.9;

// 画像をロード
	setTimeout(threadStart, 1000);
}
/* ------------------------------------------------------------------
* 針描画スレッド
* ---------------------------------------------------------------- */
function threadStart() {
	clearTimeout();
	setTimeout(display, 1);
	
// Onloadから1分ごとに時計を描画
	setInterval(display, 60000);
}
/* ------------------------------------------------------------------
* 時計を描画する
* ---------------------------------------------------------------- */
function display() {
// Canvasをクリア
	g.ctx.clearRect(0, 0, g.w, g.h);
// 現在の時間
	var d = new Date();
	var year = d.getYear();
	if (year < 100) {
		year += 1900;
	}
	var h = d.getHours();
	if(h > 12) { h = h - 12; }
	var m = d.getMinutes();
	var s = d.getSeconds();

// サマータイムと時差調整（アメリカ-ワシントン）
	var hus = 0;
	var summer_startUS = getSummerStartUS(year);
	var summer_endtUS = getSummerEndUS(year);

	if((d.getTime() - 50400000) >= summer_startUS.getTime() && (d.getTime() - 50400000) < summer_endtUS.getTime()){
		hus = h - 1;
	} else {
		hus = h - 2;
	}

// サマータイムと時差調整（ドイツ）
	var hde = 0;
	var summer_startDE = getSummerStartDE(year);
	var summer_endtDE = getSummerEndDE(year);

	if((d.getTime() - 28800000) >= summer_startDE.getTime() && (d.getTime() - 28800000) < summer_endtDE.getTime()){
		if(h > 7){
			hde = h - 7;
		} else {
			hde = h + 5;
		}
	} else {
		if(h > 8){
			hde = h - 8;
		} else {
			hde = h + 4;
		}
	}

// 時差調整（香港）
	var hhk = 0;

	if(h === 0) {
		hhk = 11;
	} else {
		hhk = h - 1;
	}

	var width_tan = 3.5;
	var width_naga = 2;
	
	var length_tan = 10;
	var length_naga = 17;
	
	var color_tan = "#111111";
	var color_naga = "#555555";

// 短針を描画 日本
	var angle1 = Math.PI * 2 * ( 3 - ( h + m / 60 ) ) / 12;
	drawhand3(angle1, length_tan, width_tan, color_tan);

// 短針を描画 香港
	var angle12 = Math.PI * 2 * ( 3 - ( hhk + m / 60 ) ) / 12;
	drawhand2(angle12, length_tan, width_tan, color_tan);

// 短針を描画 ドイツ
	var angle13 = Math.PI * 2 * ( 3 - ( hde + m / 60 ) ) / 12;
	drawhand(angle13, length_tan, width_tan, color_tan);

// 短針を描画 アメリカ-ワシントン
	var angle14 = Math.PI * 2 * ( 3 - ( hus + m / 60 ) ) / 12;
	drawhand4(angle14, length_tan, width_tan, color_tan);


// 長針を描画
	var angle2 = Math.PI * 2 * ( 15 - ( m + s / 60 ) ) / 60;
	drawhand(angle2, length_naga, width_naga, color_naga);
	drawhand2(angle2, length_naga, width_naga, color_naga);
	drawhand3(angle2, length_naga, width_naga, color_naga);
	drawhand4(angle2, length_naga, width_naga, color_naga);

/*秒針を描画 
	var angle3 = Math.PI * 2 * ( 15 - s ) / 60;
	var length3 = g.r * 0.5;
	var width3 = 1;
	var color3 = "#aa0000";
	drawhand(angle3, length3, width3, color3);*/
}

/* ------------------------------------------------------------------
* 針を描画する
* ---------------------------------------------------------------- */
function drawhand(angle, len, width, color) {
// 針の先端の座標を計算
	var x = g.x + len * Math.cos(angle);
	var y = g.y - len * Math.sin(angle);

// 針を描画
	g.ctx.strokeStyle = color; /* 色をセット */
	g.ctx.lineWidth = width; /* 線の太さをセット */
	g.ctx.lineCap = "round"; /* 先端を丸くする */
	g.ctx.beginPath(); /* 直線の描画を開始 */
	g.ctx.moveTo(g.x, g.y); /* 時計の中心に移動 */
	g.ctx.lineTo(x, y);
	g.ctx.stroke();
}

function drawhand2(angle, len, width, color) {
// 針の先端の座標を計算
	var x = g.x + 58 + len * Math.cos(angle);
	var y = g.y - len * Math.sin(angle);

// 針を描画
	g.ctx.strokeStyle = color; /* 色をセット */
	g.ctx.lineWidth = width; /* 線の太さをセット */
	g.ctx.lineCap = "round"; /* 先端を丸くする */
	g.ctx.beginPath(); /* 直線の描画を開始 */
	g.ctx.moveTo(g.x+58, g.y); /* 時計の中心に移動 */
	g.ctx.lineTo(x, y);
	g.ctx.stroke();
}

function drawhand3(angle, len, width, color) {
// 針の先端の座標を計算
	var x = g.x + 116 + len * Math.cos(angle);
	var y = g.y - len * Math.sin(angle);

// 針を描画
	g.ctx.strokeStyle = color; /* 色をセット */
	g.ctx.lineWidth = width; /* 線の太さをセット */
	g.ctx.lineCap = "round"; /* 先端を丸くする */
	g.ctx.beginPath(); /* 直線の描画を開始 */
	g.ctx.moveTo(g.x + 116, g.y); /* 時計の中心に移動 */
	g.ctx.lineTo(x, y);
	g.ctx.stroke();
}

function drawhand4(angle, len, width, color) {
// 針の先端の座標を計算
	var x = g.x + 174 + len * Math.cos(angle);
	var y = g.y - len * Math.sin(angle);

// 針を描画
	g.ctx.strokeStyle = color; /* 色をセット */
	g.ctx.lineWidth = width; /* 線の太さをセット */
	g.ctx.lineCap = "round"; /* 先端を丸くする */
	g.ctx.beginPath(); /* 直線の描画を開始 */
	g.ctx.moveTo(g.x + 174, g.y); /* 時計の中心に移動 */
	g.ctx.lineTo(x, y);
	g.ctx.stroke();
}
/* ------------------------------------------------------------------
* サマータイム開始日取得
* ---------------------------------------------------------------- */
function getSummerStartDE(arg_year) {
	var dst_start = new Date(arg_year, 2, 25, 2, 0, 0);
	for (var i = 25; i <= 31; i++) {
		dst_start.setDate(i);
		if (0 == dst_start.getDay()) {
			break;
		}
	}
	return dst_start;
}

function getSummerStartUS(arg_year) {
	var dst_start = new Date(arg_year, 2, 8, 2, 0, 0);
	for (var i = 8; i <= 15; i++) {
		dst_start.setDate(i);
		if (0 == dst_start.getDay()) {
			break;
		}
	}
	return dst_start;
}
/* ------------------------------------------------------------------
* サマータイム終了日取得
* ---------------------------------------------------------------- */
function getSummerEndDE(arg_year) {
	var dst_end = new Date(arg_year,9,31,3,0,0);
	for (var i = 31; i > 24; i--) {
		dst_end.setDate(i);
		if (0 == dst_end.getDay()) {
			break;
		}
	}
	return dst_end;
}

function getSummerEndUS(arg_year) {
	var dst_end = new Date(arg_year,10,1,1,0,0);
	for (var i = 7; i > 0; i--) {
		dst_end.setDate(i);
		if (0 == dst_end.getDay()) {
			break;
		}
	}
	return dst_end;
}

})();