
var msjCommon = {

	/**
	 * 設定
	 */
	config : {

		// 金利優遇値(1000 が 1% を意味する)

		preferentialRateBasicOutA :  300,	// ベーシック被災地外の当初○年の優遇率
		preferentialRateBasicOutB :    0,	// ベーシック被災地外の○年以降の優遇率

		preferentialRateBasicInA  :  300,	// ベーシック被災地の当初○年の優遇率
		preferentialRateBasicInB  :    0,	// ベーシック被災地の○年以降の優遇率

		preferentialRateEcoOutA   :  700,	// エコ被災地外の当初○年の優遇率
		preferentialRateEcoOutB   :  300,	// エコ被災地外の次の○年の優遇率
		preferentialRateEcoOutC   :    0,	// エコ被災地外の○年以降の優遇率

		preferentialRateEcoInA    : 1000,	// エコ被災地の当初○年の優遇率
		preferentialRateEcoInB    :  300,	// エコ被災地の次の○年の優遇率
		preferentialRateEcoInC    :    0,	// エコ被災地の○年以降の優遇率

		// 「被災地に該当する住所を確認する」URL
		strickenAreaAddressCheckURL : "http://www.jhf.go.jp/files/100187114.pdf",

		// 被災地対応フラグ
		isStrickenAreaCorrespondence : true

	},

	/**
	 * xml 読み込み
	 */
	loadXml : function(url) {
		$.ajax({
			url      : url,
			dataType : "xml",
			async    : false,
			success  : function(data, dataType) {
				rate20under = parseInt($("rate_20under",data).text());
				rate21over  = parseInt($("rate_21over" ,data).text());
			},
			error    : function(XMLHttpRequest, textStatus, errorThrown) {
				rate20under = 1870;
				rate21over  = 2180;
				alert(url+ " が読み込めませんでした。\n" + textStatus);
			}
		});
	},

	/**
	 * キーコードを取得する
	 */
	getKeyCode : function(e) {
		if (document.all) {
			return e.keyCode;
		} else if (document.getElementById) {
			return (e.keyCode)? e.keyCode : e.charCode;
		} else if (document.layers) {
			return e.which;
		}
	},

	/**
	 * キーが押された時の動作
	 * 数値以外は入力できないようにする
	 */
	onKeyDown : function(e,n) {
		var kc = msjCommon.getKeyCode(e);
		window.status = kc;
		// back space
		if ( kc == 8 ) {
			msjCommon.onBackSpace(e);
			return 1;
		// shift
		} else if ( kc == 16 ) {
			msjCommon.shift = true;
			return 0;
		// ctrl or command
		} else if ( kc == 17 || kc == 91 ) {
			msjCommon.ctrl = true;
			return 0;
		} else if ( 37 <= kc && kc <= 40 ) {
			return 0;
		// delete
		} else if ( kc == 46 ) {
			msjCommon.onDelete(e);
			return 1;
		// 0-9
		} else if ( !msjCommon.shift && 48 <= kc && kc <= 57 ) {
			msjCommon.onNumber(e,kc-48,n);
			return 1;
		// shift + 0-9
		} else if ( msjCommon.shift && 48 <= kc && kc <= 57 ) {
			return -1;
		// a-z or A-Z
		} else if ( !msjCommon.ctrl && 65 <= kc && kc <= 90 ) {
		// 0-9 (tenkey)
		} else if ( 96 <= kc && kc <= 105 ) {
			msjCommon.onNumber(e,kc-96,n);
			return 1;
		} else if ( msjCommon.shift && 186 <= kc && kc <= 226 ) {
			return -1;
		} else if ( 106 <= kc && kc <= 111 ) {
			return -1;
		} else if ( 186 <= kc && kc <= 226 ) {
			return 0;
		} else {
			return 0;
		}
	},

	onBackSpace : function(e) {
		var elm = e.target ? e.target : e.srcElement;
		var cval = elm.value;
		var cst = msjCommon.getSelectStart(elm);
		var ced = msjCommon.getSelectEnd(elm);
		var lln = cval.substr(ced).length;
		if ( cst == ced ) {
			if ( cval.substr(cst-1,1) == "," ) {
				var val = cval.substr(0,cst-2) + cval.substr(ced);
			} else {
				var val = cval.substr(0,cst-1) + cval.substr(ced);
			}
		} else {
			var val = cval.substr(0,cst) + cval.substr(ced);
		}
		val = val.replace(/,/g,"");
		var nval = msjCommon.putComma(val);
		elm.value = nval;
		var pos = nval.length - lln;
		msjCommon.setCaret(elm,pos);
	},

	onDelete : function(e) {
		var elm = e.target ? e.target : e.srcElement;
		var cval = elm.value;
		var cst = msjCommon.getSelectStart(elm);
		var ced = msjCommon.getSelectEnd(elm);
		var lln = cval.substr(ced).length;
		if ( cst == ced ) {
			if ( cval.substr(cst,1) == "," ) {
				var val = cval.substr(0,cst) + cval.substr(ced+2);
				lln--;
			} else {
				var val = cval.substr(0,cst) + cval.substr(ced+1);
			}
			lln--;
		} else {
			var val = cval.substr(0,cst) + cval.substr(ced);
		}
		val = val.replace(/,/g,"");
		var nval = msjCommon.putComma(val);
		elm.value = nval;
		var pos = nval.length - lln;
		msjCommon.setCaret(elm,pos);
	},

	onNumber : function(e,num,maxlen) {
		var elm = e.target ? e.target : e.srcElement;
		var cval = elm.value;
		var cst = msjCommon.getSelectStart(elm);
		var ced = msjCommon.getSelectEnd(elm);
		var lln = cval.substr(ced).length;
		if ( cst == ced && cval.replace(/,/g,"").length >= maxlen ) return;
		var val = cval.substr(0, cst) + num + cval.substr(ced);
		var nval = msjCommon.putComma(val);
		elm.value = nval;
		var pos = nval.length - lln;
		msjCommon.setCaret(elm,pos);
	},

	getSelectStart : function(elm) {
		if (jQuery.browser.msie) {
			var docRange = document.selection.createRange();
			var range = elm.createTextRange();
			range.setEndPoint('EndToStart', docRange);
			var start = range.text.length;
		} else {
			var start = elm.selectionStart;
		}
		return start;
	},

	getSelectEnd : function(elm) {
		if (jQuery.browser.msie) {
			var docRange = document.selection.createRange();
			var range = elm.createTextRange();
			range.setEndPoint('EndToEnd', docRange);
			var end = range.text.length;
		} else {
			var end = elm.selectionEnd;
		}
		return end;
	},

	setCaret : function(elm,pos) {
		if (jQuery.browser.msie) {
			var inputRange = elm.createTextRange();
			inputRange.move("character", pos);
			inputRange.select();
		} else {
			elm.selectionStart = pos;
			elm.selectionEnd = pos;
		}
		elm.focus();
	},

	/**
	 * キーが離された時の動作
	 */
	onKeyUp : function(e) {
		var kc = msjCommon.getKeyCode(e);
		if ( kc == 16 ) {
			msjCommon.shift = false;
		} else if ( kc == 17 || kc == 91 ) {
			msjCommon.ctrl = false;
		} else {
			return 1;
		}
		return 0;
	},

	/**
	 * 返済額計算
	 * 借入額       : borrowings
	 * 金利         : interest
	 * 返済期間(年) : period
	 */
	calcPayment : function(borrowings, interest, period) {
		var payment = borrowings * interest/100/12 * Math.pow((1+interest/12/100),(period*12)) / (Math.pow((1+interest/100/12),(period*12))-1);
		return payment;
	},

	/**
	 * 返済後の残元金
	 * 毎月の返済額   : payment
	 * 借入額         : borrowings
	 * 金利           : interest
	 * 返済済期間(年) : period
	 */
	calcCumprinc : function(payment, borrowings, interest, period) {
		var cumprinc = (payment - Math.pow((1+interest/100/12),(period*12)) * (payment-borrowings*interest/100/12)) / (interest/100/12);
		return cumprinc;
	},

	/**
	 * 借入可能額計算
	 * 年収       ：income
	 * 年間返済額 ：payment
	 * 金利       ：interest
	 * 返済期間   ：period
	 */
	calcBorrowings1 : function(income, payment, interest, period) {
		var kai = period * 12;
		var amt = 100;
		var rr  = 1 + interest/100/12;
		var hen = 10000 * amt * (rr-1) * Math.pow(rr,kai) / (Math.pow(rr,kai) - 1);
		if ( income >= 4000000 ) {
			var rep = (income * 0.35) - payment;
		} else {
			var rep = (income * 0.30) - payment;
		}
		if ( hen == Math.floor(100 * amt * interest/12) ) {
			hen = hen + 1;
		}
		var cel = rep / 12 / hen * 100 * 10000;
		return cel;
	},

//	/**
//	 * 借入可能額計算(旧ロジック)
//	 * 月間返済額 ：payment
//	 * 金利       ：interest
//	 * 返済期間   ：period
//	 */
//	calcBorrowings2 : function(payment, interest, period) {
//		var kai = period * 12;
//		var n0 = interest / 100 / 12;
//		var n1 = n0 + 1;
//		var n2 = Math.pow(n1,kai);
//		var n3 = n2 - 1;
//		var m0 = n0 + 1;
//		var m1 = Math.pow(m0,(kai));
//		var m2 = n0 * m1;
//		var cel = payment * (n3/m2);
//		return cel;
//	},

	/**
	 * 借入可能額計算
	 * 月間返済額 ：payment
	 * 金利       ：interest
	 * 返済期間   ：period
	 */
	calcBorrowings2 : function(payment, interest, period) {
	    var pv = 0;
	    var times = period * 12;
	    var rate = interest / 100 / 12;
	    for( var i=1; i <= times; i++ ) {
	        pv +=  payment / Math.pow(rate + 1, i);
	    }
	    return pv;
	},

	/**
	 * 支払総額計算
	 * 月間返済額 ：payment
	 * 返済期間   ：period
	 */
	calcAggregate : function(payment, period) {
		return payment * period * 12;
	},

	/**
	 * 融資事務手数料計算
	 */
	calcCommission : function(borrowings) {
		return borrowings * 0.02;
	},

	/**
	 * 団体信用生命保険料計算
	 */
	calcInsurance : function(borrowings) {
		return parseInt(((borrowings / 10000000) * 35800) / 100) * 100;
	},

	/**
	 * 収入印紙代計算
	 */
	calcFiscal : function(borrowings) {
		if ((borrowings >= 1000000) && (borrowings <= 5000000)) {
			return 2200;
		} else if ((borrowings >= 5000001 ) && (borrowings <= 10000000)) {
			return 10200;
		} else if ((borrowings >= 10000001) && (borrowings <= 50000000)) {
			return 20200;
		} else if  (borrowings >= 50000001) {
			return 60200;
		} else {
			return 0;
		}
	},

	/**
	 * コンマ(",")入りの金額値に変換する
	 */
	putComma : function(value) {
		var str = new String(value).replace(/,/g,"");
		if ( str.length < 4 ) return str;
		var cstr = "";
		var num = 0;
		while(str.length > 0) {
			var val = str.slice(-1);
			if ( num == 3 ) {
				cstr = val + "," + cstr;
				num = 0;
			} else {
				cstr = val + cstr;
			}
			str = str.substr(0,str.length-1);
			if ( val != "," && val != "." ) num++;
		}
		return cstr;
	},

	onClickCheckStrikenAreaAddressButton : function(e) {
		window.open(msjCommon.config.strickenAreaAddressCheckURL);
	}

};

