////////////////////////////////////////////////////////////////
// 月齢ガジェット
//   Copyright (C) 2008 - 2012 AAOh inc.
////////////////////////////////////////////////////////////////

/**
 * @fileOverview 月齢ガジェット
 * @author       $Author: fujishiro $
 */

(function () {
/**
 * Main。
 *
 * @constructor
 */
moonage.Main = aaoh.kaze.Gadget.extend(
	aaoh.sora.MainEx, function() {
	this.calYear  = null;
	this.calMonth = null;

	this.fg      = null;
	this.fgToday = '#ff0000';

	this.emptyImg  = 'lib/aaoh.sora.t.png';
	this.dispTimer = new aaoh.kaze.Timer(this);

	this.tblCalAni = null;
	if (
		!aaoh.kaze.Type.isIE()
		&& !aaoh.kaze.Type.isIGoogle()
		&& !aaoh.kaze.Type.isYahoo()
	) {
		var tblCal = aaoh.kaze.Gadget.$('tblCal');
		this.tblCalAni = new aaoh.kaze.animation.FadeinAnimation(tblCal);
	}
});
	/**
	 * 空文字列の取得。
	 *
	 * @return {String} 空文字列
	 */
	moonage.Main.prototype.
	getEmpty = function() {
		var emptyValue = null;

		if (aaoh.kaze.Type.isGoogle() || aaoh.kaze.Type.isYahoo()) {
			emptyValue = '';

		} else {
			emptyValue = '&nbsp;';
		}

		return emptyValue;
	}

	/**
	 * 角度を360以内に変換します。
	 *
	 * @param  {Number} angle 角度
	 * @return {Number}       角度
	 */
	moonage.Main.prototype.
	toAngle = function(angle) {
		var angdeg = 0.0;

		if (angle >= 360.0) {
			angdeg = angle - (360.0 * Math.floor(angle / 360.0));

		} else {
			angdeg = angle;
		}

		return angdeg;
	}

	/**
	 * 角度をラジアンに変換します。
	 *
	 * @param  {Number} angle 角度
	 * @return {Number}        ラジアン値
	 */
	moonage.Main.prototype.
	toRadians = function(angle) {
		var angdeg = this.toAngle(angle);
		var rad    = angdeg * Math.PI / 180.0;

		return rad;
	}

	/**
	 * ユリウス世紀の取得。
	 *
	 * @param  {Date}   date 対象日
	 * @return {Number}      ユリウス世紀
	 */
	moonage.Main.prototype.
	getJulianGen = function(date) {
		var year   = date.getFullYear();
		var month  = date.getMonth() + 1;
		var day    = date.getDate();
		var offset = date.getTimezoneOffset() / 60;

		var yyy = year - 2000;
		var mmm = month;
		if (mmm < 3) {
			yyy = yyy - 1;
			mmm = mmm + 12;
		}

		var t = (365.0 * yyy) + (30.0 * mmm) + day - 33.5 + (offset / 24.0)
		      + Math.floor(3.0 * (mmm + 1.0) / 5.0)
		      + Math.floor(yyy / 4.0);
		var dT = (57.0 + 0.8 * (year - 1990)) / 86400.0;

		var gen = (t + dT) / 36525.0;
		return gen;
	}

	/**
	 * 月の名前の取得。
	 *
	 * @param  {Date}   date 対象日
	 * @return {String} 月の名前
	 */
	moonage.Main.prototype.
	getMoonName = function(age, date) {
		var moonName = null;

		//if (
		//	age < 1.0
		//	|| age >= aaoh.sora.App.control.MONNAGE_NEW
		//) {
		//	// 新月
		//	moonName = aaoh.sora.App.control.locale.getString('TTL_NEW');
		//} else if (
		//	age - 0.5 <= aaoh.sora.App.control.MONNAGE_WAXING
		//	&& age + 0.5 > aaoh.sora.App.control.MONNAGE_WAXING
		//) {
		//	// 上弦
		//	moonName = aaoh.sora.App.control.locale.getString('TTL_WAXING');
		//} else if (
		//	age - 0.5 <= aaoh.sora.App.control.MONNAGE_FULL
		//	&& age + 0.5 > aaoh.sora.App.control.MONNAGE_FULL
		//) {
		//	// 満月
		//	moonName = aaoh.sora.App.control.locale.getString('TTL_FULL');
		//} else if (
		//	age - 0.5 <= aaoh.sora.App.control.MONNAGE_WANING
		//	&& age + 0.5 > aaoh.sora.App.control.MONNAGE_WANING
		//) {
		//	// 下弦
		//	moonName = aaoh.sora.App.control.locale.getString('TTL_WANING');
		//} else {
		//	moonName = this.getEmpty();
		//} // if (age - 0.5 >= 0 && age - 0.5 < 1.0)

		// 黄経差の取得
		var nextDate  = new Date(date.getTime() + 86400000);
		var nowAngle  = this.calcAngle(date);
		var nextAngle = this.calcAngle(nextDate);
		if (nextAngle - nowAngle < 0.0) {
			// 新月
			moonName = aaoh.sora.App.control.locale.getString('TTL_NEW');

		} else if (nowAngle <= 90.0 && nextAngle > 90.0) {
			// 上弦
			moonName = aaoh.sora.App.control.locale.getString('TTL_WAXING');

		} else if (nowAngle <= 180 && nextAngle > 180) {
			// 満月
			moonName = aaoh.sora.App.control.locale.getString('TTL_FULL');

		} else if (nowAngle <= 270 && nextAngle > 270) {
			// 下弦
			moonName = aaoh.sora.App.control.locale.getString('TTL_WANING');

		} else {
			moonName = this.getEmpty();
		} // if (nextAngle - nowAngle < 0.0)

		return moonName;
	}

	/**
	 * 月のイメージ番号の取得。
	 *
	 * @param  {Number} age 月齢
	 * @return {Number}     イメージ番号
	 */
	moonage.Main.prototype.
	getMoonImageNumber = function(age) {
		var moonNum = 0;

		if (
			age < 1.0
			|| age + 0.5 >= aaoh.sora.App.control.MONNAGE_NEW
		) {
			// 新月
			moonNum = 0;

		} else if (
			age - 0.5 <= aaoh.sora.App.control.MONNAGE_WAXING
			&& age + 0.5 > aaoh.sora.App.control.MONNAGE_WAXING
		) {
			// 上弦
			moonNum = 4;

		} else if (
			age - 0.5 <= aaoh.sora.App.control.MONNAGE_FULL
			&& age + 0.5 > aaoh.sora.App.control.MONNAGE_FULL
		) {
			// 満月
			moonNum = 8;

		} else if (
			age - 0.5 <= aaoh.sora.App.control.MONNAGE_WANING
			&& age + 0.5 > aaoh.sora.App.control.MONNAGE_WANING
		) {
			// 下弦
			moonNum = 13;

		} else {
			moonNum = Math.round(
				age  * 17 / aaoh.sora.App.control.MONNAGE_VALUE
			);
			if (moonNum >= 17) {
				moonNum = 0;
			}

		} // if (age - 0.5 <= 0 || ...)


		return moonNum;
	}

	/**
	 * 月齢表示。
	 */
	moonage.Main.prototype.
	showMoonage = function() {
		this.dispTimer.clearTimeout();

		this.showAge();

		// 次回更新設定
		this.dispTimer.setTimeout(function() {
			aaoh.sora.App.main.showMoonage();
		}, aaoh.sora.App.control.INTERVAL);
	}

	/**
	 * 月齢表示。
	 */
	moonage.Main.prototype.
	showAge = function() {
		// 月齢計算
		var now      = new Date();
		var age      = this.calcMoonage(now);
		var moonAge  = Math.round(age * 10) / 10;
		var moonName = this.getMoonName(age, now);
		var moonNum  = this.getMoonImageNumber(age);

		moonAge = String(moonAge);
		if (moonAge.indexOf('.') < 0) {
			moonAge = moonAge + '.0';
		}

		// 月齢表示
		var lblDate     = aaoh.kaze.Gadget.$('lblDate');
		var imgMoonage  = aaoh.kaze.Gadget.$('imgMoonage');
		var lblMoonName = aaoh.kaze.Gadget.$('lblMoonName');
		var lblMoonage  = aaoh.kaze.Gadget.$('lblMoonage');

		var numMonth = now.getMonth() + 1;
		var numDate  = now.getDate();
		var numDay   = now.getDay();

		var month = null;
		var date  = null;
		var day   = null;
		if (numMonth < 10) {
			month = '0' + numMonth;
		} else {
			month = String(numMonth);
		}
		if (numDate < 10) {
			date = '0' + numDate;
		} else {
			date = String(numDate);
		}
		switch (numDay) {
			case 0: // 日
			default:
				day = aaoh.sora.App.control.locale.getString('TTL_SUN');
				break;

			case 1: // 月
				day = aaoh.sora.App.control.locale.getString('TTL_MON');
				break;

			case 2: // 火
				day = aaoh.sora.App.control.locale.getString('TTL_TUE');
				break;

			case 3: // 水
				day = aaoh.sora.App.control.locale.getString('TTL_WED');
				break;

			case 4: // 木
				day = aaoh.sora.App.control.locale.getString('TTL_THU');
				break;

			case 5: // 金
				day = aaoh.sora.App.control.locale.getString('TTL_FRI');
				break;

			case 6: // 土
				day = aaoh.sora.App.control.locale.getString('TTL_SAT');
				break;
		}

		aaoh.kaze.Element.setValue(lblDate,     month + '/' + date + ' (' + day + ')');
		aaoh.kaze.Element.setValue(lblMoonName, moonName);
		aaoh.kaze.Element.setValue(lblMoonage,  '(' + moonAge + ')');

		var align = null;
		if (moonName == '' || moonName == '&nbsp;') {
			aaoh.kaze.Element.setDisplay(lblMoonName, false);

			align = 'center';
		} else {
			aaoh.kaze.Element.setDisplay(lblMoonName, true);
			align = 'right';
		}

		// google対応
		if (aaoh.kaze.Type.isGoogle()) {
			lblMoonage.align = align;

		// yahoo対応
		} else if (aaoh.kaze.Type.isYahoo()) {
			lblMoonage.style.textAlign = align;
		}

		var type = aaoh.sora.App.model.data.type;
		var src  = 'images/moonage' + type + '-' + moonNum + '.png';
		aaoh.kaze.Element.setImage(imgMoonage, src);
		aaoh.kaze.Element.setTooltip(imgMoonage, moonAge);
	}

	/**
	 * カレンダー表示。
	 */
	moonage.Main.prototype.
	showCalender = function() {
		this.dispTimer.clearTimeout();

		// 初期設定の設定
		var date = new Date();
		this.calYear  = date.getFullYear();
		this.calMonth = date.getMonth() + 1;

		this.showMonthAge(0);

		// 次回更新設定
		this.dispTimer.setTimeout(function() {
			aaoh.sora.App.main.showCalender();
		}, aaoh.sora.App.control.INTERVAL);
	}

	/**
	 * カレンダー表示。
	 *
	 * @param {Number} sub 今月からの差
	 */
	moonage.Main.prototype.
	showMonthAge = function(sub) {
		// 日付オブジェクトの生成
		var numYear  = this.calYear;
		var numMonth = this.calMonth;
		var cal      = new Date(numYear, numMonth - 1 + sub, 1);

		// 年月の表示
		numYear  = cal.getFullYear();
		numMonth = cal.getMonth() + 1;
		this.calYear  = numYear;
		this.calMonth = numMonth;

		var year  = String(numYear);
		var month = null;
		if (numMonth < 10) {
			month = '0' + numMonth;
		} else {
			month = String(numMonth);
		}

		var lblYearMonth = aaoh.kaze.Gadget.$('lblYearMonth');
		var lblSun       = aaoh.kaze.Gadget.$('lblSun');
		var lblMon       = aaoh.kaze.Gadget.$('lblMon');
		var lblTue       = aaoh.kaze.Gadget.$('lblTue');
		var lblWed       = aaoh.kaze.Gadget.$('lblWed');
		var lblThu       = aaoh.kaze.Gadget.$('lblThu');
		var lblFri       = aaoh.kaze.Gadget.$('lblFri');
		var lblSat       = aaoh.kaze.Gadget.$('lblSat');

		var ttlYear  = aaoh.sora.App.control.locale.getString('TTL_YEAR')
		var ttlMonth = aaoh.sora.App.control.locale.getString('TTL_MONTH')
		var ttlSun   = aaoh.sora.App.control.locale.getString('TTL_SUN')
		var ttlMon   = aaoh.sora.App.control.locale.getString('TTL_MON')
		var ttlTue   = aaoh.sora.App.control.locale.getString('TTL_TUE')
		var ttlWed   = aaoh.sora.App.control.locale.getString('TTL_WED')
		var ttlThu   = aaoh.sora.App.control.locale.getString('TTL_THU')
		var ttlFri   = aaoh.sora.App.control.locale.getString('TTL_FRI')
		var ttlSat   = aaoh.sora.App.control.locale.getString('TTL_SAT')

		// google対応
		if (aaoh.kaze.Type.isGoogle()) {
			var maxLen = 5;
			var len    = (maxLen - ttlSun.length) / 2;
			for (var cnt = 0; cnt < len; cnt++) {
				ttlSun = ' ' + ttlSun;
				ttlMon = ' ' + ttlMon;
				ttlTue = ' ' + ttlTue;
				ttlWed = ' ' + ttlWed;
				ttlThu = ' ' + ttlThu;
				ttlFri = ' ' + ttlFri;
				ttlSat = ' ' + ttlSat;
			}
		}

		aaoh.kaze.Element.setValue(
			lblYearMonth, year + ttlYear + month + ttlMonth
		);
		aaoh.kaze.Element.setValue(lblSun, ttlSun);
		aaoh.kaze.Element.setValue(lblMon, ttlMon);
		aaoh.kaze.Element.setValue(lblTue, ttlTue);
		aaoh.kaze.Element.setValue(lblWed, ttlWed);
		aaoh.kaze.Element.setValue(lblThu, ttlThu);
		aaoh.kaze.Element.setValue(lblFri, ttlFri);
		aaoh.kaze.Element.setValue(lblSat, ttlSat);

		var tmpDate = new Date(cal.getTime());
		tmpDate.setMonth(tmpDate.getMonth() + 1);
		tmpDate.setTime(tmpDate.getTime() - 86400000);

		var nowDate = new Date();

		var firstDay = cal.getDay() + 1;
		var lastDate = tmpDate.getDate();
		var dateCnt  = 1;
		for (var weekCnt = 1; weekCnt <= 6; weekCnt++) {
			for (var dayCnt = 1; dayCnt <= 7; dayCnt++) {
				var date     = null;
				var today    = null;
				var moonName = null;
				var moonNum  = null;
				var moonAge  = null;

				if (
					weekCnt == 1 && dayCnt < firstDay
					|| dateCnt > lastDate
				) {
					// 空表示
					date     = this.getEmpty();
					today    = this.fg;
					moonName = '';
					moonNum  = 99;
					moonAge  = 99;

				} else {
					// 月齢計算
					date = String(dateCnt);

					// 今日の判定
					if (
						cal.getFullYear() == nowDate.getFullYear()
						&& cal.getMonth() == nowDate.getMonth()
						&& dateCnt == nowDate.getDate()
						&& aaoh.sora.App.model.data.type != '3'
					) {
						today = this.fgToday;
					} else {
						today = this.fg;
					}

					cal.setDate(dateCnt);
					var age  = this.calcMoonage(cal);
					moonAge  = Math.round(age * 10) / 10;
					moonName = this.getMoonName(age, cal);
					moonNum  = this.getMoonImageNumber(age);

					moonAge = String(moonAge);
					if (moonAge.indexOf('.') < 0) {
						moonAge = moonAge + '.0';
					}

					dateCnt++;
				}

				var lblDate
					= aaoh.kaze.Gadget.$('lblDate_' + weekCnt + '_' + dayCnt);
				var imgMoonage
					= aaoh.kaze.Gadget.$('imgMoonage_' + weekCnt + '_' + dayCnt);
				var lblMoonName
					= aaoh.kaze.Gadget.$('lblMoonName_' + weekCnt + '_' + dayCnt);
				var lblMoonage
					= aaoh.kaze.Gadget.$('lblMoonage_' + weekCnt + '_' + dayCnt);

				var type = aaoh.sora.App.model.data.type;
				var src  = 'images/moonage' + type + '-' + moonNum + '.png';
				if (moonNum == 99) {
					src = this.emptyImg;
				}

				aaoh.kaze.Element.setValue(lblDate, date);
				aaoh.kaze.Element.setForeground(lblDate, today);
				aaoh.kaze.Element.setImage(imgMoonage,  src);
				aaoh.kaze.Element.setValue(lblMoonName, moonName);

				var moonAge2 = null;
				if (moonAge < 99) {
					aaoh.kaze.Element.setTooltip(imgMoonage, moonAge);
					moonAge2 = '(' + moonAge + ')';

				} else {
					aaoh.kaze.Element.setTooltip(imgMoonage, '');
					moonAge2 = this.getEmpty();
				}
				aaoh.kaze.Element.setValue(lblMoonage, moonAge2);

			} // for (var dayCnt = 1; dayCnt <= 7; dayCnt++)
		} // for (var weekCnt = 1; weekCnt <= 5; weekCnt++)
	}

	/**
	 * 月齢計算。
	 *
	 * @param  {Date}   date 対象日
	 * @return {Number}      月齢
	 */
	moonage.Main.prototype.
	calcMoonage = function(date) {
		var age = 0;

		// 月齢 = ユリウス日 - 直近の新月
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);

		var offset     = date.getTimezoneOffset() * 60000;
		var time       = date.getTime() - offset;
		var julianDate = time / 86400000.0 + 2440587.5;

		var k       = Math.floor(
			(julianDate - 2451550.09765) / aaoh.sora.App.control.MONNAGE_VALUE
		);
		var t       = k / 1236.85;
		var newDate = 2451550.09765
			+ aaoh.sora.App.control.MONNAGE_VALUE * k
			+ 0.0001337 * t * t
			- 0.40720   * Math.sin((201.5643 + 385.8169 * k) * 0.017453292519943)
			+ 0.17241   * Math.sin((  2.5534 +  29.1054 * k) * 0.017453292519943);

		age = julianDate - newDate + 0.5 + (offset / 86400000.0);

		// 補正
		if (age > aaoh.sora.App.control.MONNAGE_VALUE) {
			age = aaoh.sora.App.control.MONNAGE_VALUE;

		} else if (age < 0) {
			age = aaoh.sora.App.control.MONNAGE_VALUE + age;
		}

		return age;
	}

	/**
	 * 黄経差の計算。
	 *
	 * @param  {Date}   date 対象日
	 * @return {Number}      黄経差
	 */
	moonage.Main.prototype.
	calcAngle = function(date) {
		var julianGen = this.getJulianGen(date);
		var moonAngle = this.calcMoonAngle(julianGen);
		var sunAngle  = this.calcSunAngle(julianGen);

		// 黄経差
		var angle = moonAngle - sunAngle;
		if (angle < 0.0) {
			angle = angle + 360.0;
		}

		return angle;
	}

	/**
	 * 月の黄経の計算。
	 *
	 * @param  {Number} gen ユリウス世紀
	 * @return {Number}    月の黄経
	 */
	moonage.Main.prototype.
	calcMoonAngle = function(gen) {
		var rad = 0.0;

		rad = rad + 0.0003 * Math.cos(this.toRadians( 191.00 + 2322131.00 * gen ));
		rad = rad + 0.0003 * Math.cos(this.toRadians(  70.00 +    4067.00 * gen ));
		rad = rad + 0.0003 * Math.cos(this.toRadians( 220.00 +  549197.00 * gen ));
		rad = rad + 0.0003 * Math.cos(this.toRadians(  58.00 + 1808933.00 * gen ));
		rad = rad + 0.0003 * Math.cos(this.toRadians( 337.00 +  349472.00 * gen ));
		rad = rad + 0.0003 * Math.cos(this.toRadians( 354.00 +  381404.00 * gen ));
		rad = rad + 0.0003 * Math.cos(this.toRadians( 340.00 +  958465.00 * gen ));
		rad = rad + 0.0004 * Math.cos(this.toRadians( 187.00 +   12006.00 * gen ));
		rad = rad + 0.0004 * Math.cos(this.toRadians( 223.00 +   39871.00 * gen ));
		rad = rad + 0.0005 * Math.cos(this.toRadians( 242.00 +  509131.00 * gen ));
		rad = rad + 0.0005 * Math.cos(this.toRadians(  24.00 + 1745069.00 * gen ));
		rad = rad + 0.0005 * Math.cos(this.toRadians(  90.00 + 1908795.00 * gen ));
		rad = rad + 0.0006 * Math.cos(this.toRadians( 156.00 + 2258267.00 * gen ));
		rad = rad + 0.0006 * Math.cos(this.toRadians(  38.00 +  111869.00 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians( 127.00 +   27864.00 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians( 186.00 +  485333.00 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians(  50.00 +  405201.00 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians( 114.00 +  790672.00 * gen ));
		rad = rad + 0.0008 * Math.cos(this.toRadians(  98.00 + 1403732.00 * gen ));
		rad = rad + 0.0009 * Math.cos(this.toRadians( 129.00 +  858602.00 * gen ));
		rad = rad + 0.0011 * Math.cos(this.toRadians( 186.00 + 1920802.00 * gen ));
		rad = rad + 0.0012 * Math.cos(this.toRadians( 249.00 + 1267871.00 * gen ));
		rad = rad + 0.0016 * Math.cos(this.toRadians( 152.00 + 1856938.00 * gen ));
		rad = rad + 0.0018 * Math.cos(this.toRadians( 274.00 +  401329.00 * gen ));
		rad = rad + 0.0021 * Math.cos(this.toRadians(  16.00 +  341337.00 * gen ));
		rad = rad + 0.0021 * Math.cos(this.toRadians(  85.00 +   71998.00 * gen ));
		rad = rad + 0.0021 * Math.cos(this.toRadians( 357.00 +  990397.00 * gen ));
		rad = rad + 0.0022 * Math.cos(this.toRadians( 151.00 +  818536.00 * gen ));
		rad = rad + 0.0023 * Math.cos(this.toRadians( 163.00 +  922466.00 * gen ));
		rad = rad + 0.0024 * Math.cos(this.toRadians( 122.00 +   99863.00 * gen ));
		rad = rad + 0.0026 * Math.cos(this.toRadians(  17.00 + 1379739.00 * gen ));
		rad = rad + 0.0027 * Math.cos(this.toRadians( 182.00 +  918399.00 * gen ));
		rad = rad + 0.0028 * Math.cos(this.toRadians( 145.00 +    1934.00 * gen ));
		rad = rad + 0.0037 * Math.cos(this.toRadians( 259.00 +  541062.00 * gen ));
		rad = rad + 0.0038 * Math.cos(this.toRadians(  21.00 + 1781068.00 * gen ));
		rad = rad + 0.0040 * Math.cos(this.toRadians(  29.00 +     133.00 * gen ));
		rad = rad + 0.0040 * Math.cos(this.toRadians(  56.00 + 1844932.00 * gen ));
		rad = rad + 0.0040 * Math.cos(this.toRadians( 283.00 + 1331734.00 * gen ));
		rad = rad + 0.0050 * Math.cos(this.toRadians( 205.00 +  481266.00 * gen ));
		rad = rad + 0.0052 * Math.cos(this.toRadians( 107.00 +   31932.00 * gen ));
		rad = rad + 0.0068 * Math.cos(this.toRadians( 323.00 +  926533.00 * gen ));
		rad = rad + 0.0079 * Math.cos(this.toRadians( 188.00 +  449334.00 * gen ));
		rad = rad + 0.0085 * Math.cos(this.toRadians( 111.00 +  826671.00 * gen ));
		rad = rad + 0.0100 * Math.cos(this.toRadians( 315.00 + 1431597.00 * gen ));
		rad = rad + 0.0107 * Math.cos(this.toRadians( 246.00 + 1303870.00 * gen ));
		rad = rad + 0.0110 * Math.cos(this.toRadians( 142.00 +  489205.00 * gen ));
		rad = rad + 0.0125 * Math.cos(this.toRadians(  52.00 + 1443603.00 * gen ));
		rad = rad + 0.0154 * Math.cos(this.toRadians(  41.00 +   75870.00 * gen ));
		rad = rad + 0.0304 * Math.cos(this.toRadians( 222.50 +  513197.90 * gen ));
		rad = rad + 0.0347 * Math.cos(this.toRadians(  27.90 +  445267.10 * gen ));
		rad = rad + 0.0409 * Math.cos(this.toRadians(  47.40 +  441199.80 * gen ));
		rad = rad + 0.0458 * Math.cos(this.toRadians( 148.20 +  854535.20 * gen ));
		rad = rad + 0.0533 * Math.cos(this.toRadians( 280.70 + 1367733.10 * gen ));
		rad = rad + 0.0571 * Math.cos(this.toRadians(  13.20 +  377336.30 * gen ));
		rad = rad + 0.0588 * Math.cos(this.toRadians( 124.20 +   63863.50 * gen ));
		rad = rad + 0.1144 * Math.cos(this.toRadians( 276.50 +  966404.00 * gen ));
		rad = rad + 0.1851 * Math.cos(this.toRadians(  87.53 +   35999.05 * gen ));
		rad = rad + 0.2136 * Math.cos(this.toRadians( 179.93 +  954397.74 * gen ));
		rad = rad + 0.6583 * Math.cos(this.toRadians( 145.70 +  890534.22 * gen ));
		rad = rad + 1.2740 * Math.cos(this.toRadians(  10.74 +  413335.35 * gen ));
		rad = rad + 6.2888 * Math.cos(this.toRadians(  44.963 + 477198.868 * gen ));
		rad = rad + this.toAngle( 218.3162 + 481267.8809 * gen );

		return rad;
	}

	/**
	 * 太陽の黄経の計算。
	 *
	 * @param  {Number} gen ユリウス世紀
	 * @return {Number}     太陽の黄経
	 */
	moonage.Main.prototype.
	calcSunAngle = function(gen) {
		var rad = 0.0;

		rad = rad + 0.0004 * Math.cos(this.toRadians( 161.0 +  31557.0 * gen ));
		rad = rad + 0.0004 * Math.cos(this.toRadians(  48.0 +  29930.0 * gen ));
		rad = rad + 0.0005 * Math.cos(this.toRadians( 221.0 +   2281.0 * gen ));
		rad = rad + 0.0005 * Math.cos(this.toRadians( 118.0 +    155.0 * gen ));
		rad = rad + 0.0006 * Math.cos(this.toRadians( 316.0 +  33718.0 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians(  64.0 +   9038.0 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians( 110.0 +   3035.0 * gen ));
		rad = rad + 0.0007 * Math.cos(this.toRadians(  45.0 +  65929.0 * gen ));
		rad = rad + 0.0013 * Math.cos(this.toRadians( 352.0 +  22519.0 * gen ));
		rad = rad + 0.0015 * Math.cos(this.toRadians( 254.0 +  45038.0 * gen ));
		rad = rad + 0.0018 * Math.cos(this.toRadians( 208.0 + 445267.0 * gen ));
		rad = rad + 0.0018 * Math.cos(this.toRadians( 159.0 +     19.0 * gen ));
		rad = rad + 0.0020 * Math.cos(this.toRadians( 158.0 +  32964.0 * gen ));
		rad = rad + 0.0200 * Math.cos(this.toRadians( 265.1 +  71998.1 * gen ));
		rad = rad - 0.0048 * gen * Math.cos(this.toRadians( 267.520 + 35999.050 * gen ));
		rad = rad + 1.9147 * Math.cos(this.toRadians( 267.520 + 35999.050 * gen ));
		rad = rad + this.toAngle( 280.4659 + 36000.7695 * gen );

		return rad;
	}

	/**
	 * フォーカス設定。
	 */
	moonage.Main.prototype.
	setFocus = function() {
		// 特になし
	}

	/**
	 * 表示データの初期化。
	 */
	moonage.Main.prototype.
	initData = function() {
		// デフォルト値の更新
		var flgOnDock = aaoh.sora.App.control.flgOnDock;
		var type      = aaoh.sora.App.model.data.type;

		this.initToolbarData(type);

		if (flgOnDock) {
			var main    = aaoh.kaze.Gadget.$('onDock');
			var srcMain = null;
			if (aaoh.kaze.Type.isSidebar()) {
				srcMain = 'lib/aaoh.sora.t.png';

			} else {
				srcMain = 'images/moonage' + type + '-base.png';
			}
			// IE6では入れ子透過PNG対応しない
			aaoh.kaze.Element.setBackgroundImage(main, srcMain, false);

			// 透過PNG対応
			if (aaoh.kaze.Type.isSidebar()) {
				var sidebarImgBg    = aaoh.kaze.Gadget.$('sidebarImgBg');
				var srcSidebarImgBg = 'images/moonage' + type + '-base_sidebar.png';

				sidebarImgBg.style.width
					= aaoh.sora.App.control.WINDOW_ONDOCK_WIDTH + 'px';
				sidebarImgBg.style.height
					= aaoh.sora.App.control.WINDOW_ONDOCK_HEIGHT + 'px';
				aaoh.kaze.Element.setImage(sidebarImgBg, srcSidebarImgBg);
			}

			this.initMoonageData(type);

			this.showMoonage();

		} else {
			var main    = aaoh.kaze.Gadget.$('unDock');
			var srcMain = null;
			if (aaoh.kaze.Type.isSidebar()) {
				srcMain = 'lib/aaoh.sora.t.png';

			} else {
				srcMain = 'images/moonage' + type + '-undock.png';
			}
			// IE6では入れ子透過PNG対応しない
			aaoh.kaze.Element.setBackgroundImage(main, srcMain, false);

			// 透過PNG対応
			if (aaoh.kaze.Type.isSidebar()) {
				var sidebarImgBg    = aaoh.kaze.Gadget.$('sidebarImgBg');
				var srcSidebarImgBg = 'images/moonage' + type + '-undock_sidebar.png';

				sidebarImgBg.style.width
					= aaoh.sora.App.control.WINDOW_UNDOCK_WIDTH + 'px';
				sidebarImgBg.style.height
					= aaoh.sora.App.control.WINDOW_UNDOCK_HEIGHT + 'px';
				aaoh.kaze.Element.setImage(sidebarImgBg, srcSidebarImgBg);
			}

			this.initUnDockData(type);

			this.showCalender();
		}

		//this.dispTimer.setTimeout(function() {
		//	aaoh.sora.App.main.setFocus();
		//}, 200);
	}

	/**
	 * 表示データの初期化。
	 *
	 * @param {String} type 表示タイプ
	 */
	moonage.Main.prototype.
	initToolbarData = function(type) {
		var btnMax    = aaoh.kaze.Gadget.$('btnMax');
		var btnOption = aaoh.kaze.Gadget.$('btnOption');
		var btnClose  = aaoh.kaze.Gadget.$('btnClose');
		if (btnOption == null || btnClose == null) {
			return;
		}

		var srcBtnMaxUp      = null;
		var srcBtnMaxOver    = null;
		var srcBtnMaxDown    = null;
		var srcBtnOptionUp   = null;
		var srcBtnOptionOver = null;
		var srcBtnOptionDown = null;
		var srcBtnCloseUp    = null;
		var srcBtnCloseOver  = null;
		var srcBtnCloseDown  = null;
		if (!aaoh.kaze.Type.isGoogle() && !aaoh.kaze.Type.isIE()) {
			srcBtnMaxUp    = 'images/moonage' + type + '-max.png';
			srcBtnOptionUp = 'images/moonage' + type + '-option.png';
			srcBtnCloseUp  = 'images/moonage' + type + '-close.png';

		} else {
			srcBtnMaxUp    = 'sub-images/moonage' + type + '-max_up.png';
			srcBtnOptionUp = 'sub-images/moonage' + type + '-option_up.png';
			srcBtnCloseUp  = 'sub-images/moonage' + type + '-close_up.png';
		}
		srcBtnMaxOver    = 'sub-images/moonage' + type + '-max_over.png';
		srcBtnMaxDown    = 'sub-images/moonage' + type + '-max_down.png';
		srcBtnOptionOver = 'sub-images/moonage' + type + '-option_over.png';
		srcBtnOptionDown = 'sub-images/moonage' + type + '-option_down.png';
		srcBtnCloseOver  = 'sub-images/moonage' + type + '-close_over.png';
		srcBtnCloseDown  = 'sub-images/moonage' + type + '-close_down.png';

		aaoh.kaze.Element.setBackgroundImage(
			btnMax, srcBtnMaxUp, srcBtnMaxOver, srcBtnMaxDown
		);
		aaoh.kaze.Element.setBackgroundImage(
			btnOption, srcBtnOptionUp, srcBtnOptionOver, srcBtnOptionDown
		);
		aaoh.kaze.Element.setBackgroundImage(
			btnClose, srcBtnCloseUp, srcBtnCloseOver, srcBtnCloseDown
		);
	}

	/**
	 * 表示データの初期化。
	 *
	 * @param {String} type 表示タイプ
	 */
	moonage.Main.prototype.
	initMoonageData = function(type) {
		var lblDate     = aaoh.kaze.Gadget.$('lblDate');
		var lblMoonName = aaoh.kaze.Gadget.$('lblMoonName');
		var lblMoonage  = aaoh.kaze.Gadget.$('lblMoonage');

		var fgColor = null;
		//var bgColor = null;
		switch (type) {
			default:
			case '1':
				fgColor = '#7f7f7f';
				//bgColor = '#ffffff';
				break;

			case '2':
				fgColor = '#ffffff';
				//bgColor = '#000000';
				break;

			case '3':
				fgColor = '#ffffff';
				//bgColor = '#ff0000';
				break;
		}

		aaoh.kaze.Element.setForeground(lblDate,     fgColor);
		aaoh.kaze.Element.setForeground(lblMoonName, fgColor);
		aaoh.kaze.Element.setForeground(lblMoonage,  fgColor);
	}

	/**
	 * 表示データの初期化。
	 *
	 * @param {String} type 表示タイプ
	 */
	moonage.Main.prototype.
	initUnDockData = function(type) {
		var btnPre       = aaoh.kaze.Gadget.$('btnPre');
		var lblYearMonth = aaoh.kaze.Gadget.$('lblYearMonth');
		var btnNext      = aaoh.kaze.Gadget.$('btnNext');
		var tblCal       = aaoh.kaze.Gadget.$('tblCal');
		var lblSun       = aaoh.kaze.Gadget.$('lblSun');
		var lblMon       = aaoh.kaze.Gadget.$('lblMon');
		var lblTue       = aaoh.kaze.Gadget.$('lblTue');
		var lblWed       = aaoh.kaze.Gadget.$('lblWed');
		var lblThu       = aaoh.kaze.Gadget.$('lblThu');
		var lblFri       = aaoh.kaze.Gadget.$('lblFri');
		var lblSat       = aaoh.kaze.Gadget.$('lblSat');

		var lstCell        = new Array();
		//var lstLblDate     = new Array();
		var lstLblMoonName = new Array();
		var lstLblMoonage  = new Array();

		for (var weekCnt = 1; weekCnt <= 6; weekCnt++) {
			for (var dayCnt = 1; dayCnt <= 7; dayCnt++) {
				var cell
					= aaoh.kaze.Gadget.$('cell_' + weekCnt + '_' + dayCnt);
				//var lblDate
				//	= aaoh.kaze.Gadget.$('lblDate_' + weekCnt + '_' + dayCnt);
				var lblMoonName
					= aaoh.kaze.Gadget.$('lblMoonName_' + weekCnt + '_' + dayCnt);
				var lblMoonage
					= aaoh.kaze.Gadget.$('lblMoonage_' + weekCnt + '_' + dayCnt);

				lstCell.push(cell);
				//lstLblDate.push(lblDate);
				lstLblMoonName.push(lblMoonName);
				lstLblMoonage.push(lblMoonage);
			} // for (var dayCnt = 1; dayCnt <= 7; dayCnt++)
		} // for (var weekCnt = 1; weekCnt <= 5; weekCnt++)

		var fgColor     = null;
		var bgDayColor1 = null;
		var bgDayColor2 = null;
		var bgDayColor3 = null;
		var borderColor = null;
		var borderImg   = null;
		switch (type) {
			default:
			case '1':
				fgColor     = '#7f7f7f';
				bgDayColor1 = '#f5e3e3';
				bgDayColor2 = '#ececec';
				bgDayColor3 = '#dfdff3';
				borderColor = '#b4b4b4';
				borderImg   = 'sub-images/line-bottom.png';
				break;

			case '2':
				fgColor     = '#ffffff';
				bgDayColor1 = '#7e7e7e';
				bgDayColor2 = '#333333';
				bgDayColor3 = '#24364c';
				borderColor = '#464646';
				borderImg   = 'sub-images/line-top.png';
				break;

			case '3':
				fgColor     = '#ffffff';
				bgDayColor1 = '#ba0000';
				bgDayColor2 = '#d21313';
				bgDayColor3 = '#ba0000';
				borderColor = '#464646';
				borderImg   = 'sub-images/line-top.png';
				break;
		}

		aaoh.kaze.Element.setForeground(lblYearMonth, fgColor);
		aaoh.kaze.Element.setForeground(lblSun,       fgColor);
		aaoh.kaze.Element.setForeground(lblMon,       fgColor);
		aaoh.kaze.Element.setForeground(lblTue,       fgColor);
		aaoh.kaze.Element.setForeground(lblWed,       fgColor);
		aaoh.kaze.Element.setForeground(lblThu,       fgColor);
		aaoh.kaze.Element.setForeground(lblFri,       fgColor);
		aaoh.kaze.Element.setForeground(lblSat,       fgColor);
		aaoh.kaze.Element.setBackground(lblSun,       bgDayColor1);
		aaoh.kaze.Element.setBackground(lblMon,       bgDayColor2);
		aaoh.kaze.Element.setBackground(lblTue,       bgDayColor2);
		aaoh.kaze.Element.setBackground(lblWed,       bgDayColor2);
		aaoh.kaze.Element.setBackground(lblThu,       bgDayColor2);
		aaoh.kaze.Element.setBackground(lblFri,       bgDayColor2);
		aaoh.kaze.Element.setBackground(lblSat,       bgDayColor3);
		//for (var cnt = 0; cnt < lstLblDate.length; cnt++) {
		//	var lblDate = lstLblDate[cnt];
		//	aaoh.kaze.Element.setForeground(lblDate, fgColor);
		//}
		for (var cnt = 0; cnt < lstLblMoonName.length; cnt++) {
			var lblMoonName = lstLblMoonName[cnt];
			aaoh.kaze.Element.setForeground(lblMoonName, fgColor);
		}
		for (var cnt = 0; cnt < lstLblMoonage.length; cnt++) {
			var lblMoonage = lstLblMoonage[cnt];
			aaoh.kaze.Element.setForeground(lblMoonage, fgColor);
		}

		if (aaoh.kaze.Type.isGoogle() || aaoh.kaze.Type.isYahoo()) {
			var lnRow1 = aaoh.kaze.Gadget.$('lnRow1');
			var lnRow2 = aaoh.kaze.Gadget.$('lnRow2');
			var lnRow3 = aaoh.kaze.Gadget.$('lnRow3');
			var lnRow4 = aaoh.kaze.Gadget.$('lnRow4');
			var lnRow5 = aaoh.kaze.Gadget.$('lnRow5');
			var lnRow6 = aaoh.kaze.Gadget.$('lnRow6');
			var lnRow7 = aaoh.kaze.Gadget.$('lnRow7');
			var lnRow8 = aaoh.kaze.Gadget.$('lnRow8');
			var lnCol1 = aaoh.kaze.Gadget.$('lnCol1');
			var lnCol2 = aaoh.kaze.Gadget.$('lnCol2');
			var lnCol3 = aaoh.kaze.Gadget.$('lnCol3');
			var lnCol4 = aaoh.kaze.Gadget.$('lnCol4');
			var lnCol5 = aaoh.kaze.Gadget.$('lnCol5');
			var lnCol6 = aaoh.kaze.Gadget.$('lnCol6');
			var lnCol7 = aaoh.kaze.Gadget.$('lnCol7');
			var lnCol8 = aaoh.kaze.Gadget.$('lnCol8');

			aaoh.kaze.Element.setImage(lnRow1, borderImg);
			aaoh.kaze.Element.setImage(lnRow2, borderImg);
			aaoh.kaze.Element.setImage(lnRow3, borderImg);
			aaoh.kaze.Element.setImage(lnRow4, borderImg);
			aaoh.kaze.Element.setImage(lnRow5, borderImg);
			aaoh.kaze.Element.setImage(lnRow6, borderImg);
			aaoh.kaze.Element.setImage(lnRow7, borderImg);
			aaoh.kaze.Element.setImage(lnRow8, borderImg);
			aaoh.kaze.Element.setImage(lnCol1, borderImg);
			aaoh.kaze.Element.setImage(lnCol2, borderImg);
			aaoh.kaze.Element.setImage(lnCol3, borderImg);
			aaoh.kaze.Element.setImage(lnCol4, borderImg);
			aaoh.kaze.Element.setImage(lnCol5, borderImg);
			aaoh.kaze.Element.setImage(lnCol6, borderImg);
			aaoh.kaze.Element.setImage(lnCol7, borderImg);
			aaoh.kaze.Element.setImage(lnCol8, borderImg);

		} else {
			aaoh.kaze.Element.setBorderColor(tblCal,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblYearMonth, borderColor);
			aaoh.kaze.Element.setBorderColor(lblSun,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblMon,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblTue,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblWed,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblThu,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblFri,       borderColor);
			aaoh.kaze.Element.setBorderColor(lblSat,       borderColor);
			for (var cnt = 0; cnt < lstCell.length; cnt++) {
				var cell = lstCell[cnt];
				aaoh.kaze.Element.setBorderColor(cell, borderColor);
			}
		}

		var srcBtnPreUp    = null;
		var srcBtnPreOver  = null;
		var srcBtnPreDown  = null;
		var srcBtnNextUp   = null;
		var srcBtnNextOver = null;
		var srcBtnNextDown = null;
		var srcCell        = 'images/moonage' + type + '-cell.png';;
		if (!aaoh.kaze.Type.isGoogle() && !aaoh.kaze.Type.isIE()) {
			srcBtnPreUp  = 'images/moonage' + type + '-allow-left.png';
			srcBtnNextUp = 'images/moonage' + type + '-allow-right.png';

		} else {
			srcBtnPreUp  = 'sub-images/moonage' + type + '-allow-left_up.png';
			srcBtnNextUp = 'sub-images/moonage' + type + '-allow-right_up.png';
		}
		srcBtnPreOver  = 'sub-images/moonage' + type + '-allow-left_over.png';
		srcBtnPreDown  = 'sub-images/moonage' + type + '-allow-left_down.png';
		srcBtnNextOver = 'sub-images/moonage' + type + '-allow-right_over.png';
		srcBtnNextDown = 'sub-images/moonage' + type + '-allow-right_down.png';

		aaoh.kaze.Element.setBackgroundImage(
			btnPre, srcBtnPreUp, srcBtnPreOver, srcBtnPreDown
		);
		aaoh.kaze.Element.setBackgroundImage(
			btnNext, srcBtnNextUp, srcBtnNextOver, srcBtnNextDown
		);
		for (var cnt = 0; cnt < lstCell.length; cnt++) {
			var cell = lstCell[cnt];
			aaoh.kaze.Element.setBackgroundImage(
				cell, srcCell
			);
		}

		this.fg = fgColor;
	}

	/**
	 * イベントの設定。
	 */
	moonage.Main.prototype.
	setEventListener = function() {
		this.setMoonageEventListener();
	}

	/**
	 * イベントの設定。
	 */
	moonage.Main.prototype.
	setMoonageEventListener = function() {
		var btnPre = aaoh.kaze.Gadget.$('btnPre');
		if (btnPre != null) {
			aaoh.kaze.Element.setOnClick(btnPre, function() {
				aaoh.sora.App.main.showMonthAge(-1);
				if (aaoh.sora.App.main.tblCalAni != null) {
					aaoh.sora.App.main.tblCalAni.start();
				}
				aaoh.sora.App.main.setFocus();
			});
		}

		var lblYearMonth = aaoh.kaze.Gadget.$('lblYearMonth');
		if (lblYearMonth != null) {
			aaoh.kaze.Element.setOnClick(lblYearMonth, function() {
				aaoh.sora.App.main.showCalender();
				if (aaoh.sora.App.main.tblCalAni != null) {
					aaoh.sora.App.main.tblCalAni.start();
				}
				aaoh.sora.App.main.setFocus();
			});
		}

		var btnNext = aaoh.kaze.Gadget.$('btnNext');
		if (btnNext != null) {
			aaoh.kaze.Element.setOnClick(btnNext, function() {
				aaoh.sora.App.main.showMonthAge(1);
				if (aaoh.sora.App.main.tblCalAni != null) {
					aaoh.sora.App.main.tblCalAni.start();
				}
				aaoh.sora.App.main.setFocus();
			});
		}
	}

	/**
	 * 初期化処理。
	 */
	moonage.Main.prototype.
	init = function() {
		this.setEventListener();
	}
})();

