/**
 * JavaScript(要jquery.js)
 * 
 * 住宅ローン控除シミュレーションスクリプト
 * 
 * $Id: $
 */
//グローバル変数
var loanIptTochidai		 = 0;	//土地代
var loanIptTatemonodai	 = 0;	//建物代
var loanIptKariiregaku	 = 0;	//借入額
var loanIptJikoshikin	 = 0;	//自己資金
var loanIptZouyogaku	 = 0;	//贈与額
var loanIptNenshu		 = 0;	//年収
var loanIptFuyokazoku	 = 0;	//扶養家族
var loanIptHaigusha		 = "";	//配偶者
var loanIptHaigushaNenshu = 0;	//配偶者の年収
var loanIptDoukyoChild	 = 0;	//中学生以下の人数
var loanIptDoukyoYoung	 = 0;	//16歳～19歳未満の人数
var loanIptDoukyoAdult	 = 0;	//19歳～23歳未満の人数

var loanOptZoyo22		 = 0;	//平成22年に贈与を受けた場合の贈与税
var loanOptZoyo23		 = 0;	//平成23年に贈与を受けた場合の贈与税

var loanOptIppanLoan			 = 0;	//一般住宅　1.住宅ローン
var loanOptIppanLoanKojo		 = 0;	//一般住宅　2.住宅ローン控除
var loanOptIppanZeiseiShoki		 = 0;	//一般住宅　3.税制（初期費用）
var loanOptIppanZeiseiRunning	 = 0;	//一般住宅　4.税制（ランニング費用）
var loanOptIppanGoukei			 = 0;	//一般住宅　合計
var loanOptChoukiLoan			 = 0;	//長期優良住宅　1.住宅ローン
var loanOptChoukiLoanKojo		 = 0;	//長期優良住宅　2.住宅ローン控除
var loanOptChoukiZeiseiShoki	 = 0;	//長期優良住宅　3.税制（初期費用）
var loanOptChoukiZeiseiRunning	 = 0;	//長期優良住宅　4.税制（ランニング費用）
var loanOptChoukiGoukei			 = 0;	//長期優良住宅　合計
var loanOptOtoku				 = 0;	//長期優良住宅　合計

var loanShotokuTax			 = 0;		//所得税の課税対象所得
var loanJuminTax			 = 0;		//所得税の課税対象所得

var loanShotokuTaxKisoKojo	 = 380000;	//基礎控除（所得税）
var loanJuminTaxKisoKojo	 = 330000;	//基礎控除（住民税）

var loanTanni			 = 10000;	//表示の金額の単位

/**
 * function：
 */
function loanSimulate(evt) {
	//入力チェック
	if(!loanValidate()) {
		return false;
	}
	
	//入力値取得
	loanGetValue();
	
	//所得税・住民税の計算
	loanCalcTax();
//alert(loanShotokuTax);
//alert(loanJuminTax);
	
	//贈与税の計算
	loanOptZoyo22 = loanCalcTaxZoyo(22);
	loanOptZoyo23 = loanCalcTaxZoyo(23);
	
	//住宅ローン（総支払額）の計算
	loanOptIppanLoan	 = loanCalcLoan(false);
	loanOptChoukiLoan	 = loanCalcLoan(true);
	
	//住宅ローン（控除額）の計算
	loanOptIppanLoanKojo	 = loanCalcLoanKojo(false);
	loanOptChoukiLoanKojo	 = loanCalcLoanKojo(true);
	
	//税制（初期費用）の計算
	loanOptIppanZeiseiShoki	 = loanCalcZeiseiShoki(false);
	loanOptChoukiZeiseiShoki = loanCalcZeiseiShoki(true);
	
	//税制（ランニング費用）の計算
	loanOptIppanZeiseiRunning	 = loanCalcZeiseiRunning(false);
	loanOptChoukiZeiseiRunning	 = loanCalcZeiseiRunning(true);
	
	//合計の計算
	loanOptIppanGoukei	 = loanCalcGoukei(false);
	loanOptChoukiGoukei	 = loanCalcGoukei(true);
	
	//差額の計算
	loanOptOtoku = loanOptIppanGoukei - loanOptChoukiGoukei;
	
	//HTMLに出力
	loanOutput();
	
	return true;
}

/**
 * function：住宅ローン（総支払額）の計算
 */

