//--------------------------------------------------------------------
// payAll(price)
// 一括払いのシミュレーション計算。HTML出力。
//--------------------------------------------------------------------
function payAll(price) {
	var risoku   = getRisokuAll(price);    // 利息
	var payPrice = price + risoku;         // 支払金額
	var payDate  = getPayDate(TODAY, 1);   // 支払日

	var url  = "javascript:void(window.open('minipay.html', null, 'width=570, height=340, menubar=no, toolbar=no, scrollbars=yes'));"
	var html = "";
	html += "<hr />";
	html += "<table class=\"inquiry3\">";
	html += "<tr>";
	html += "<td bgcolor=\"#EDEDED\" width=\"200\">ご利用日</td>";
	html += "<td width=\"120\" align=\"right\">";
	html += formatDateTime(TODAY);
	html += "</td>";
	html += "</tr>";
	html += "<tr>";
	html += "<td bgcolor=\"#EDEDED\">キャッシング<br>ご利用希望金額</td>";
	html += "<td align=\"right\">";
	html += formatNumber(price);
	html += " 円</td>";
	html += "</tr>";
	html += "</td>";
	html += "</tr>";
	html += "<tr>";
	html += "<td bgcolor=\"#EDEDED\">金利</td>";
	html += "<td align=\"right\">";
	html += formatDecimal(RATE * 100, 1) + " %";
	html += "</td>";
	html += "</tr>";
	html += "<tr>";
	html += "<td bgcolor=\"#EDEDED\">お支払金額合計</td>";
	html += "<td align=\"right\">";
	html += formatNumber(payPrice);
	html += " 円</td>";
	html += "</tr>";
	html += "<tr>";
	html += "<td bgcolor=\"#EDEDED\">お支払日</td>";
	html += "<td align=\"right\">";
	html += formatDateTime(payDate);
	html += "</td>";
	html += "</tr>";
	html += "<tr>";
	html += "<td bgcolor=\"#EDEDED\">お支払い回数</td>";
	html += "<td align=\"right\">";
	html += 1;
	html += " 回</td>";
	html += "</tr>";
//	html += "<tr>";
//	html += "<td bgcolor=\"#EDEDED\">お支払いコース</td>";
//	html += "<td align=\"right\">";
//	switch(PAY_COURSE) {
//		case 1:
//			html += "店頭支払";
//			break;
//		case 2:
//			html += "口座振替";
//			break;
//		default:
//			html += "？";
//	}
//	html += "</td>";
//	html += "</tr>";
	html += "</table>";
	
	return html;
}

