
// 借り入れ希望額から返済額を計算
function JsCom_mathPmt1(
	txtKariire,
	txtKikanY,
	txtKikanM,
	txtBonus,
	txtRetTsuki,
	txtRetNen,
	txtRetBonus,

	nKingakuMin,
	nKingakuMax,
	nKikanMin,
	nKikanMax,
	dRitu,
	nTani )
{
	var nKariire;
	var nKikan;
	var nBonus;

	// 必須入力のチェック
	if( JsCom_TextCheckNull( txtKariire,  "お借入ご希望金額" ) == false ) return false;
	if( dRitu == 0.0 ) {
		alert( "ローンの金利を選択してください。" );
		return false;
	}

	if( JsCom_IsNumber( parseInt( txtKikanY.value ) ) == false ) txtKikanY.value = 0;	// 年は省略可能：省略時は０
	if( JsCom_IsNumber( parseInt( txtKikanM.value ) ) == false ) txtKikanM.value = 0;	// 月は省略可能：省略時は０
	if( JsCom_IsNumber( parseInt( txtBonus.value  ) ) == false ) txtBonus.value = 0;    // ボーナスは省略可能：省略時は０

	// 
	if( JsCom_TextCheckInteger( txtKariire, "お借入ご希望金額" ) == false ) return false;
	
	//小数対応 yone
	//if( JsCom_TextCheckInteger( txtKikanY,  "ご返済期間(年)"   ) == false ) return false;
	if( JsCom_TextCheckInteger_decimal( txtKikanY,  "ご返済期間(年)"   ) == false ) return false;
	if( JsCom_TextCheckInteger( txtKikanM,  "ご返済期間(月)"   ) == false ) return false;
	if( JsCom_TextCheckInteger( txtBonus,   "内ボーナス返済分" ) == false ) return false;

	// 入力範囲のチェック
	if( JsCom_TextCheckNumRange( txtKariire, nKingakuMin,  nKingakuMax, "お借入ご希望金額" ) == false ) return false;

	//小数対応 yone
	//if( JsCom_TextCheckIntRange( txtKikanY,  nKikanMin,    nKikanMax,   "ご返済期間(年)"   ) == false ) return false;
	if( JsCom_TextCheckIntRange_decimal( txtKikanY,  nKikanMin,    nKikanMax,   "ご返済期間(年)"   ) == false ) return false;
	if( JsCom_TextCheckIntRange( txtKikanM,  0,            12,          "ご返済期間(月)"   ) == false ) return false;
	if( JsCom_TextCheckIntRange( txtBonus,   0, parseInt( txtKariire.value ) / 2, "内ボーナス返済分" ) == false ) return false;

	//小数対応 yone
	//nKikan = parseInt( txtKikanY.value ) * 12 + parseInt( txtKikanM.value );
	nKikan = parseFloat( txtKikanY.value ) * 12 + parseInt( txtKikanM.value );

	if( nKikan > nKikanMax * 12 ){
		alert( "ご返済期間は最大" + nKikanMax + "年で入力してください。" );
		txtKikanY.focus();
		return false;
	}
	if( nKikan == 0 ){
		alert( "ご返済期間を入力してください。" );
		txtKikanY.focus();
		return false;
	}
	if( nKikan < 6 ){
		txtBonus.value = "0";
	}

	if( parseInt( parseFloat( txtKariire.value ) ) % nTani ){
		alert( "お借入ご希望金額は" + nTani + "万円単位で入力してください。" );
		txtKariire.focus();
		return false;
	}

	nKariire = parseFloat( txtKariire.value  ) * 10000;
	nBonus   = parseInt( txtBonus.value  ) * 10000 ;
	dRitu1   = dRitu / 100.0 / 12.0;
	dRitu2   = dRitu / 100.0 / 2.0;

	var nRetTuki;
	var nRetBonus;
	
	// 切捨てします
	nRetTuki  = parseInt( JsCom_funcPMT( dRitu1, nKikan, nKariire - nBonus ) );
	nRetBonus = parseInt( JsCom_funcPMT( dRitu2, parseInt( nKikan / 6 ), nBonus ) );

	txtRetTsuki.value = JsCom_FormatComma( "" + nRetTuki );
	txtRetNen.value   = JsCom_FormatComma( "" + parseInt( parseInt( nRetTuki * 12 ) + parseInt( nRetBonus * 2 ) ) );
	txtRetBonus.value = JsCom_FormatComma( "" + nRetBonus ); 


	return true;
}