function loanCalcLoan(choukiFlg) {
	//100万借り入れ時
	var f35Rate			 = 3612;	//フラット３５
	var f35_20Rate_10	 = 3096;	//フラット３５Ｓ（20年金利引き下げ～10年）
	var f35_20Rate_20	 = 3356;	//フラット３５Ｓ（20年金利引き下げ11～20年）
	var f35_20Rate_30	 = 3428;	//フラット３５Ｓ（20年金利引き下げ21～30年）
	
	var hensai10		 = 0;	//月の返済額(～10年)
	var hensai20		 = 0;	//月の返済額(～20年)
	var hensai30		 = 0;	//月の返済額(～30年)
	
	if (choukiFlg) {
		//月々の額
		hensai10 = (loanIptKariiregaku / loanTanni) / 100 * f35_20Rate_10;
		hensai20 = (loanIptKariiregaku / loanTanni) / 100 * f35_20Rate_20;
		hensai30 = (loanIptKariiregaku / loanTanni) / 100 * f35_20Rate_30;
		return (hensai10 * 12 * 10) + (hensai20 * 12 * 10) + (hensai30 * 12 * 15);
	} else {
		//月々の額
		hensai10 = (loanIptKariiregaku / loanTanni) / 100 * f35Rate;
		return hensai10 * 12 * 35;
	}
}

/**
 * function：住宅ローン（控除額）の計算
 */

function loanCalcLoanKojo(choukiFlg) {

	//100万借り入れ時 フラット３５の10年目までの残高
	var f35Rate = [
		982141,
		963817,
		945017,
		925728,
		905938,
		885633,
		864799,
		843424,
		821493,
		798993
	];
	//100万借り入れ時 フラット３５Ｓ（長期優良住宅）の10年目までの残高
	var f35SRate = [
		978386,
		956431,
		934129,
		911473,
		888461,
		865084,
		841337,
		817215,
		792711,
		767821
	];
	
	var loanKojo		 = 0;	//その年のローン控除額
	var kojo			 = 0;	//控除額
	
	if (choukiFlg) {
		//実際の借り入れ残高を計算し、控除額を算出する
		for (var i=0; i<f35Rate.length; i++) {
			loanKojo = loanIptKariiregaku / 1000000 * f35SRate[i] * 0.012; //控除率1.2％
			//ローン控除か所得税の少ないほうが住宅ローン控除額となる
			kojo += (loanKojo < loanShotokuTax)? loanKojo: loanShotokuTax;
		}
		return kojo;
	} else {
		//実際の借り入れ残高を計算し、控除額を算出する
		for (var i=0; i<f35Rate.length; i++) {
			loanKojo = loanIptKariiregaku / 1000000 * f35Rate[i] * 0.01; //控除率1％
			//ローン控除か所得税の少ないほうが住宅ローン控除額となる
			kojo += (loanKojo < loanShotokuTax)? loanKojo: loanShotokuTax;
		}
		return kojo;
	}
}

// 返済額の計算
function loanHensaigaku(n_balance, n_monthly_rate, kaisu) {
	var n_repayment   = 0;
	var n_numerator   = n_balance * n_monthly_rate * Math.pow(1 + n_monthly_rate, kaisu);
	var n_denominator = Math.pow(1 + n_monthly_rate, kaisu) - 1;

	n_repayment = n_numerator / n_denominator;

	return n_repayment;
}

/**
 * function：税制（初期費用）の計算
 */

function loanCalcZeiseiShoki(choukiFlg) {
	//建物評価額計算
	var tatemonoHyouka = Math.floor(loanIptTatemonodai * 0.5);
	//土地評価額計算
	var tochiHyouka = Math.floor(loanIptTochidai * 0.6);
	
	//保存登記（建物）計算
	var hozon = (choukiFlg)? tatemonoHyouka * 0.001: tatemonoHyouka * 0.0015;
	//移転登記（建物）計算
	var iten = (choukiFlg)? tatemonoHyouka * 0.001: tatemonoHyouka * 0.003;
	//抵当権設定（借入額）計算
	var teito = loanIptKariiregaku * 0.001;
	//不動産取得税（建物）計算
	var shotoku = (choukiFlg)? (tatemonoHyouka - 13000000) * 0.03: (tatemonoHyouka - 12000000) * 0.03;
	if (shotoku < 0) shotoku = 0;
	
	return (hozon + iten + teito + shotoku);
}

/**
 * function：税制（ランニング費用）の計算
 */

function loanCalcZeiseiRunning(choukiFlg) {
	//建物評価額計算
	var tatemonoHyouka = Math.floor(loanIptTatemonodai * 0.5);
	//土地評価額計算
	var tochiHyouka = Math.floor(loanIptTochidai * 0.6);
	
	//固定資産税計算
	var kotei = (choukiFlg)? tatemonoHyouka * 0.014 * 1 / 2 * 5: tatemonoHyouka * 0.014 * 1 / 2 * 3 + tatemonoHyouka * 0.014 * 2;
	
	return kotei;
}