//--------------------------------------------------------------------
// payMinimum(price)
// リボ払いのシミュレーション計算。HTML出力。
//--------------------------------------------------------------------
function payMinimum(price) {
	var zyutoPrice;                            // 元金充当額
	var risoku;                                // 利息
	var minimumPrice = getMinimumPrice(price); // ミニマムペイメント額
	var payPriceZan  = price;                  // 支払残金
	var gankinZan    = price;                  // 元金残高
	var payCount     = 0;                      // 支払回数
	var risokuSum    = 0;                      // 利息合計
	var payDate;                               // 支払日
	var parDateFirst;                          // 初回支払日
	var seikyuPrice  = minimumPrice;           // 請求額
	var payPriceSum  = 0;                      // 支払金額合計
	
	// 返済シミュレーション
	var url   = "javascript:void(window.open('minipay.html', null, 'width=570, height=340, menubar=no, toolbar=no, scrollbars=yes'));"
	var html2 = "";
	html2 += "<table class=\"inquiry3\">";
	html2 += "<tr>";
	html2 += "<td bgcolor=\"#EDEDED\" width=\"40\" align=\"center\">No</td>";
	html2 += "<td bgcolor=\"#EDEDED\" width=\"100\" align=\"center\">お支払い日</td>";
	html2 += "<td bgcolor=\"#EDEDED\" width=\"100\" align=\"center\">ご請求額<br><a href=\"" + url + "\"><font size=\"1\" color=\"red\">（計算方法について）</font></a></td>";
	html2 += "<td bgcolor=\"#EDEDED\" width=\"100\" align=\"center\">うち利息</td>";
	html2 += "<td bgcolor=\"#EDEDED\" width=\"120\" align=\"center\">お支払い後残高</td>";
	html2 += "</tr>";

	while (payPriceZan > 0) {
		payCount++;
		payDate = getPayDate(TODAY, payCount);   // 支払日
		if (payCount == 1) {
			payDateFirst = payDate;
		}

		risoku   = getRisokuMinimum(TODAY, gankinZan, payCount);
		if (risoku >= minimumPrice) {
			// 利息がミニマムペイメント額を上回った場合
			payPriceZan = payPriceZan;          // 支払残金
			seikyuPrice = risoku;               // 請求額
			zyutoPrice  = 0;                    // 元金充当額
			gankinZan   = gankinZan;            // 元金残高
		} else {
			// 利息がミニマムペイメント額を下回る場合
			payPriceZan = payPriceZan - (minimumPrice - risoku);
			if (payPriceZan < 0) {
				// 支払額がマイナスになった場合
				seikyuPrice = Math.abs(gankinZan) + risoku; // 請求額
				payPriceZan = 0;
			} else {
				seikyuPrice = minimumPrice;                 // 請求額
			}
			zyutoPrice  = seikyuPrice - risoku; // 元金充当額
			gankinZan   -= zyutoPrice;          // 元金残高
		}
		risokuSum   += risoku;                  // 利息合計
		payPriceSum += seikyuPrice;             // 請求額合計

		html2 += "<tr>";
		html2 += "<td align=\"right\">" + payCount + "</td>";
		html2 += "<td>" + formatDateTime(payDate) + "</td>";
		html2 += "<td align=\"right\">" + formatNumber(seikyuPrice) + "</td>";
		html2 += "<td align=\"right\">" + formatNumber(risoku) + "</td>";
		html2 += "<td align=\"right\">" + formatNumber(payPriceZan) + "</td>";
		html2 += "</tr>";
	}
	html2 += "</table>";
	
	// 利用日、利用金額、金利、支払金額合計、支払期間、支払回数、支払コース
	var html1 = "";
	html1 += "<table class=\"inquiry3\">";
	html1 += "<tr>";
	html1 += "<td bgcolor=\"#EDEDED\" width=\"200\">ご利用日</td>";
	html1 += "<td width=\"200\" align=\"right\">";
	html1 += formatDateTime(TODAY);
	html1 += "</td>";
	html1 += "</tr>";
	html1 += "<tr>";
	html1 += "<td bgcolor=\"#EDEDED\">キャッシング<br>ご利用希望金額</td>";
	html1 += "<td align=\"right\">";
	html1 += formatNumber(price);
	html1 += " 円</td>";
	html1 += "</tr>";
	html1 += "<tr>";
	html1 += "<td bgcolor=\"#EDEDED\">金利</td>";
	html1 += "<td align=\"right\">";
	html1 += formatDecimal(RATE * 100, 1) + " %";
	html1 += "</td>";
	html1 += "</tr>";
	html1 += "<tr>";
	html1 += "<td bgcolor=\"#EDEDED\">お支払金額合計</td>";
	html1 += "<td align=\"right\">";
	html1 += formatNumber(payPriceSum);
	html1 += " 円</td>";
	html1 += "</tr>";
	html1 += "<tr>";
	html1 += "<td bgcolor=\"#EDEDED\">お支払期間</td>";
	html1 += "<td align=\"center\">";
	html1 += formatDateTime(payDateFirst);
	html1 += " ～ ";
	html1 += formatDateTime(payDate);
	html1 += "</td>";
	html1 += "</tr>";
	html1 += "<tr>";
	html1 += "<td bgcolor=\"#EDEDED\">お支払い回数</td>";
	html1 += "<td align=\"right\">";
	html1 += payCount;
	html1 += " 回</td>";
	html1 += "</tr>";
//	html1 += "<tr>";
//	html1 += "<td bgcolor=\"#EDEDED\">お支払いコース</td>";
//	html1 += "<td align=\"right\">";
//	switch(PAY_COURSE) {
//		case 1:
//			html1 += "店頭支払";
//			break;
//		case 2:
//			html1 += "口座振替";
//			break;
//		default:
//			html1 += "？";
//	}
//	html1 += "</td>";
//	html1 += "</tr>";
	html1 += "</table>";
	
	// 上記とりまとめHTML出力
	var html = "";
	html += "<hr />";
	html += "<table>"
	html += "<tr>"
	html += "<td valign=\"top\">"
	html += html1;
	html += "</td>"
	html += "<td valign=\"top\">"
	html += html2;
	html += "</td>"
	html += "<tr>"
	html += "</table>"
	
	return html;
}

//--------------------------------------------------------------------
// getRisokuAll(price)
// 一括払いの利息計算
//--------------------------------------------------------------------
function getRisokuAll(price) {
	var fromDate = TODAY;
	var toDate   = getPayDate(fromDate, 1);
	var dayCount = dayDiff(fromDate, toDate) + 1;
	var risoku   = Math.floor(price * RATE / DAYS * dayCount);
	return risoku;
}