function JsCom_mathPmt2(
	txtTuki,
	txtKikanY,
	txtKikanM,
	txtBonus,
	txtRetGaku,
	nKingakuMin,
	nKingakuMax,
	nKikanMin,
	nKikanMax,
	dRitu,
	nTani )
{
	var nTuki;
	var nKikan;
	var nBonus;
	var dRitu;
	var dResult1;
	var dResult2;
	var sResult;

	// 必須入力のチェック
	if( JsCom_TextCheckNull( txtTuki,   "毎月のご返済希望額" ) == false ) return false;
	if( JsCom_TextCheckNumber( txtTuki, "毎月のご返済希望額" ) == false ) return false;

	if( dRitu == 0.0 ) {
		alert( "ローンの金利を選択してください。" );
		return false;
	}

	if( JsCom_IsNumber( parseInt( txtKikanY.value ) ) == false ) txtKikanY.value = 0;	// 年は省略可能：省略時は０
	if( JsCom_IsNumber( parseInt( txtKikanM.value ) ) == false ) txtKikanM.value = 0;	// 月は省略可能：省略時は０
	if( JsCom_IsNumber( parseInt( txtBonus.value  ) ) == false ) txtBonus.value = 0;	// ボーナスは省略可能：省略時は０
	if( JsCom_TextCheckInteger( txtKikanY,  "ご返済期間(年)" ) == false ) return false;
	if( JsCom_TextCheckInteger( txtKikanM,  "ご返済期間(月)" ) == false ) return false;
	if( JsCom_TextCheckInteger( txtBonus,   "ボーナス返済額" ) == false ) return false;

	// 入力範囲のチェック
	if( JsCom_TextCheckIntRange( txtKikanY,  nKikanMin,    nKikanMax,   "ご返済期間(年)"   ) == false ) return false;
	if( JsCom_TextCheckIntRange( txtKikanM,  0,            12,          "ご返済期間(月)"   ) == false ) return false;
	if( JsCom_TextCheckIntRange( txtBonus,   0,   parseInt( parseFloat( txtTuki.value ) * 6 ), "ボーナス返済額" ) == false ) return false;

	nKikan = parseInt( txtKikanY.value ) * 12 + parseInt( txtKikanM.value );

	if( nKikan > nKikanMax * 12 ){
		alert( "ご返済期間は最大" + nKikanMax + "年で入力してください。" );
		txtKikanY.focus();
		return false;
	}

	if( nKikan == 0 ){
		alert( "ご返済期間を入力してください。" );
		txtKikanY.focus();
		return false;
	}
	if( nKikan < 6 ){
		txtBonus.value = "0";
	}

	nTuki  = parseFloat( txtTuki.value ) * 10000;
	nBonus = 0;
	if( JsCom_IsSpace( txtBonus.value ) == false ) nBonus = parseInt( txtBonus.value ) * 10000;

	dRitu1 = dRitu / 100.0 / 12.0;
	dRitu2 = dRitu / 100.0 / 2.0;

	// 切捨てします
	dResult1 = parseInt( JsCom_funcPMT2( dRitu1, nKikan, nTuki ) );
	dResult2 = parseInt( JsCom_funcPMT2( dRitu2, parseInt( nKikan / 6 ), nBonus ) );
	sResult  = "" + ( dResult1 + dResult2 );
	
	// 単位で切り捨て
	sResult = ""+ Math.floor(parseInt( sResult ) / ( nTani * 10000 )) * ( nTani * 10000 );
	
	if( parseInt( sResult ) > nKingakuMax * 10000 ) sResult = "" + nKingakuMax * 10000;
	
	txtRetGaku.value = JsCom_FormatComma( sResult )


	return true;
}

// dRitu    : 利率：（年利%÷１００÷１２ヶ月を指定）
// nKaisuu  : 返済回数（月数）
// nKingaku : 借入金額（円）
function JsCom_funcPMT( dRitu, nKaisuu, nKingaku )
{
	var	dVal1;
	var	dVal2;

	dVal1 = Math.pow( dRitu + 1.0, nKaisuu );
	dVal2 = dVal1 - 1.0;

	return ( dRitu * nKingaku ) * ( dVal1 / dVal2 );
}
function JsCom_funcPMT2( dRitu, nKaisuu, nTuki )
{
	var	dVal1;
	var	dVal2;


	dVal1 = Math.pow( dRitu + 1.0, nKaisuu );
	dVal2 = dVal1 - 1.0;

	return 1 / ( dRitu * ( dVal1 / dVal2 ) / nTuki );
}

/////////////////////////////////////////////////////////////////////////////
//　空白チェック
//　パラメータ
//      sValue 文字列
//　戻り値
//      boolean :true :すべて空白文字列
//              :false:空白文字列以外の文字が含まれている
/////////////////////////////////////////////////////////////////////////////
function JsCom_IsSpace( sValue )
{
	var i;

	for( i = 0; i < sValue.length; i++ ){

		// １文字取り出す
		sWork = sValue.charAt( i );

		// 半角スペース又は全角スペースが含まれている場合
		if( sWork != ' ' && sWork != '' && sWork != '　'){
			return false;
		}
	}
	return true;
}