/**
 * function：合計の計算
 */

function loanCalcGoukei(choukiFlg) {
	if (choukiFlg) {
		return (loanOptChoukiLoan - loanOptChoukiLoanKojo + loanOptChoukiZeiseiShoki + loanOptChoukiZeiseiRunning);
	} else {
		return (loanOptIppanLoan - loanOptIppanLoanKojo + loanOptIppanZeiseiShoki + loanOptIppanZeiseiRunning);
	}
}

/**
 * function：贈与税の計算
 */

function loanCalcTaxZoyo(year) {
	var zoyogaku = 0;
	if (year == 22) {
		zoyogaku = loanIptZouyogaku - 15000000;	//平成22年に贈与を受けた場合
	} else if (year == 23) {
		zoyogaku = loanIptZouyogaku - 10000000;	//平成23年に贈与を受けた場合
	}
	
	zoyogaku = zoyogaku - 1100000;
	
	if (zoyogaku <= 0) {
		return 0;
	} else if (zoyogaku < 2000000) {
		return zoyogaku * 0.1 - 0;
	} else if (zoyogaku < 3000000) {
		return zoyogaku * 0.15 - 100000;
	} else if (zoyogaku < 4000000) {
		return zoyogaku * 0.2 - 250000;
	} else if (zoyogaku < 6000000) {
		return zoyogaku * 0.3 - 650000;
	} else if (zoyogaku < 10000000) {
		return zoyogaku * 0.4 - 1250000;
	} else {
		return zoyogaku * 0.5 - 2250000;
	}
}

/**
 * function：所得税・住民税の計算
 */

function loanCalcTax() {
	
	// 各控除額の計算
	var shotokuKojo		 = loanCalcTaxShotokuKojo(loanIptNenshu);				// 所得控除の計算
	var shakaihokenKojo	 = loanCalcTaxShahoKojo(loanIptNenshu, shotokuKojo);	// 社会保険料控除の計算
	var fuyoKojoShotoku	 = loanCalcTaxFuyoKojoShotoku(loanIptFuyokazoku);		// 扶養・配偶者控除の計算
	var fuyoKojoJumin	 = loanCalcTaxFuyoKojoJumin(loanIptFuyokazoku);			// 扶養控除の計算

	// 課税対象所得(所得税)の計算
	var kazeitaishoShotokuShotoku = loanIptNenshu - (loanShotokuTaxKisoKojo + shotokuKojo + shakaihokenKojo + fuyoKojoShotoku);
	kazeitaishoShotokuShotoku = Math.floor(kazeitaishoShotokuShotoku / 1000) * 1000; // 1,000円未満切捨て
	kazeitaishoShotokuShotoku = (kazeitaishoShotokuShotoku < 0)? 0: kazeitaishoShotokuShotoku;

	// 課税対象所得(住民税)の計算
	var kazeitaishoShotokuJumin = loanIptNenshu - (loanJuminTaxKisoKojo + shotokuKojo + shakaihokenKojo + fuyoKojoJumin);
	kazeitaishoShotokuJumin = Math.floor(kazeitaishoShotokuJumin / 1000) * 1000; // 1,000円未満切捨て
	kazeitaishoShotokuJumin = (kazeitaishoShotokuJumin < 0)? 0: kazeitaishoShotokuJumin;

	// 所得税の計算
	if (kazeitaishoShotokuShotoku < 1950000) {
		loanShotokuTax = kazeitaishoShotokuShotoku * 0.05;
	} else if (kazeitaishoShotokuShotoku < 3300000) {
		loanShotokuTax = kazeitaishoShotokuShotoku * 0.10 - 97500;
	} else if (kazeitaishoShotokuShotoku < 6950000) {
		loanShotokuTax = kazeitaishoShotokuShotoku * 0.20 - 427500;
	} else if (kazeitaishoShotokuShotoku < 9000000) {
		loanShotokuTax = kazeitaishoShotokuShotoku * 0.23 - 636000;
	} else if (kazeitaishoShotokuShotoku < 18000000) {
		loanShotokuTax = kazeitaishoShotokuShotoku * 0.33 - 1536000;
	} else {
		loanShotokuTax = kazeitaishoShotokuShotoku * 0.40 - 2796000;
	}
	
	// 住民税の計算
	loanJuminTax = kazeitaishoShotokuJumin * 0.1 + 4000;
}

/**
 * function：所得控除の計算
 */