//--------------------------------------------------------------------
// getRisokuMinimum(startdate, price, count)
// リボ払いの利息計算
//--------------------------------------------------------------------
function getRisokuMinimum(startDate, price, count) {
	if (count == 1) {
		var fromDate = startDate;
		var toDate   = getPayDate(startDate, count);
		var dayCount = dayDiff(fromDate, toDate) + 1;
	} else {
		var fromDate = getPayDate(startDate, count - 1);
		fromDate     = dayAdd(fromDate, 1);
		var toDate   = getPayDate(startDate, count)
		var dayCount = dayDiff(fromDate, toDate) + 1;
	}
	var risoku = Math.floor(price * RATE / DAYS * dayCount);
	return risoku;
}

//--------------------------------------------------------------------
// getMinimumPrice(price)
// ミニマムペイメント額を算出する。
//--------------------------------------------------------------------
function getMinimumPrice(price) {
	var ret, pricesub;
	
	if(price > 400000) {
		pricesub = price - 400001;
		ret = 12000 + (Math.floor(pricesub / 100000) + 1) * 3000;
	} else if (price > 300000) {
		ret = 12000;
	} else if (price > 250000) {
		ret = 12000;
	} else if (price > 200000) {
		ret = 10000;
	} else if (price > 150000) {
		ret = 8000;
	} else if (price > 100000) {
		ret = 6000;
	} else if (price > 50000) {
		ret = 4000;
	} else {
		ret = 3000;
	}
	return ret;
}

//--------------------------------------------------------------------
// getPayDate(startDate, count)
// 支払日を返す。基本は10日。口振の場合は土日、祝日を考慮する。
//--------------------------------------------------------------------
function getPayDate(startDate, count) {
	var payDay = 10;  // 支払日
	
	var firstMonth = monthAdd(startDate, 2);
	if (count == 1) {
		var ret = firstMonth;
	} else {
		var ret = monthAdd(firstMonth, count - 1);
	}
	ret = new Date(ret.getFullYear(), ret.getMonth(), payDay);
	if (PAY_COURSE == 2) {
		ret = getNextPayDate(ret);
	}
	return ret
}

//--------------------------------------------------------------------
// getNextPayDate(target)
// 土曜日、日曜日、祝日を考慮。祝日設定はholiday.jsで指定。
//--------------------------------------------------------------------
function getNextPayDate(target){
	var ret = target;
	while (true) {
		if (ret.getDay() == 0) {
			ret = dayAdd(ret, 1);
		} else if (ret.getDay() == 6) {
			ret = dayAdd(ret, 1);
		} else {
			s = formatDateTime(ret);
			j = ret.getFullYear() - 2008;
			if (holiday[j] == undefined) {   // 休日マスターがメンテされていない場合のエラー回避
				break;
			}
			for (i = 0; i < 30; i++) {
				if (holiday[j][i] == s) {
					ret = dayAdd(ret, 1);
					break;
				}
			}
			break;
		}
	}
	return ret;
}

//--------------------------------------------------------------------
// formatNumber(x)
// 桁区切り文字を入れる
//--------------------------------------------------------------------
function formatNumber(x) {
    var s = "" + x;
    var p = s.indexOf(".");
    if (p < 0) {
        p = s.length;
    }
    var r = s.substring(p, s.length);
    for (var i = 0; i < p; i++) {
        var c = s.substring(p - 1 - i, p - 1 - i + 1);
        if (c < "0" || c > "9") {
            r = s.substring(0, p - i) + r;
            break;
        }
        if (i > 0 && i % 3 == 0) {
            r = "," + r;
        }
        r = c + r;
    }
    return r;
}

//--------------------------------------------------------------------
// formatDateTime(target)
// yyyy/mm/dd形式の文字列を返す。JavaScript特有の月カウントを考慮。
//--------------------------------------------------------------------
function formatDateTime(target) {
	var date;
	
	var month = target.getMonth() + 1; // JavaScriptでは月を0 - 11で処理するため
	date = String(target.getFullYear()) + "/" + lpad(String(month), 2, '0') + "/" + lpad(String(target.getDate()), 2, '0');

	return date;
}
//--------------------------------------------------------------------
// lpad(str, len, ch)
// 左文字埋めを行う。
//--------------------------------------------------------------------
function lpad(str, len, ch) {
	return new Array(len - ('' + str).length + 1).join(ch) + str
}

