/**
 * ローンシミュレーション計算Javascript
 * 
 * ver.1.00 WebQuest Corp.
 */
//----------------------------------------
// メイン (エントリポイント)
//----------------------------------------
function calc(f) {
	// まず入力チェック
	if (!isValid(f)) return;
	
	// OKなら、
	var income = parseInt(f.income.value) * 10000;
	var amount = parseInt(f.borrowamt.value) * 10000;	// 万円→円
	var rate = parseFloat(f.rate.value);
	var period = parseInt(f.period.value) * 12;	// 年→回数
	var bonus_ratio = parseInt(f.bonus_ratio.value);
	
/*	// 元利均等
	if (f.paytype[0].checked) {*/
		var result = calc_equal_monthly(amount, rate, period, bonus_ratio);
/*	// 元金均等
	} else {
		var result = calc_equal_install(amount, rate, period, bonus_ratio);
	}*/
	var result2 = get_loan(income, period);

	// 結果値をセット
	f.payamt_month.value = Math.ceil(result[0] / 1000) / 10;
	f.payamt_bonus.value = Math.ceil(result[1] / 1000) / 10;
	f.payamt_sum.value   = numberFormat(Math.ceil(result[2] / 10000));
	f.loan_limit.value   = result2[0];
	f.loan_fit01.value     = result2[1];
	f.loan_fit02.value     = result2[2];
	f.payamt_month.focus();

}


//----------------------------------------
// 入力チェック
//----------------------------------------
function isValid(f) {
	var obj;
	var val;
	// 年収
	obj = f.income;
	val = obj.value;
	if (val == '') {
		return showError(obj, "年収（総支給額）を入力してください。", val);
	} else if (parseInt(val) < 200) {
		return showError(obj, "正しい年収を入力して下さい。", val);
	}
	// 借入希望額
	obj = f.borrowamt;
	val = obj.value;
	if (val == '') {
		return showError(obj, "借入ご希望額を入力してください。", val);
	} else if (!isNumeric(val)) {
		return showError(obj, "借入ご希望額は数字で入力してください。", val);
	} else if (parseInt(val) < 100 || parseInt(val) > 10000) {
		return showError(obj, "借入ご希望額は 100〜10000(万円)の範囲で入力してください。", val);
	}
	// 融資金利
	obj = f.rate;
	val = obj.value;
	if (val == '') {
		return showError(obj, "融資金利を入力してください。", val);
	} else if (!isNumeric(val)) {
		return showError(obj, "融資金利は数字で入力してください。", val);
	} else if (parseFloat(val) < 0.01 || parseFloat(val) > 15) {
		return showError(obj, "融資金利は 0.01〜15(％)の範囲で入力してください。", val);
	}
	// 返済期間
	obj = f.period;
	if (obj.value == '') {
		return showError(obj, "返済期間を選択してください。");
	}
/*	// 返済方法
	obj = f.paytype;
	if (!obj[0].checked && !obj[1].checked) {
		return showError(obj, "返済方法を選択してください。");
	}*/
	// ボーナス割合
	obj = f.bonus_ratio;
	if (obj.value == '') {
		return showError(obj, "ボーナス割合を選択してください。");
	}
	
	// ここまでくればOK
	return true;
}

//----------------------------------------
// エラー表示
//----------------------------------------
function showError(obj, msg, val) {
	if (val == "" || val == undefined) {
		alert(msg);
	} else {
		alert(msg + "\r\n[" + val + "]");
	}
	if (obj.type != undefined) {
		obj.focus();
	}
	if (obj.type == 'text') {
		obj.select();
	}
	return false;
}

//----------------------------------------
// 数値かどうかを返します。
//----------------------------------------
function isNumeric(str) {
	return str.match(/^\d+(\.\d+)?$/);
}


//----------------------------------------
// 3桁区切りでカンマつけ
//----------------------------------------
/*function numberFormat(val) {
	var str = "" + val;	// 文字列にする
	if (str.length <= 3) return str;
	
	var tokens = str.match(/^(\d{1,3})?(\d{3})*(\d{3})$/);
	if (!tokens) {
		return str;
	} else {
		var tmp = "";
		for(i = 0; i < tokens.length; i++) {
			tmp = tmp + i + ": " + tokens[i] + "\n";
		
		}
		
		var result = tokens[1];
		for (i = 2; i < tokens.length; i++) {
			if (tokens[i] > "") {
				result = result + "," + tokens[i];
			}
		}
		return result;
	}
}*/
function numberFormat(val) {
	val = Math.round(val);
	var str = String(val);
	var tmp = "";
	var len = str.length;
	while (len > 3 ) {
		len -= 3;
		tmp = "," + str.substr(len,3) + tmp;
	}
	str = str.substr(0,len) + tmp;
	return str;
}