function loanCalcTaxShotokuKojo(nenshu) {
	if (nenshu < 1800000) {
		return (nenshu * 0.4 < 650000)? 650000: nenshu * 0.4;
	} else if (nenshu < 3600000) {
		return nenshu * 0.30 + 180000;
	} else if (nenshu < 6600000) {
		return nenshu * 0.20 + 540000;
	} else if (nenshu < 10000000) {
		return nenshu * 0.10 + 1200000;
	} else {
		return nenshu * 0.05 + 1700000;
	}
}

/**
 * function：社会保険料控除の計算
 */
function loanCalcTaxShahoKojo(nenshu, kojo) {
	return (nenshu - kojo) * 0.11775;
}

/**
 * function：扶養控除・配偶者控除(所得税)の計算
 */
function loanCalcTaxFuyoKojoShotoku(kazoku) {
	var fuyoKojo = 0;	//扶養控除・配偶者控除
	var nenshu	 = 0;	//給与所得控除後の配偶者の年収
	//配偶者控除の計算
	if (loanIptHaigusha == "専業主婦") {
		fuyoKojo += 380000;
	}
	//配偶者特別控除の計算
	else if (loanIptHaigusha == "有職者1") {
		nenshu = loanIptHaigushaNenshu - 650000;
		if (nenshu < 400000) {
			fuyoKojo += 380000;
		} else if (nenshu < 450000) {	//配偶者特別控除
			fuyoKojo += 360000;
		} else if (nenshu < 500000) {
			fuyoKojo += 310000;
		} else if (nenshu < 550000) {
			fuyoKojo += 260000;
		} else if (nenshu < 600000) {
			fuyoKojo += 210000;
		} else if (nenshu < 650000) {
			fuyoKojo += 160000;
		} else if (nenshu < 700000) {
			fuyoKojo += 110000;
		} else if (nenshu < 750000) {
			fuyoKojo += 60000;
		} else if (nenshu < 760000) {
			fuyoKojo += 30000;
		}
	}

	//子どもの控除額の計算
	if (loanIptDoukyoChilds == "あり") {
		//中学生以下
		if (loanIptDoukyoChild) {
			;
		}
		//16歳～19歳未満
		if (loanIptDoukyoYoung) {
			fuyoKojo += 380000 * loanIptDoukyoYoung;
		}
		//19歳～23歳未満
		if (loanIptDoukyoAdult) {
			fuyoKojo += 630000 * loanIptDoukyoAdult;
		}
	}
	
	return fuyoKojo;
}

/**
 * function：扶養控除(住民税)の計算
 */
function loanCalcTaxFuyoKojoJumin(kazoku) {
	return loanIptFuyokazoku * 330000;
}


/**
 * function：入力取得
 */
function loanGetValue(){
	loanIptTochidai		 = $("#textfield6").val() * loanTanni;	//土地代
	loanIptTatemonodai	 = $("#textfield2").val() * loanTanni;	//建物代
	loanIptKariiregaku	 = $("#textfield7").val() * loanTanni;	//借入額
	loanIptJikoshikin	 = $("#textfield8").val() * loanTanni;	//自己資金
	loanIptZouyogaku	 = $("#textfield9").val() * loanTanni;	//贈与額
	loanIptNenshu		 = $("#textfield10").val() * loanTanni;	//年収
	loanIptFuyokazoku	 = $("#textfield11").val();	//扶養家族
	loanIptHaigusha		 = $("input[name='radiobutton1']:checked").val();	//配偶者
	loanIptHaigushaNenshu = $("#textfield12").val() * loanTanni;	//配偶者の年収
	loanIptDoukyoChilds	 = $("input[name='radiobutton2']:checked").val();	//こどもの有無
	loanIptDoukyoChild	 = $("#textfield3").val();	//中学生以下
	loanIptDoukyoYoung	 = $("#textfield4").val();	//16歳～19歳未満
	loanIptDoukyoAdult	 = $("#textfield5").val();	//19歳～23歳未満
}

/**
 * function：HTMLに出力
 */
