//============================================
// 未払い残業代計算 - zangyoCalculator.js -
// Copyright (C) 2010 S.Chiba (crossnote.jp)
// mailto:business@crossnote.jp
//============================================
//月の基準勤務日数の定義
var work_days_of_month = 22;

// 初期化
function initialize_zangyo_calculator() {
	// フォームsubmit無効化
	$("form").submit(function () { return false; });
	// セレクトボックスの初期化
	init_selectbox();
	// 送信ボタン押下イベント登録
	$(":submit").click(function(){
		// 値取得
		var from = new Date($('#q1_year').val(), $('#q1_month').val() -1, $('#q1_date').val());
		var to = new Date($('#q2_year').val(), $('#q2_month').val() -1, $('#q2_date').val());
		var salary = $('#salary').val();
		var paid_overtime_wages = $('#paid_overtime_wages').val();
		var overtime_hour = $('#overtime_hour').val();

		// バリデーション
		if (to < from) { alert('入社日付と退社日付が矛盾しています。'); return; }
		if (!(salary+'').match(/^\d+$/)){ alert('月収額を半角数字で入力して下さい。'); return; }
		if (!(paid_overtime_wages+'').match(/^\d+$/)){ alert('既に支払われている残業代を半角数字で入力して下さい。'); return; }
		if (!(overtime_hour+'').match(/^\d+$/)){ alert('１ヶ月あたりの残業時間を半角数字で入力して下さい。'); return; }

		// 月の基本残業代（円／月）＝（月収÷月の基準勤務日数÷8時間）×残業時間×25％
		var wages_of_month = parseInt((salary / work_days_of_month / 8) * overtime_hour * 1.25);
		
		// 総残業代
		var total_wages = 0;
		// 今日から遡って２年前の日付を算出
		var past2yearsDate = addDays(new Date(), -(365 * 2));
		// 入社日が２年前以前の場合
		if (from < past2yearsDate) {
			// 起算開始日を２年前に変更
			from = past2yearsDate;
			// 起算開始日に関する注意を表示
			//alert('未払い残業代を請求できるのは法律上過去２年までです。\n本日から遡って２年前から起算します。');
		}
		// 月毎の勤務日数を係数として残業代を計算（但し、最高で本日より２年間分）
		var cntWorkedDay = 0;
		var tmpDate = from;
		var tmpMonth = tmpDate.getMonth();
		while(tmpDate <= to) {
			// 月が変わった場合
			if (tmpMonth != tmpDate.getMonth()) {
				// 月の基準残業代に勤務日数の割合を加味
				var tmpWages = parseInt(wages_of_month * (cntWorkedDay / work_days_of_month));
				// 総残業代に加算
				total_wages = total_wages + tmpWages;
				// 月が変わったので勤務日数を初期化
				tmpMonth = tmpDate.getMonth();
				cntWorkedDay = 0;
			}
			// この日が勤務日の場合
			if (!isRestDate(tmpDate)) {
				++cntWorkedDay; // 勤務日数をカウントアップ
			}
			// 翌日へ
			tmpDate = new Date(tmpDate.getTime() + (24 * 3600 * 1000));
		}
		// 毎月の基準残業代に勤務日数の割合を加味
		var tmpWages = parseInt(wages_of_month * (cntWorkedDay / work_days_of_month));
		// 総残業代に加算
		total_wages = total_wages + tmpWages;

		// 既に支払い済み分を加味
		var unpaid = total_wages - paid_overtime_wages;
		// 既に全額支払われている場合
		if (unpaid < 0){ unpaid = 0; };
		
		//通貨表示に変換する
		unpaid = unpaid.toString().replace(/(\d{1,3})(?=(\d{3})+(?!\d))/g, "$1,");
		// 結果を表示
		$('#unpaid').text(unpaid);
	});
}

// セレクトボックスの初期化
function init_selectbox(){
	// 年セレクトボックスで遡れる過去年数
	var preY = 5;
	// 今日の日付を基準に初期値を算出
	var today = new Date();
	var yy = today.getYear();
	if (yy < 2000) { yy += 1900; }
	var mm = today.getMonth();
	var dd = today.getDate();

	// 年月セレクトボックス要素を生成
	$('#q1_year').numericOptions({from:(yy - preY),to:yy,selectedIndex:(preY)});
	$('#q2_year').numericOptions({from:(yy - preY),to:yy,selectedIndex:(preY)});
	$('#q1_month').numericOptions({from:1,to:12,selectedIndex:mm});
	$('#q2_month').numericOptions({from:1,to:12,selectedIndex:mm});
	// 日セレクトボックス要素を生成
	$('#q1_date').numericOptions().datePulldown({year:$('#q1_year'),month:$('#q1_month')});
	$('#q2_date').numericOptions({selectedIndex:(dd -1)}).datePulldown({year:$('#q2_year'),month:$('#q2_month')});
}
// 法定休日判定
function isRestDate(date) {
	// 日付を解析
	var yy = date.getYear();
	if (yy < 2000) { yy += 1900; }
	var mm = date.getMonth() + 1;
	var dd = date.getDate();
	// 土日祝日の場合はtrue
	if (isSaturday(yy,mm,dd) || isSunday(yy,mm,dd) || isHoliday(yy,mm,dd)) {
		return true;
	}
	return false;
}
// 日数演算
function addDays(baseDate, addDays) {
	var baseTime = baseDate.getTime();
	var addTime = addDays * 24 * 3600 * 1000; // 日数 * 1日のミリ秒数
	return new Date(baseTime + addTime);
}
