﻿/*--------------------------------------------------------------------------*
 * トレードシミュレーション
 *--------------------------------------------------------------------------*/
$ = jQuery;
$(function() {

	var color = {
		white : "#ffffff",
		lightGray : "#aaaaaa"
	};
	//日付の設定
	var month = (new Date()).getMonth();
	var year = (new Date()).getFullYear();

	/*
	 * 年月を指定して月末日を求める
	 */
	var getMonthEndDay = function(year, month) {
		//日付を0にすると前月の末日を指定したことになります
		//指定月の翌月の0日を取得して末日を求めます
		//そのため、ここでは month - 1 は行いません
		var dt = new Date(year, month, 0);
		return dt.getDate();
	};
	/**
	 * 年月日と加算月からnヶ月後、nヶ月前の日付を求める
	 * year 年
	 * month 月
	 * day 日
	 * addMonths 加算月。マイナス指定でnヶ月前も設定可能
	 */
	var computeMonth = function(year, month, day, addMonths) {
		month += addMonths;
		var endDay = getMonthEndDay(year, month);
		//月末日を求める関数を使用
		if(day > endDay)
			day = endDay;
		var dt = new Date(year, month - 1, day);
		return dt;
	};
	/**
	 * 入出金チェックボックスに応じて活性切り替え
	 */
	var mBankCheck = function(check, start, amount) {
		var resetForm = function() {
			$(amount).attr("disabled", "disabled");
			$(amount).val("0");
			$(amount).css("backgroundColor", color.lightGray);
			$(start).attr("disabled", "disabled");
			$(start).val("1");
			$(start).css("backgroundColor", color.lightGray);
		};
		var disableForm = function() {
			$(amount).removeAttr("disabled");
			$(amount).css("backgroundColor", color.white);
			$(start).removeAttr("disabled");
			$(start).css("backgroundColor", color.white);
		};
		//ページ読み込まれた時のチェックボックスの状態を見て処理
		if($(check)[0].checked) {
			resetForm();
		} else {
			disableForm();
		}
		//クリックされた時のチェックボックスの状態を見ての処理
		$(check).click(function() {
			if(this.checked) {
				resetForm();
			} else {
				disableForm();
			}
		});
	};
	mBankCheck("#sinkCheck", "#startSink", "#sink");
	mBankCheck("#receiveCheck", "#startReceive", "#receive");

	/*
	 金額の3桁毎にカンマを入れる
	 */
	var mAddFigure = function(str) {
		var num = new String(str).replace(/,/g, "");
		while(num != ( num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
		return num;
	};
	var pushTag = function(tags) {
		var num = 0;
		var startInterval = setInterval(function() {
			$("#welfareTable").append(tags[num]);
			$("#welfareTable > tbody > tr:eq(" + num + ")").show(500);
			num++;
			if(num == tags.length) {
				stopInterval();
				$(".calcButton").val('もう一度シミュレーションを行う').removeAttr('disabled');
			}
		}, 100);
		var stopInterval = function() {
			clearInterval(startInterval);
		};
	};
	/**
	 * 完成済みtrタグの配列を時間差で表示出力
	 */
	var pushTd = function(tdSet) {
		var loopNum = 0;
		var table = $('#welfareTable > tbody');

		var startInterval = setInterval(function() {
			$("#welfareTable").append(tdSet[loopNum]);
			$("#welfareTable > tbody > tr:eq(" + loopNum + ")").show(500);
			loopNum++;
			if(loopNum == tdSet.length) {
				stopInterval();
				$(".calcButton").val('もう一度シミュレーションを行う').removeAttr('disabled');
			}
		}, 100);
		var stopInterval = function() {
			clearInterval(startInterval);
		};
	};
	/**
	 * 値が0以上の数値かどうか検証
	 */
	var formCheck = function(array) {
		for(var index in array) {
			if(isNaN(array[index]) || array[index] < 0) {
				return true;
			}
		}
		return false;
	};
	/*
	 シミュレーションの表出力
	 */
	var mCalc = function() {
		$('#resultDisplayBox > *').remove();
		$(".calcButton").val('計算中').attr("disabled", "disabed");
		var data = {
			age : $("#age").attr('value'),
			acrossAges : $("#acrossAges").attr('value'),
			assets : $("#assets").attr('value'),
			returnRate : $("#returnRate").attr('value'),
			startReceive : $("#startReceive").attr('value'),
			receive : $("#receive").attr('value'),
			startSink : $("#startSink").attr('value'),
			sink : $("#sink").attr('value')
		};
		for(var i in data) {
			data[i] = parseInt(data[i]);
		}

		var trTags = new Array();

		if(formCheck(data)) {
			trTags[0] = $('<tr></tr>');
			trTags[0].append('<td style="padding:20px;">入力された数値にエラーがあります。数値は全て0以上の半角数字でご入力ください。</td>');
		} else {

			for( loopNum = 0; loopNum < data.acrossAges; loopNum++) {
				data.assets = Math.round(data.assets * (data.returnRate * 0.01 + 1));

				var sinkReceive = "";
				// 入金年以降は入金分の金額を増やす
				if(data.startReceive <= acrossYear + 1) {
					data.assets = data.assets + data.receive;
					if(data.receive > 0) {
						sinkReceive += "(" + data.receive + "万円入金)";
					}
				}
				//出金年以降は出金分の金額を減らす
				if(data.startSink <= acrossYear + 2) {
					data.assets = data.assets - data.sink;
					if(data.sink > 0) {
						sinkReceive += "(" + data.sink + "万円出金)";
					}
				}

				//経過年
				var acrossYear = loopNum + 1;
				//月を設定
				var date = computeMonth(year, month, 31, acrossYear);
				data.age = data.age + 1;
				//出力用の文字を配列に代入・入出金開始月以降は入出金額を表記する
				var zebraClass = loopNum % 2 == 0 ? "even" : "odd";
				var tdBorder = 'border-top:0px; border-right:0px; border-bottom:0px; border-left:0px;';
				trTags[loopNum] = $('<tr style="display:none;' + tdBorder + '" class="' + zebraClass + '"></tr>');
				trTags[loopNum].append('<td style="' + tdBorder + '">' + (date.getFullYear() + acrossYear ) + '年' + ' (' + acrossYear + '年後 : ' + data.age + '歳)</td>');
				trTags[loopNum].append('<td align="right" style="' + tdBorder + '"><strong style="font-size:1.1em;display:block;margin:5px 10px;">' + mAddFigure(data.assets) + '万円</strong></td>');

				if(sinkReceive.length === 0) {
					sinkReceive = "&nbsp;";
				}
				trTags[loopNum].append('<td style="' + tdBorder + '">' + sinkReceive + '</td>');
			}
		}

		$("#resultDisplayBox").append('<table id="welfareTable" style="' + tdBorder + '"><tbody></tbody></table>')

		pushTag(trTags);

	};
	//シミュレーション開始
	$(".calcButton").click(mCalc);
	$(".calcButton").removeAttr('disabled'); (function() {
		var endMoney = 0;

		var stratMoney = 100;
		var returnRate = 10;
		var acrossAges = 10;
		var testTrueNum = 0;

		var welfareCalc = function() {
			var value = 0;
			return {
				increment : function(inc) {
					value += typeof inc === 'number' ? inc : 1;
				},
				getValue : function() {
					return value

				}
			};

		};
		for( i = 0; i < 10; i++) {
			endMoney = welfareCalc();
		}

	})();
});