/////////////////////////////////////////////////////////////////////////////
//　文字列の数値チェック
//　パラメータ
//      sValue 文字列
//　戻り値
//      boolean :true :数値変換可能な文字列
//              :false:数値変換不可能な文字列
/////////////////////////////////////////////////////////////////////////////
function JsCom_IsNumber( sValue )
{
	if( isNaN( sValue ) == true ) {
		return false;
	}
	return true;
}


/////////////////////////////////////////////////////////////////////////////
//　文字列の数値（整数）チェック
//　パラメータ
//      sValue 文字列
//　戻り値
//      boolean :true :数値変換可能な文字列
//              :false:数値変換不可能な文字列
/////////////////////////////////////////////////////////////////////////////
function JsCom_IsInteger( sValue )
{
	if( JsCom_IsNumber( sValue ) == false ) {
		return false;
	}

	// 小数点が存在する場合はエラー
	if( sValue.indexOf( '.' ) >= 0 ){
		return false;
	}
	 
	return true;
}

/////////////////////////////////////////////////////////////////////////////
//　文字列の数値（整数と小数）チェック
//　パラメータ
//      sValue 文字列
//　戻り値
//      boolean :true :数値変換可能な文字列
//              :false:数値変換不可能な文字列
/////////////////////////////////////////////////////////////////////////////
function JsCom_IsInteger_decimal( sValue )
{
	if( JsCom_IsNumber( sValue ) == false ) {
		return false;
	}
	 
	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  必須入力チェック
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckNull( objText, sName )
{
	// 空白又は未入力だったらエラー
	if( JsCom_IsSpace( objText.value ) == true ){

		alert( sName + "を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  必須入力チェック
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_SelectCheckNull( objText, sName )
{
	if( objText.selectedIndex < 0 ){
		alert( sName + "を選択してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	// 空白又は未入力だったらエラー
	if( JsCom_IsSpace( objText.options[objText.selectedIndex].value ) == true ){

		alert( sName + "を選択してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  数値入力チェック
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckNumber( objText, sName )
{
	// 数値だったらエラー
	if( JsCom_IsNumber( objText.value ) == false ){

		alert( sName + "には数値を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}


/////////////////////////////////////////////////////////////////////////////
//  整数入力チェック
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckInteger( objText, sName )
{
	// 整数以外だったらエラー
	if( JsCom_IsInteger( objText.value ) == false ){

		alert( sName + "には整数を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  整数入力チェック(小数ありver)
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckInteger_decimal( objText, sName )
{
	// 整数以外だったらエラー
	if( JsCom_IsInteger_decimal( objText.value ) == false ){

		alert( sName + "には整数を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  実数範囲チェック
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckNumRange( objText, dSmall, dBig, sName )
{
	var nVal;

	// 整数以外だったらエラー
	if( JsCom_TextCheckNumber( objText, sName ) == false ){
		return false;
	}

	dVal = parseFloat( objText.value );
	if( dVal < dSmall || dBig < dVal ){
		alert( sName + "は " + dSmall.toString() + " 以上 " + dBig.toString() + " 以下を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  整数範囲チェック
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckIntRange( objText, nSmall, nBig, sName )
{
	var nVal;

	// 整数以外だったらエラー
	if( JsCom_TextCheckInteger( objText, sName ) == false ){
		return false;
	}

	nVal = parseInt( objText.value );
	if( nVal < nSmall || nBig < nVal ){

		alert( sName + "は " + nSmall.toString() + " 以上 " + nBig.toString() + " 以下を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  整数範囲チェック(小数あり)
//　パラメータ
//      objText　TEXTオブジェクト
//      sName  　項目名
//　戻り値
//      true  : 正しく入力されている
//      false : 正しく入力されていない
/////////////////////////////////////////////////////////////////////////////
function JsCom_TextCheckIntRange_decimal( objText, nSmall, nBig, sName )
{
	var nVal;

	// 整数以外だったらエラー
	if( JsCom_TextCheckInteger_decimal( objText, sName ) == false ){
		return false;
	}

	nVal = parseFloat( objText.value );
	if( nVal < nSmall || nBig < nVal ){

		alert( sName + "は " + nSmall.toString() + " 以上 " + nBig.toString() + " 以下を入力してください。" );
		if( objText.type.toUpperCase() != "HIDDEN" ) objText.focus();
		return false;
	}

	return true;
}

/////////////////////////////////////////////////////////////////////////////
//  数値整形：千単位の区切りにカンマを付ける
//  パラメータ
//      sValue  数値文字列
//  戻り値
//      千単位にカンマが付いた数値文字列
/////////////////////////////////////////////////////////////////////////////
function JsCom_FormatComma( sValue )
{
	var i      = 0;
	var nLen   = 0;
	var nIndex = 0;
	var nComma = 0;
	var sWork  = sValue;

	// 数値ではない場合、空白を返す
	if( JsCom_IsNumber( sWork ) == false ) return( "" );

	// 文字列の長さを取得
	nLen = sWork.length;

	// 小数点がある位置を取得
	nIndex = sWork.indexOf( '.' );

	// 小数点のある数値文字列の場合、小数点前までの文字列の長さを取得
	if( nIndex >= 0 ){
		nLen = nIndex;
	}

	// 文字列の長さが４文字以下の場合、処理を行なわない
	if( nLen < 4 ){
		return ( sWork );
	}

	// カンマが必要な最初の位置を調べる
	nComma = nLen % 3;
	if( nComma == 0 ){
		nComma = 3;	// 千単位
	}

	// 数値文字列が負でカンマ位置が"-"の後の場合、
	//  カンマが必要な位置を次の千単位まで移動する
	if( JsCom_Number( sWork ) < 0 && nComma == 1){
		nComma = nComma + 3;
	}

	// 千単位の区切りにカンマを付ける
	// 小数点のある数値文字列の場合、小数点前のまでの文字列にカンマをつける
	if( nIndex >= 0 ){
		for( i = nComma; i < sWork.indexOf( '.' ); i += nComma ){
			sWork = sWork.substring( 0, i ) + "," + sWork.substring( i, sWork.length );
			nComma = 3 + 1;	// 千単位 + カンマ文字数
		}
	}
	else{
		for( i = nComma; i < sWork.length; i += nComma ){
			sWork = sWork.substring( 0, i ) + "," + sWork.substring( i, sWork.length );
			nComma = 3 + 1;	// 千単位 + カンマ文字数
		}
	}

	return( sWork );
}

/////////////////////////////////////////////////////////////////////////////
//  文字列を数値に変換
//  パラメータ
//      sValue  数値変換可能な文字列(※ 最大１５桁)
//  戻り値
//      数値（IntまたはFloat）
/////////////////////////////////////////////////////////////////////////////
function JsCom_Number( sValue )
{
	var i;
	var nCount;
	var sWork;

	// 前方の"0"," "を削除するためそれ以外を探す
	nCount = 0;
	for( i = 0; i < sValue.length; i++ ){
		sWork = sValue.charAt( i );
		if( sWork == ' ' || sWork == '0' ){
			nCount++;
		}
		else {
			break;
		}
	}

	// すべて"0"又は" "だったら０（数値）を返す
	if( sValue.length == nCount ){
		return 0;
	}

	// 先頭の"0"又は" "を除外する
	sValue = sValue.substring( nCount, sValue.length );

	// 文字列が数値ではない場合０（数値）を返す
	if( JsCom_IsNumber( sValue ) == false ){
		return 0;
	}

	if( sValue.indexOf( '.' ) < 0 ){
		return parseInt( sValue );
	}
	else {
		return parseFloat( sValue );
	}
}

/////////////////////////////////////////////////////////////////////////////
//  数値整形：少数の桁そろえ
//  パラメータ
//      sValue  数値文字列
//      nFloat  少数桁
//  戻り値
//      JsCom_FormatFloat( "12",      3 ) = "12.000"
//      JsCom_FormatFloat( "12.3",    3 ) = "12.300"
//      JsCom_FormatFloat( "12.3456", 3 ) = "12.345"
/////////////////////////////////////////////////////////////////////////////
function JsCom_FormatFloat( sValue, nFloat )
{
	var nFloatLen = 0;	// 足りない桁数

	sWork = sValue;

	// 数値ではない場合、空白を返す
	if( JsCom_IsNumber( sWork ) == false ) return( "" );		

	// 文字列の長さを取得
	nLen = sWork.length;

	// 小数点がある位置を取得
	nIndex = sWork.indexOf( '.' );

	if( nFloat == 0 ) {
		sWork = sWork.substring( 0, nIndex );
		return( sWork );
	}

	// 小数点がない場合
	if( nIndex < 0 ) {
		nFloatLen = nFloat;
		sWork += ".";
	}
	else {
		nFloatLen = nFloat - ( nLen - nIndex - 1 );
	}

	if( nFloatLen == 0 ) return( sWork );
	if( nFloatLen > 0 ) {
		// 足りない分を補う
		for( var i = 0; i < nFloatLen; i++ ) {
			sWork += "0";
		}
	}
	else {
		sWork = sWork.substring( 0, nLen + nFloatLen );
	}
	


	return( sWork );
}