function loanOutput(){
	//住宅ローンの出力
	$("#ippanLoan").text(loanPrintCost(loanOptIppanLoan));
	$("#choukiLoan").text(loanPrintCost(loanOptChoukiLoan));
	//住宅ローン控除の出力
	$("#ippanLoanKojo").text("▲ " + loanPrintCost(loanOptIppanLoanKojo));
	$("#choukiLoanKojo").text("▲ " + loanPrintCost(loanOptChoukiLoanKojo));
	//税制（初期費用）の出力
	$("#ippanZeiseiShoki").text(loanPrintCost(loanOptIppanZeiseiShoki));
	$("#choukiZeiseiShoki").text(loanPrintCost(loanOptChoukiZeiseiShoki));
	//税制（ランニング費用）の出力
	$("#ippanZeiseiRunning").text(loanPrintCost(loanOptIppanZeiseiRunning));
	$("#choukiZeiseiRunning").text(loanPrintCost(loanOptChoukiZeiseiRunning));
	//合計の出力
	$("#ippanGoukei").text(loanPrintCost(loanOptIppanGoukei));
	$("#choukiGoukei").text(loanPrintCost(loanOptChoukiGoukei));
	//差額の出力
	$("#otoku").text(loanPrintCost(loanOptOtoku));
	//贈与税の出力
	$("#zoyo22").text(loanPrintCost(loanOptZoyo22));
	$("#zoyo23").text(loanPrintCost(loanOptZoyo23));
}

/**
 * function：入力チェック
 */
function loanValidate(){
	//空白チェック
	if($("#textfield6").val().match(/^\s*$/) || isNaN($("#textfield6").val())){
		loanAlertAndFocus("「土地代」を半角数字でご記入下さい。", $("#textfield6"));
		return false;
	}
	if($("#textfield2").val().match(/^\s*$/) || isNaN($("#textfield2").val())){
		loanAlertAndFocus("「建物代」を半角数字でご記入下さい。", $("#textfield2"));
		return false;
	}
	if($("#textfield7").val().match(/^\s*$/) || isNaN($("#textfield7").val())){
		loanAlertAndFocus("「借入額」を半角数字でご記入下さい。", $("#textfield7"));
		return false;
	}
	if($("#textfield8").val().match(/^\s*$/) || isNaN($("#textfield8").val())){
		loanAlertAndFocus("「自己資金」を半角数字でご記入下さい。", $("#textfield8"));
		return false;
	}
	if($("#textfield9").val().match(/^\s*$/) || isNaN($("#textfield9").val())){
		loanAlertAndFocus("「贈与額」を半角数字でご記入下さい。", $("#textfield9"));
		return false;
	}
	if($("#textfield10").val().match(/^\s*$/) || isNaN($("#textfield10").val())){
		loanAlertAndFocus("「年収」を半角数字でご記入下さい。", $("#textfield10"));
		return false;
	}
	if($("#textfield11").val().match(/^\s*$/) || isNaN($("#textfield11").val())){
		loanAlertAndFocus("「扶養家族」を半角数字でご記入下さい。", $("#textfield11"));
		return false;
	}
	if(!$("input[name='radiobutton1']:checked").val()){
		loanAlertAndFocus("「配偶者」を選択して下さい。", $("#radiobutton1"));
		return false;
	} else {
		if ($("input[name='radiobutton1']:checked").val() == "有職者1") {
			if($("#textfield12").val().match(/^\s*$/) || isNaN($("#textfield12").val()) || $("#textfield12").val() < 103 || $("#textfield12").val() >= 130){
				loanAlertAndFocus("「配偶者の年収」を103万円～130万円未満の範囲で半角数字でご記入下さい。", $("#textfield12"));
				return false;
			}
		}
	}
	if(!$("input[name='radiobutton2']:checked").val()){
		loanAlertAndFocus("「子ども」を選択して下さい。", $("#radiobutton2"));
		return false;
	} else {
		if ($("input[name='radiobutton2']:checked").val() == "あり") {
			if($("#textfield3").val().match(/^\s*$/) || isNaN($("#textfield3").val())){
				loanAlertAndFocus("「中学生以下の人数」を半角数字でご記入下さい。", $("#textfield3"));
				return false;
			}
			if($("#textfield4").val().match(/^\s*$/) || isNaN($("#textfield4").val())){
				loanAlertAndFocus("「16歳～19歳未満の人数」を半角数字でご記入下さい。", $("#textfield4"));
				return false;
			}
			if($("#textfield5").val().match(/^\s*$/) || isNaN($("#textfield5").val())){
				loanAlertAndFocus("「19歳～23歳未満」を半角数字でご記入下さい。", $("#textfield5"));
				return false;
			}
		}
	}
	return true;
}

function loanAlertAndFocus(alrtMsg, obj){
	alert(alrtMsg);
	obj.focus();
}

/**
 * function：出力金額整形
 */
function loanPrintCost(value){
	value = Math.floor(value / (loanTanni / 10)) / 10;
	return loanAddComma(value);
}

/**
 * function：カンマ付与
 */
function loanAddComma(value){
	var i;
	for(i = 0; i < value.length/3; i++){
		value = value.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2");
	}
	return value;
}