//----------------------------------------
// 元利均等
//----------------------------------------
function calc_equal_monthly(amount, rate, period, bonus_ratio) {

	//毎月払い額
	var pri_period = period; 
	var mth_mdl = 1 - Math.pow (1 + (rate * 0.01/12), (-pri_period));
	var mth_pay = Math.floor(amount * (1 - bonus_ratio/100) * (rate * 0.01/12) / mth_mdl);
	var mth_amt = Math.ceil(mth_pay/1000)/10;

	//ボーナス追加払い額
	pri_period = Math.floor(period / 6 + 0.05); // 四捨五入
	var bns_mdl = 1 - Math.pow(1 + (rate * 0.01/2) , -pri_period);
	var bns_pay = Math.floor(amount * (bonus_ratio/100) * (rate * 0.01/2) / bns_mdl);
	var bns_amt = Math.ceil(bns_pay / 1000) / 10;

	//総返済額の計算
	var all_amt = (mth_pay * period) + (bns_pay * Math.ceil(period/6));
	
	// 各結果を配列にセットして返す
	return new Array(mth_pay, bns_pay, all_amt);
}


//----------------------------------------
// 元金均等
//----------------------------------------
function calc_equal_install(amount, rate, period, bonus_ratio) {
	
	//毎月払い額 - 第1回
	var mth_pay = Math.floor( amount * (1 - bonus_ratio/100) / period );
	var mth_int = Math.floor( amount * (1 - bonus_ratio/100) * (rate * 0.01 / 12));
	var mth_amt = mth_pay + mth_int;
	
	//ボーナス払い額 - 第1回
	var bns_pay = Math.floor( amount * (bonus_ratio/100)/ (period/6) );
	var bns_int = Math.floor( amount * (bonus_ratio/100) * (rate * 0.01 / 2));
	var bns_amt = bns_pay + bns_int;
	
	//毎月分の総返済額 積み上げ
	var mth_all = mth_amt;
	var bns_all = bns_amt;
	
	for (i = 1; i <= period-1; i++) {
		mth_int = Math.floor ((amount * ( 1 - bonus_ratio / 100) - mth_pay * i ) * ( rate * 0.01 / 12));
		mth_all += (mth_int + mth_pay);
	}
	//ボーナス分の総返済額 積み上げ
	for (i = 1; i <= period/6 - 1; i++) {
		bns_int = Math.floor ((amount * (bonus_ratio/100) - bns_pay * i ) * ( rate * 0.01 / 2));
		bns_all += (bns_int + bns_pay);
	}
	
	// 各結果を配列にセットして返す
	return new Array(mth_amt, bns_amt, (mth_all+bns_all));

}

//---------------------------------------
//借入可能額計算
//---------------------------------------
function get_loan(income, period){

	var ratio;
	var limit;
	var fit01;
	var fit02;
	var tmp1;
	var tmp2;

	//年収に対する借入限度割合
	if(400 <= income / 10000){
		limit = calc_loan(income, period, 0.35);
	} else if(300 <= income / 10000) {
		limit = calc_loan(income, period, 0.30);
	} else if(200 <= income / 10000) {
		limit = calc_loan(income, period, 0.25);
	} else {
		return new Array(0,0);
	}
	limit = numberFormat(Math.ceil(limit/10000));

	//年収に対する借入適正割合
	if(500 <= income / 10000){
		fit01 = calc_loan(income, period, 0.35);
		fit01 = numberFormat(Math.ceil(fit01/10000));
		fit02 = "";
	} else if(200 <= income / 10000) {
		fit01 = calc_loan(income, period, 0.25);
		fit02 = calc_loan(income, period, 0.30);
		fit01 = numberFormat(Math.ceil(fit01/10000));
		fit02 = numberFormat(Math.ceil(fit02/10000));
	}

	return new Array(limit, fit01, fit02);
}

//--------------------------------------
//月支払額から元利均等で借入額を算出
//--------------------------------------
function calc_loan(income, period, ratio) {

	var rate = 0.04;
	var result;
	var month;
	var par;
	month = income * ratio / 12;
	par = Math.pow((1 + rate / 12), -period);
	result = 12 * month * (1 - par) / rate;
		
	return Math.ceil(result); 
}