//--------------------------------------------------------------------
// dayAdd(target, n)
// 日付型データに対して日数加減算を行う。
//--------------------------------------------------------------------
function dayAdd(target, n){
	var milisec  = target.getTime();    // 対象日のミリ秒
	milisec += n * 1000 * 60 * 60 * 24; // 対象日に加えるミリ秒
	target.setTime(milisec);            // 加えた対象日の設定
	
	var year  = target.getFullYear();
	var month = target.getMonth() + 1;
	var day   = target.getDate();

	return new Date(year + "/" + month + "/" + day);
}

//--------------------------------------------------------------------
// monthAdd(target, n)
// 日付型データに対して月数加減算を行う。
//--------------------------------------------------------------------
function monthAdd(target, n){
	var year  = target.getFullYear();
	var month = target.getMonth() + 1 + n; // まず足してみる

	// 月計算
	if (month >= 13){ 
		// １３月の場合
		var value = Math.floor(parseFloat(month / 12));
		year += value;
		if(month == value * 12){
			year -= 1;
			month = 12;
		} else {
			month -= (12 * value);
		}
	} else {
		if (month <= 0) {
			// ０月の場合
			var value = Math.ceil(parseFloat(month / 12)) - 1;
			year     += value;
			month    += (12 * Math.abs(value));
		}
	}

	// 日計算
	var day = target.getDate();
	if (month == 2){
		// ２月の場合
		if (day > 28){
			return dayAdd(new Date(year + "/3/1"), -1)  
		} else {
			if (month < 10){month = "0" + month};
			if (day < 10){day = "0" + day};
			return new Date(year + "/" + month + "/" + day);
		}
	}else{
		if (month == 4 || month == 6 || month == 9 || month == 11){
			// 足した結果、４，６，９，１１月の場合、３１日の場合は３０日に。
			if (day == 31){
				day = 30;
			}
		} else {
			// 足した結果、１３月の場合、１年足して、１月にする。
			if (month >= 13){
				year  += 1;
				month -= 12;
			}
		}
		return new Date(year + "/" + month + "/" + day);
	}
}

//--------------------------------------------------------------------
// formatDecimal(num, places)
// 指定した小数部以下を切り捨てた結果を返す。汎用性なし。
//--------------------------------------------------------------------
function formatDecimal(num, places) {
	var s = num.toString();
	var l = s.indexOf(".");
	if (l < 0) {
		// 小数部がない場合
		var ret = s + ".";
		for (i = 0; i < places; i++) { ret += "0"; }
	} else {
		// 小数部がある場合
		var ret = s.substr(0, l + places + 1);
	}
	return ret
}

//--------------------------------------------------------------------
// dayDiff(fromdate, todate)
// 日付の引き算を行い、日数を返す。
//--------------------------------------------------------------------
function dayDiff(fromdate, todate){
	var fromms = fromdate.getTime();
	var toms   = todate.getTime();
	var diff   = (toms - fromms) / (1000 * 60 * 60 * 24);
	return Math.ceil(diff);
}

//--------------------------------------------------------------------
// isNumeric(num)
// 数値型か否かを返す。
//--------------------------------------------------------------------
function isNumeric(num){
	if (num.match(/[^0-9]/g)) {
		return false;
	}
	return true;
}

//--------------------------------------------------------------------
// trim()
// 両端の空白文字を削除。Stringオブジェクトの無名関数対応。
//--------------------------------------------------------------------
String.prototype.trim = function() {
	return this.replace(/^[\s　]+|[\s　]+$/g, "");
}

//--------------------------------------------------------------------
// ZenToHan(src)
//  英数字の全角→半角変換
//--------------------------------------------------------------------
function ZenToHan(src) {
	var str = new String;
	var len = src.length;
	for (var i = 0; i < len; i++) {
		var c = src.charCodeAt(i);
		if (c >= 65281 && c <= 65374 && c != 65340) {
			str += String.fromCharCode(c - 65248);
		} else if (c == 8217) {
			str += String.fromCharCode(39);
		} else if (c == 8221) {
			str += String.fromCharCode(34);
		} else if (c == 12288) {
			str += String.fromCharCode(32);
		} else if (c == 65507) {
			str += String.fromCharCode(126);
		} else if (c == 65509) {
			str += String.fromCharCode(92);
		} else {
			str += src.charAt(i);
		} 
	}
	return str;
}
//--------------------------------------------------------------------
// getRadioValue(radio)
// チェックボックスの設定を返す。
//--------------------------------------------------------------------
function getRadioValue(radio) {
	for(i = 0; i < radio.length; i++) {
	    if(radio[i].checked) {
	        return parseInt(radio[i].value);
	   }
	}
	return null;
}

