// ehoo!Japan　コード。
// 現在の太陽の位置をもとに、恵方を指示するサイト。
// 恵方のアルゴリズムは http://ja.wikipedia.org/wiki/%E6%81%B5%E6%96%B9 参照のこと

//new function(){
	//5の倍数にそろえる
	function round_by_5(number){
		return Math.round(number/5)*5;
	}
	
	// (0,360)に入るように角度数字を正規化
	function angleRegularation(angle){
		while (angle > 359) { angle = angle-360; }
		while (angle < 0) { angle = angle+360; }
		return angle;
	}
	
	//今年の恵方(文字列。最近の呼び方)を取得。 
	function getCurrentEhoModernStr(today){
		var d = today || new Date();
		var y = (""+d.getFullYear()).charAt(3);
		var eho = -1;
		switch(y){
			case "4": 
			case "9": 
				eho =  "東北東";
				break;
			case "0": 
			case "5": 
				eho = "西南西";
				break;
			case "1": 
			case "6": 
			case "3": 
			case "8": 
				eho = "南南東";
				break;
			case "2": 
			case "7": 
				eho = "北北西";
				break;
		}
		return eho;
	}
	//今年の恵方(文字列。古い呼び方)を取得。 
	function getCurrentEhoAncientStr(today){
		var d = today || new Date();
		var y = (""+d.getFullYear()).charAt(3);
		var eho = -1;
		switch(y){
			case "4": 
			case "9": 
				eho =  "甲(きのえ)";
				break;
			case "0": 
			case "5": 
				eho = "庚(かのえ)";
				break;
			case "1": 
			case "6": 
			case "3": 
			case "8": 
				eho = "丙(ひのえ)";
				break;
			case "2": 
			case "7": 
				eho = "壬(みずのえ)";
				break;
		}
		return eho;
	}
	//今年の恵方(角度)を取得。 
	function getCurrentEhoAngle(today){
		var d = today || new Date();
		var y = (""+d.getFullYear()).charAt(3);
		var eho = -1;
		switch(y){
			case "4": 
			case "9": 
				eho =  75;
				break;
			case "0": 
			case "5": 
				eho = 255;
				break;
			case "1": 
			case "6": 
			case "3": 
			case "8": 
				eho = 165;
				break;
			case "2": 
			case "7": 
				eho = 345;
				break;
		}
		return eho;
	}

	//今の太陽の位置(角度)を取得。12:15に南中、一時間に15度移動と仮定して計算している。
	function getCurrentSunAngle(today){
		var d = today || new Date();//今の時刻
		var c = new Date(d); //南中時刻
		c.setHours(12);
		c.setMinutes(15);
		var diff = (d.getHours() - c.getHours())*60 + (d.getMinutes() - c.getMinutes());
		var angle = angleRegularation( 180 + (diff*15/60) );
		return angle;
	}

	function getEhoStrFromSun(angle){
		var eho ="";
		if ( angle>=(0) && angle< (0+22.5) ) {
			eho = "太陽に向かってほぼ正面";
		}else if ( angle>=(0+22.5) && angle< (45+22.5) ) {
			eho = "太陽に向かって右45度くらいの方向";
		}else if ( angle>=(45+22.5) && angle< (90+22.5) ) {
			eho = "太陽に向かって右手の方向";
		}else if ( angle>=(90+22.5) && angle< (135+22.5) ) {
			eho = "太陽に向かって右135度くらいの方向";
		}else if ( angle>=(135+22.5) && angle< (180+22.5) ) {
			eho = "太陽に背を向けた方向";
		}else if ( angle>=(180+22.5) && angle< (225+22.5) ) {
			eho = "太陽に向かって左135度くらいの方向";
		}else if ( angle>=(225+22.5) && angle< (270+22.5) ) {
			eho = "太陽に向かって左手の方向";
		}else if ( angle>=(270+22.5) && angle< (315+22.5) ) {
			eho = "太陽に向かって左に45度くらいの方向";
		}else if ( angle>=(315+22.5) && angle<= (360) ) {
			eho = "太陽に向かってほぼ正面";
		}else{
			eho = "error!";
		}
		return eho;
	}

	function getEhoImage(angle){
		var filename="image/eho_"+angle+".gif";
		return filename;
	}

	function addEvent(elm,listener,fn){
		try{
			elm.addEventListener(listener,fn,false);
		}catch(e){
			elm.attachEvent("on"+listener,fn);
		}
	}
	addEvent(window,"load",function(){ 

		//恵方(昔の言い方)
		var place_eho_ancient_name = document.getElementById("eho_ancient_name");
		//恵方(今の言い方)
		var place_eho_modern_name = document.getElementById("eho_modern_name");
		//恵方(太陽から見て？)
		var place_eho_angle_from_sun = document.getElementById("eho_angle_from_sun");
		//恵方の画像
		var place_eho_angle_image = document.getElementById("eho_angle_image");

		var today = new Date();
		var eho_angle = round_by_5( getCurrentEhoAngle(today) );
		var sun_angle = round_by_5( getCurrentSunAngle(today) );
		var eho_angle_from_sun = angleRegularation(eho_angle - sun_angle);

		place_eho_ancient_name.innerHTML = getCurrentEhoAncientStr(today);
		place_eho_modern_name.innerHTML = getCurrentEhoModernStr(today);
		place_eho_angle_from_sun.innerHTML = getEhoStrFromSun(eho_angle_from_sun);
		place_eho_angle_image.src = getEhoImage(eho_angle_from_sun);

	});
	

	//以下、単体テスト用の関数たち。
	function assert(res,expected){
		var isOK = true;
		if (res != expected) {
			alert("error. res:"+res+".expected:"+expected);
			isOK = false;
		}
		return isOK;
	}

	function test_round_by_5(){
		var noError = true;
		noError = noError && assert(round_by_5(0), 0);
		noError = noError && assert(round_by_5(1), 0);
		noError = noError && assert(round_by_5(2), 0);
		noError = noError && assert(round_by_5(3), 5);
		noError = noError && assert(round_by_5(4), 5);
		noError = noError && assert(round_by_5(5), 5);
		noError = noError && assert(round_by_5(6), 5);
		noError = noError && assert(round_by_5(7), 5);
		noError = noError && assert(round_by_5(8), 10);
		noError = noError && assert(round_by_5(9), 10);
		noError = noError && assert(round_by_5(10), 10);
		noError = noError && assert(round_by_5(11), 10);
		noError = noError && assert(round_by_5(12), 10);
		noError = noError && assert(round_by_5(13), 15);
		noError = noError && assert(round_by_5(14), 15);
		noError = noError && assert(round_by_5(15), 15);
		noError = noError && assert(round_by_5(12.2), 10);
		noError = noError && assert(round_by_5(12.4), 10);
		noError = noError && assert(round_by_5(12.6), 15);
		noError = noError && assert(round_by_5(12.6), 15);
		noError = noError && assert(round_by_5(12.5), 15);

		if(noError){
		    alert("no error.");
		}	
	}
	function test_getCurrentEhoAngle(){
		var noError = true;
		noError = noError && assert(getCurrentEhoAngle(new Date(1990,11,31)), 255);
		noError = noError && assert(getCurrentEhoAngle(new Date(1991,11,31)), 165);
		noError = noError && assert(getCurrentEhoAngle(new Date(1992,11,31)), 345);
		noError = noError && assert(getCurrentEhoAngle(new Date(1993,11,31)), 165);
		noError = noError && assert(getCurrentEhoAngle(new Date(1994,11,31)), 75);
		noError = noError && assert(getCurrentEhoAngle(new Date(1995,11,31)), 255);
		noError = noError && assert(getCurrentEhoAngle(new Date(1996,11,31)), 165);
		noError = noError && assert(getCurrentEhoAngle(new Date(1997,11,31)), 345);
		noError = noError && assert(getCurrentEhoAngle(new Date(1998,11,31)), 165);
		noError = noError && assert(getCurrentEhoAngle(new Date(1999,11,31)), 75);
		noError = noError && assert(getCurrentEhoAngle(new Date(2000,11,31)), 255);

		if(noError){
		    alert("no error.");
		}	
	}
	function test_getCurrentSunAngle(){
		//厳密に期待値を得るのは難しいけど、一日分出してみれば、おかしいかどうかは分るはず。
		var str = "<br/>";
		str = str + " 0時：" + getCurrentSunAngle(new Date(2009,2,5,0,0)) + "<br/>";
		str = str + " 1時：" + getCurrentSunAngle(new Date(2009,2,5,1,0)) + "<br/>";
		str = str + " 2時：" + getCurrentSunAngle(new Date(2009,2,5,2,0)) + "<br/>";
		str = str + " 3時：" + getCurrentSunAngle(new Date(2009,2,5,3,0)) + "<br/>";
		str = str + " 4時：" + getCurrentSunAngle(new Date(2009,2,5,4,0)) + "<br/>";
		str = str + " 5時：" + getCurrentSunAngle(new Date(2009,2,5,5,0)) + "<br/>";
		str = str + " 6時：" + getCurrentSunAngle(new Date(2009,2,5,6,0)) + "<br/>";
		str = str + " 7時：" + getCurrentSunAngle(new Date(2009,2,5,7,0)) + "<br/>";
		str = str + " 8時：" + getCurrentSunAngle(new Date(2009,2,5,8,0)) + "<br/>";
		str = str + " 9時：" + getCurrentSunAngle(new Date(2009,2,5,9,0)) + "<br/>";
		str = str + "10時：" + getCurrentSunAngle(new Date(2009,2,5,10,0)) + "<br/>";
		str = str + "11時：" + getCurrentSunAngle(new Date(2009,2,5,11,0)) + "<br/>";
		str = str + "12時：" + getCurrentSunAngle(new Date(2009,2,5,12,0)) + "<br/>";
		str = str + "13時：" + getCurrentSunAngle(new Date(2009,2,5,13,0)) + "<br/>";
		str = str + "14時：" + getCurrentSunAngle(new Date(2009,2,5,14,0)) + "<br/>";
		str = str + "15時：" + getCurrentSunAngle(new Date(2009,2,5,15,0)) + "<br/>";
		str = str + "16時：" + getCurrentSunAngle(new Date(2009,2,5,16,0)) + "<br/>";
		str = str + "17時：" + getCurrentSunAngle(new Date(2009,2,5,17,0)) + "<br/>";
		str = str + "18時：" + getCurrentSunAngle(new Date(2009,2,5,18,0)) + "<br/>";
		str = str + "19時：" + getCurrentSunAngle(new Date(2009,2,5,19,0)) + "<br/>";
		str = str + "20時：" + getCurrentSunAngle(new Date(2009,2,5,20,0)) + "<br/>";
		str = str + "21時：" + getCurrentSunAngle(new Date(2009,2,5,21,0)) + "<br/>";
		str = str + "22時：" + getCurrentSunAngle(new Date(2009,2,5,22,0)) + "<br/>";
		str = str + "23時：" + getCurrentSunAngle(new Date(2009,2,5,23,0)) + "<br/>";

		var testarea = document.getElementById("message");
		testarea.innerHTML = str;
	}
	function test_getEhoStrFromSun(){
		//一通り出してみる。
		var str = "<br/>";
		for (angle=0; angle <=360; angle++ ){
			str = str + angle + " 度：" + getEhoStrFromSun(angle) + "<br/>";
		}

		var testarea = document.getElementById("message");
		testarea.innerHTML = str;
		
	}
//}
