
function RequestContext() {
	this.request = null;
	this.form = null;
	this.dialog = null;
}

function formToParam(f) {
	var s = new Array();
	for (var i = 0, n = f.elements.length; i < n; i++) {
		var o = f.elements[i];
		if (o.name) {
			if (o.type == 'checkbox') {
				if (!o.checked) {
					continue;
				}
			}
			if (s.length > 0) {
				s.push(';');
			}
			s.push(o.name, '=', o.value);
		}
	}
	var params = s.join('');
	return params;
}

function doDelete() {

	DialogUtils.showConfirmDialog("現在のシミュレーションを削除しても宜しいですか？", "確認", execDelete);

//	if (!confirm()) {
//		return;
//	}
//
//	f.action = "./delete";
//	f.submit();
}
function execDelete() {
	var f = document.f;
	f.action = "/loan/delete";
	f.submit();
}

function doBookmark() {
	var f = document.f;
	f.action = "/bookmark/create/";
	f.submit();
}

function doCalc() {
	var f = document.f;
	var url = "/loan/calc";
	var params = formToParam(f);
	sendRequest(f, url, params);
}

function doSave() {
	DialogUtils.showConfirmDialog("シミュレーションを保存します。<BR><BR>住所、氏名、電話番号など個人を特定する情報が説明などに入力されていないかご確認ください。<BR><BR>万が一情報が漏洩しても当サイトでは一切責任を持てません。<BR><BR>同意の上で保存を行う場合は｢はい｣をクリックしてください。", "確認", execSave);
}

function execSave() {
	var f = document.f;
	var url = "/loan/calc";
	var params = formToParam(f);
	params += ';save=1';
	sendRequest(f, url, params);
}

function doResult(f) {
	var url = "/loan/result";
	var params = 'loanConfigSetId=' + f.loanConfigSetId.value;
	sendRequest(f, url, params);
}

function sendRequest(f, url, params) {
	if (_requestContext) {
		alert(_requestContext);
		return;
	}

	params = encodeURI(params);

	var request = createXMLHttpRequest();
	var requestContext = new RequestContext();

	_requestContext = requestContext;
	_requestContext.request = request;
	_requestContext.form = f;

	request.onreadystatechange = onReadyStateChange;
	request.open("POST", url, true);
	request.setRequestHeader('User-Agent', 'XMLHttpRequest');
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	// mod_perlの場合は必須

//	DialogUtils.showProgressDialog();
	var d = new ProgressMonitorDialog();
	d.setWindowTitle('メッセージ');
	d.setMessage('計算中です。しばらくお待ちください。');
	d.cancelPressed = _abort;
/*
	d.cancelPressed = function() {
		if (_requestContext != null) {
			_requestContext.request.abort();
			alert("abort");
		}
		_free();
	}
*/
	_requestContext.dialog = d;

	d.open();
	request.send(params);
}

function _abort() {
	if (_requestContext != null) {
		_requestContext.request.abort();
	}
	_free();
}
function _free() {
	if (_requestContext != null) {
//		alert("cancel");
		_requestContext.request = null;
		_requestContext.form = null;
		if (_requestContext.dialog != null) {
			_requestContext.dialog.close();
			_requestContext.dialog = null;
		}
		_requestContext = null;
	}
//		this.close();
}

var _requestContext;

function createXMLHttpRequest() {
	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
	    return new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
	    return new ActiveXObject("Microsoft.XMLHTTP");
	}
}

function onReadyStateChange() {
	if (!_requestContext) {
		return;
	}

	var requestContext = _requestContext;
	request = requestContext.request;
	if (request.readyState == 4) {
//		if (request.status == 200) {	// firefoxがabort時にバグ
		if (request.responseXML) {
//			alert(request.responseText);
			var rootNode = request.responseXML.documentElement;
			if (rootNode) {
				if (rootNode.tagName == 'errors') {
					var errorNodes = rootNode.getElementsByTagName('error');
//					alert(errorNodes[0].nodeName);
//					alert(errorNodes[0].firstChild.nodeValue);
					DialogUtils.showErrorDialog(errorNodes[0].firstChild.nodeValue);
				} else {
					revertResult(requestContext, rootNode);
					window.status = "計算を終了しました。";
				}
			}
		}

		_free();
/*
		if (_requestContext.dialog != null) {
			_requestContext.dialog.close();
			_requestContext.dialog = null;
		}
		_requestContext = null;
*/
	} else {
	    // まだ準備ができていません
	}
}

function revertResult(requestContext, rootNode) {
	var f = requestContext.form;
	var dialog = requestContext.dialog;

//	dialog.setMessage("計算結果を画面に反映しています。");
	window.status = "計算結果を画面に反映しています。";

	var loanConfigSet = getFirstElement(rootNode, 'loanConfigSet');
	if (!loanConfigSet) {
		return;
	}
	var loanConfigSetId = loanConfigSet.getAttribute("loanConfigSetId");
	f.loanConfigSetId.value = loanConfigSetId;

	var totalAmount = 0;
	var totalInterest = 0;
	var totalPrepayment = 0;
	var totalServiceFee = 0;
	var totalDanshin = 0;
	var totalPayment = 0;
	var maxAmount = 0;

	var bonusTotalAmount = 0;
	var bonusTotalInterest = 0;

	var loansNode = getFirstElement(rootNode, 'loans');
	if (!loansNode) {
		return;
	}

	var loanNodes = loansNode.getElementsByTagName('loan');

	var configNode0;
	var resultNode0;
	var detailsNode0;
	var firstResultNode0;
	if (loanNodes.length >= 1) {
		configNode0 = getFirstElement(loanNodes[0], 'loanConfig');
		var resultsNode = getFirstElement(loanNodes[0], 'loanResults');
		if (resultsNode) {
			var firstResultNode0 = getFirstElement(resultsNode, 'loanResult');
			var resultNode = getLastElement(resultsNode, 'loanResult');
			if (resultNode) {
				resultNode0 = resultNode;
				detailsNode0 = getFirstElement(resultNode, "details");

				totalAmount += parseInt(resultNode.getAttribute("totalAmount"));
				totalInterest += parseInt(resultNode.getAttribute("totalInterest"));
				totalPrepayment += parseInt(resultNode.getAttribute("totalPrepayment"));
				totalServiceFee += parseInt(resultNode.getAttribute("totalServiceFee"));
				totalDanshin += parseInt(resultNode.getAttribute("totalDanshin"));
				totalPayment += parseInt(resultNode.getAttribute("totalPayment"));
				maxAmount += parseInt(resultNode.getAttribute("maxAmount"));

				var bonusTotalAmountAttr = resultNode.getAttribute("bonusTotalAmount");
				if (bonusTotalAmountAttr != null) {
					bonusTotalAmount += parseInt(bonusTotalAmountAttr);
				}
				var bonusTotalInterestAttr = resultNode.getAttribute("bonusTotalInterest");
				if (bonusTotalInterestAttr != null) {
					bonusTotalInterest += parseInt(bonusTotalInterestAttr);
				}
			}
		}
	}

	var configNode1;
	var resultNode1;
	var detailsNode1;
	var firstResultNode1;
	if (loanNodes.length >= 2) {
		configNode1 = getFirstElement(loanNodes[1], 'loanConfig');
		var resultsNode = getFirstElement(loanNodes[1], 'loanResults');
		if (resultsNode) {
			var firstResultNode1 = getFirstElement(resultsNode, 'loanResult');
			var resultNode = getLastElement(resultsNode, 'loanResult');
			if (resultNode) {
				resultNode1 = resultNode;
				detailsNode1 = getFirstElement(resultNode, "details");

				totalAmount += parseInt(resultNode.getAttribute("totalAmount"));
				totalInterest += parseInt(resultNode.getAttribute("totalInterest"));
				totalPrepayment += parseInt(resultNode.getAttribute("totalPrepayment"));
				totalServiceFee += parseInt(resultNode.getAttribute("totalServiceFee"));
				totalDanshin += parseInt(resultNode.getAttribute("totalDanshin"));
				totalPayment += parseInt(resultNode.getAttribute("totalPayment"));
				maxAmount += parseInt(resultNode.getAttribute("maxAmount"));

				var bonusTotalAmountAttr = resultNode.getAttribute("bonusTotalAmount");
				if (bonusTotalAmountAttr != null) {
					bonusTotalAmount += parseInt(bonusTotalAmountAttr);
				}
				var bonusTotalInterestAttr = resultNode.getAttribute("bonusTotalInterest");
				if (bonusTotalInterestAttr != null) {
					bonusTotalInterest += parseInt(bonusTotalInterestAttr);
				}
			}
		}
	}

	var p = document.getElementById('graph1');
	while (p.firstChild) {
		p.removeChild(p.firstChild);
	}
	var graph1 = null;
	if (document.getElementById("showGraph").checked) {
//		if (totalAmount > 0) {
			graph1 = new Graph();
			graph1.y_label_callback = graphYLabelCallback;
//			alert(totalAmount + bonusTotalAmount - totalInterest - bonusTotalInterest);
			graph1.y_axis_max = Math.ceil((totalPrepayment + totalAmount + bonusTotalAmount - totalInterest - bonusTotalInterest) / 10000000) * 10000000;
//			alert(graph1.y_axis_max);
			graph1.y_axis_unit = graph1.y_axis_max / 10;
			graph1.build(p);
//		}
	}

	var p = document.getElementById('graph2');
	while (p.firstChild) {
		p.removeChild(p.firstChild);
	}
	var graph2 = null;
	if (document.getElementById("showGraph").checked) {
		if (maxAmount > 0) {
			graph2 = new Graph();
			graph2.y_label_callback = graphYLabelCallback;
			graph2.y_axis_max = Math.ceil((maxAmount / 50000)) * 50000;
			graph2.y_axis_unit = graph2.y_axis_max / 10;
			graph2.build(p);
		}
	}

/*
	var graph2 = new Graph();
	graph2.y_axis_max = 200000;
	graph2.y_axis_unit = 20000;
*/

	clearChangeConfig(f);
	revertLoanConfig(f, configNode0, "0");
	revertLoanConfig(f, configNode1, "1");

	revertLoanResult(f, resultNode0, "0", firstResultNode0);
	revertLoanResult(f, resultNode1, "1", firstResultNode1);

	revertLoanResultDetails(f, detailsNode0, detailsNode1, dialog, graph1, graph2);

	setValue("totalAmount", formatCurrency(totalAmount));
	setValue("totalInterest", formatCurrency(totalInterest));
	setValue("totalPrepayment", formatCurrency(totalPrepayment));
	setValue("totalServiceFee", formatCurrency(totalServiceFee));
	setValue("totalDanshin", formatCurrency(totalDanshin));
	setValue("totalPayment", formatCurrency(totalPayment));
	setValue("bonusTotalAmount", formatCurrency(bonusTotalAmount));
	setValue("bonusTotalInterest", formatCurrency(bonusTotalInterest));

	var loginId = document.getElementById("userId").value;
	var saveButton = document.getElementById("saveButton");
	var deleteButton = document.getElementById("deleteButton");
	var userId = loanConfigSet.getAttribute("userId")
	if ((userId == null) || (userId != loginId)) {
		if (saveButton) {
			saveButton.disabled = true;
		}
		if (deleteButton) {
			deleteButton.disabled = true;
		}
	} else {
		if (saveButton) {
			saveButton.disabled = false;
		}
		if (deleteButton) {
			if (loanConfigSetId) {
				deleteButton.disabled = false;
			} else {
				deleteButton.disabled = true;
			}
		}
	}


/*
	if (Smatch) {
		Smatch.searchWithTimer();
	}
*/
}

function graphYLabelCallback(value) {
	return formatCurrency(value);
}
function revertLoanConfig(f, configNode, index) {
	if (configNode != null) {
		var changesNode = getFirstElement(configNode, 'changes');
		if (changesNode != null) {
			var changeNodes = changesNode.getElementsByTagName('prepayment');
//alert('1.changeNodes=' + changeNodes);
			if (changeNodes != null) {
//alert('2.changeNodes.length=' + changeNodes.length);
				for (var i = 0, n = changeNodes.length; i < n; i++) {
					var changeNode = changeNodes[i];
					revertChangeConfig(f, changeNode, index);
				}
			}
		}
	} else {
		
	}
}

function clearChangeConfig(f) {
	for (var i = 1; i <= 100; i++) {
		var changeConfigIdElement = f.elements["changeConfigId" + i];
		if (changeConfigIdElement == null) {
			break;
		}
		var changeTypeElement = f.elements["changeType" + i];
		if (changeTypeElement.value == '0') {
			changeConfigIdElement.value = "";
		}
	}
}

function revertChangeConfig(f, changeNode, index) {
	var changeConfigId = changeNode.getAttribute("changeConfigId");
	var changeType = changeNode.getAttribute("changeType");
	var changeDate = changeNode.getAttribute("changeDate");

	var changeLoanIndexElements = $A(f.elements["changeLoanIndex"]);
	var changeDateElements = $A(f.elements["changeDate"]);
	var changeTypeElements = $A(f.elements["changeType"]);
	var changeConfigIdElements = $A(f.elements["changeConfigId"]);

//alert("changeConfigId=" + changeConfigId);

	for (var i = 0, n = changeLoanIndexElements.length; i < n; i++) {
		var changeLoanIndexElement = changeLoanIndexElements[i];
		if (changeLoanIndexElement == null) {
//			alert(i);
			break;
		}
		if (changeLoanIndexElement.value != index) {
			continue;
		}
//alert("a." + changeLoanIndexElement.value + ", " + index);

		var changeTypeElement = changeTypeElements[i];
//alert("b." + changeTypeElement.value + ", " + changeType);
		if (changeTypeElement.value != changeType) {
			continue;
		}

		var changeDateElement = changeDateElements[i];
//alert("c." + changeDateElement.value + ", " + changeDate);
		if (changeDateElement.value != changeDate) {
			continue;
		}

		var changeConfigIdElement = changeConfigIdElements[i];
		if (changeConfigIdElement == null) {
			continue;
		}

//alert("icchi");
		changeConfigIdElement.value = changeConfigId;
		break;
	}
}

function revertLoanResult(f, resultNode, index, firstResultNode) {

	
//	var prepayment = 0;
	if (resultNode) {
//		prepayment = parseInt(resultNode.getAttribute("totalPrepayment"));
//		if (isNaN(prepayment)) {
//			prepayment = 0;
//		}

		setValue("totalAmount" + index, formatCurrency(resultNode.getAttribute("totalAmount")));
		setValue("totalInterest" + index, formatCurrency(resultNode.getAttribute("totalInterest")));
		setValue("bonusTotalAmount" + index, formatCurrency(resultNode.getAttribute("bonusTotalAmount")));
		setValue("bonusTotalInterest" + index, formatCurrency(resultNode.getAttribute("bonusTotalInterest")));
		setValue("totalPrepayment" + index, formatCurrency(resultNode.getAttribute("totalPrepayment")));
		setValue("totalServiceFee" + index, formatCurrency(resultNode.getAttribute("totalServiceFee")));
		setValue("totalDanshin" + index, formatCurrency(resultNode.getAttribute("totalDanshin")));
		setValue("lastPayDate" + index, resultNode.getAttribute("lastPayDate"));
		setValue("totalPayCount" + index, formatCurrency(resultNode.getAttribute("totalPayCount")));
		setValue("totalPayment" + index, formatCurrency(resultNode.getAttribute("totalPayment")));
	} else {
		setValue("totalAmount" + index, "");
		setValue("totalInterest" + index, "");
		setValue("bonusTotalAmount" + index, "");
		setValue("bonusTotalInterest" + index, "");
		setValue("totalPrepayment" + index, "");
		setValue("totalServiceFee" + index, "");
		setValue("totalDanshin" + index, "");
		setValue("lastPayDate" + index, "");
		setValue("totalPayCount" + index, "");
		setValue("totalPayment" + index, "");
	}

//	if ((prepayment > 0) && (firstResultNode != resultNode)) {
	if (firstResultNode != resultNode) {
		setValue("normalTotalAmount" + index, formatCurrency(firstResultNode.getAttribute("totalAmount")));
		setValue("normalTotalInterest" + index, formatCurrency(firstResultNode.getAttribute("totalInterest")));
		setValue("normalTotalDanshin" + index, formatCurrency(firstResultNode.getAttribute("totalDanshin")));
		setValue("normalTotalPayment" + index, formatCurrency(firstResultNode.getAttribute("totalPayment")));
		setValue("normalSub" + index, formatCurrency(parseInt(firstResultNode.getAttribute("totalPayment")) - parseInt(resultNode.getAttribute("totalPayment"))));
	} else {
		setValue("normalTotalAmount" + index, "");
		setValue("normalTotalInterest" + index, "");
		setValue("normalTotalDanshin" + index, "");
		setValue("normalTotalPayment" + index, "");
		setValue("normalSub" + index, "");
	}
}

function YearSum() {
}
YearSum.prototype.payCount;
YearSum.prototype.payDate;
YearSum.prototype.capital = 0;
YearSum.prototype.interest = 0;
YearSum.prototype.amount = 0;
YearSum.prototype.balance = 0;
YearSum.prototype.bonusCapital = 0;
YearSum.prototype.bonusInterest = 0;
YearSum.prototype.bonusBalance = 0;
YearSum.prototype.balanceSum = 0;
YearSum.prototype.other = 0;
YearSum.prototype.clear = function() {
	this.payCount = null;
	this.payDate = null;
	this.capital = 0;
	this.interest = 0;
	this.amount = 0;
	this.balance = 0;
	this.other = 0;
	this.bonusCapital = 0;
	this.bonusInterest = 0;
	this.bonusBalance = 0;
	this.balanceSum = 0;
};

function revertLoanResultDetails(f, detailsNode0, detailsNode1, dialog, graph1, graph2) {

	var detailTableYear = document.getElementById("detailTableYear");
	var y_rows = detailTableYear.tBodies[0].rows;

	var detailTable = document.getElementById("detailTable");
	if (!detailTable) {
		return;
	}
	var tbody = detailTable.tBodies[0];
	var rows = tbody.rows;

	detailTableYear.style.visibility = 'hidden';
	detailTable.style.visibility = 'hidden';


	var firstPayDate;
	var payCount = 0;
	var d0;
	var yearSum0;
	if (detailsNode0) {
		d0 = detailsNode0.firstChild;
		var payDate = new Date(d0.getAttribute("date"));
		if ((firstPayDate == null) || (payDate.getTime() < firstPayDate.getTime())) {
			firstPayDate = payDate;
		}
		yearSum0 = new YearSum();
	}

	var d1;
	var yearSum1;
	if (detailsNode1) {
		d1 = detailsNode1.firstChild;
		var payDate = new Date(d1.getAttribute("date"));
		if ((firstPayDate == null) || (payDate.getTime() < firstPayDate.getTime())) {
			firstPayDate = payDate;
		}
		yearSum1 = new YearSum();
	}

	var birthDay = new Date(f.loanConfigSet_birthDay.value);
	if (isNaN(birthDay)) {
		birthDay = null;
	}
	var payDate = new Date(firstPayDate.getFullYear(), firstPayDate.getMonth(), 1);
	var nextDate = new Date(firstPayDate.getFullYear(), firstPayDate.getMonth(), 1);
	DateUtils.addMonth(nextDate, 1);

	var graph1Values = new Array(2);
	var graph2Values1 = new Array(2);

	for (var i = 0, n = rows.length; i < n; i++) {
		var amari = i % 12;
		if (amari == 0) {
			window.status = "計算結果の詳細を反映しています。" + i;
		}

		var row = rows[i];
		var cells = row.cells;

		var amountSum = 0;
		var balanceSum = 0;
		var prerepaymentSum = 0;
		var danshinSum = 0;

		payCount++;

		graph2Values1[0] = 0;
		graph2Values1[1] = 0;

		var current0 = null;
		var others0 = null;
		graph1Values[0] = 0;
		while (d0 != null) {
			var payDate0 = new Date(d0.getAttribute("date"));
			if ((payDate.getTime() <= payDate0.getTime()) && (payDate0.getTime() < nextDate.getTime())) {
				var tagName = d0.tagName;
				if (tagName == "detail") {
					amountSum += parseInt(d0.getAttribute("amountSum"));
					balanceSum += parseInt(d0.getAttribute("balanceSum"));

					var danshin = d0.getAttribute("danshin");
					if ((danshin != null) && (danshin.length > 0)) {
						danshinSum += parseInt(danshin);
					}
					current0 = d0;

					graph1Values[0] = parseInt(d0.getAttribute("balanceSum"));
					graph2Values1[0] += parseInt(d0.getAttribute("interest"));
					graph2Values1[1] += parseInt(d0.getAttribute("capital"));
				} else {
					if (others0 == null) {
						others0 = new Array();
					}
					others0.push(d0);
					if ((tagName == 'previousReduce') || (tagName == 'previousRecalc')) {
						prerepaymentSum += parseIntEx(d0.getAttribute("capital")) + parseIntEx(d0.getAttribute("serviceFee")) + parseIntEx(d0.getAttribute("pastedInterest"));
					}
				}
				d0 = d0.nextSibling;
			} else {
				break;
			}
		}
		revertLoanResultDetail(cells, current0, 4, others0, yearSum0, amari);

		var current1 = null;
		var others1 = null;
		graph1Values[1] = 0;
		while (d1 != null) {
			var payDate0 = new Date(d1.getAttribute("date"));
			if ((payDate.getTime() <= payDate0.getTime()) && (payDate0.getTime() < nextDate.getTime())) {
				var tagName = d1.tagName;
				if (tagName == "detail") {
					amountSum += parseInt(d1.getAttribute("amountSum"));
					balanceSum += parseInt(d1.getAttribute("balanceSum"));

					var danshin = d1.getAttribute("danshin");
					if ((danshin != null) && (danshin.length > 0)) {
						danshinSum += parseInt(danshin);
					}
					current1 = d1;

					graph1Values[1] = parseInt(d1.getAttribute("balanceSum"));
					graph2Values1[0] += parseInt(d1.getAttribute("interest"));
					graph2Values1[1] += parseInt(d1.getAttribute("capital"));
				} else {
					if (others1 == null) {
						others1 = new Array();
					}
					others1.push(d1);
					if ((tagName == 'previousReduce') || (tagName == 'previousRecalc')) {
						prerepaymentSum += parseIntEx(d1.getAttribute("capital")) + parseIntEx(d1.getAttribute("serviceFee")) + parseIntEx(d1.getAttribute("pastedInterest"));
					}
				}
				d1 = d1.nextSibling;
			} else {
				break;
			}
		}
		revertLoanResultDetail(cells, current1, 16, others1, yearSum1, amari);
/*
		var current1 = null;
		var others1 = null;
		graph1Values[1] = 0;
		while (d1 != null) {
			var payDate1 = new Date(d1.getAttribute("date"));
			if ((payDate.getTime() <= payDate1.getTime()) && (payDate1.getTime() < nextDate.getTime())) {
				var tagName = d1.tagName;
				if (tagName == "detail") {
					amountSum += parseInt(d1.getAttribute("amountSum"));
					balanceSum += parseInt(d1.getAttribute("balanceSum"));

					var danshin = d1.getAttribute("danshin");
					if ((danshin != null) && (danshin.length > 0)) {
						danshinSum += parseInt(danshin);
					}
					current1 = d1;

					graph1Values[1] = parseInt(d1.getAttribute("balanceSum"));
					graph2Values1[0] += parseInt(d1.getAttribute("interest"));
					graph2Values1[1] += parseInt(d1.getAttribute("capital"));
				} else {
					if (others1 == null) {
						others1 = new Array();
					}
					others1.push(d1);
					if ((tagName == 'previousReduce') || (tagName == 'previousRecalc')) {
						prerepaymentSum += parseIntEx(d1.getAttribute("capital")) + parseIntEx(d1.getAttribute("serviceFee")) + parseIntEx(d1.getAttribute("pastedInterest"));
					}
				}
				d1 = d1.nextSibling;
			} else {
				break;
			}
		}
		revertLoanResultDetail(cells, current1, 16, others1, yearSum1, amari);
*/

		// detail
		var yearCount = "";
		var payDateStr = "";
		var birthDayStr = "";
		if (current0 || current1) {
			payDateStr = DateUtils.formatYM(payDate);
			cells[0].innerHTML = payDateStr;

			yearCount = Math.floor(DateUtils.diffMonth(payDate, firstPayDate) / 12) + 1;
			cells[1].innerHTML = yearCount;

			if (birthDay != null) {
				birthDayStr = Math.floor(DateUtils.diffMonth(payDate, birthDay) / 12);
				cells[2].innerHTML = birthDayStr;
			} else {
				cells[2].innerHTML = "";
			}

			cells[28].innerHTML = formatCurrency(amountSum);
			cells[29].innerHTML = formatCurrency(balanceSum);
			cells[30].innerHTML = formatCurrency(prerepaymentSum + danshinSum);
		} else {
			cells[0].innerHTML = "&nbsp;";
			cells[1].innerHTML = "";
			cells[2].innerHTML = "";
			cells[28].innerHTML = "";
			cells[29].innerHTML = "";
			cells[30].innerHTML = "";
		}

		// year total
		if (amari == 0) {
			var yearRow = Math.floor(i / 12);
			var y_cells = y_rows[yearRow].cells;
			y_cells[0].innerHTML = payDateStr;
			y_cells[1].innerHTML = yearCount;
			y_cells[2].innerHTML = birthDayStr;
		} else if (amari == 11) {
			var yearRow = Math.floor(i / 12);
			var y_cells = y_rows[yearRow].cells;

			var amountYearSum = 0;
			var balanceYearSum = 0;
			var otherYearSum = 0;
			var sumExists = false;

			if ((yearSum0 != null) && (yearSum0.payCount != null)) {
				y_cells[4].innerHTML = yearSum0.payCount;
				y_cells[5].innerHTML = yearSum0.payDate;
				y_cells[6].innerHTML = formatCurrency(yearSum0.amount);
				y_cells[7].innerHTML = formatCurrency(yearSum0.capital);
				y_cells[8].innerHTML = formatCurrency(yearSum0.interest);
				y_cells[9].innerHTML = formatCurrency(yearSum0.bonusCapital);
				y_cells[10].innerHTML = formatCurrency(yearSum0.bonusInterest);
				y_cells[11].innerHTML = formatCurrency(yearSum0.balance);
				y_cells[12].innerHTML = formatCurrency(yearSum0.bonusBalance);
				y_cells[13].innerHTML = formatCurrency(yearSum0.balanceSum);
				y_cells[14].innerHTML = formatCurrency(yearSum0.other);
				amountYearSum += yearSum0.amount;
				balanceYearSum += yearSum0.balance;
				otherYearSum += yearSum0.other;
				yearSum0.clear();
				sumExists = true;
			} else {
				y_cells[4].innerHTML = "";
				y_cells[5].innerHTML = "";
				y_cells[6].innerHTML = "";
				y_cells[7].innerHTML = "";
				y_cells[8].innerHTML = "";
				y_cells[9].innerHTML = "";
				y_cells[10].innerHTML = "";
				y_cells[11].innerHTML = "";
				y_cells[12].innerHTML = "";
				y_cells[13].innerHTML = "";
				y_cells[14].innerHTML = "";
			}

			if ((yearSum1 != null) && (yearSum1.payCount != null)) {
				y_cells[16].innerHTML = yearSum1.payCount;
				y_cells[17].innerHTML = yearSum1.payDate;
				y_cells[18].innerHTML = formatCurrency(yearSum1.amount);
				y_cells[19].innerHTML = formatCurrency(yearSum1.capital);
				y_cells[20].innerHTML = formatCurrency(yearSum1.interest);
				y_cells[21].innerHTML = formatCurrency(yearSum1.bonusCapital);
				y_cells[22].innerHTML = formatCurrency(yearSum1.bonusInterest);
				y_cells[23].innerHTML = formatCurrency(yearSum1.balance);
				y_cells[24].innerHTML = formatCurrency(yearSum1.bonusBalance);
				y_cells[25].innerHTML = formatCurrency(yearSum1.balanceSum);
				y_cells[26].innerHTML = formatCurrency(yearSum1.other);
				amountYearSum += yearSum1.amount;
				balanceYearSum += yearSum1.balance;
				otherYearSum += yearSum1.other;
				yearSum1.clear();
				sumExists = true;
			} else {
				y_cells[16].innerHTML = "";
				y_cells[17].innerHTML = "";
				y_cells[18].innerHTML = "";
				y_cells[19].innerHTML = "";
				y_cells[20].innerHTML = "";
				y_cells[21].innerHTML = "";
				y_cells[22].innerHTML = "";
				y_cells[23].innerHTML = "";
				y_cells[24].innerHTML = "";
				y_cells[25].innerHTML = "";
				y_cells[26].innerHTML = "";
			}

/*
			if ((yearSum1 != null) && (yearSum1.payCount != null)) {
				y_cells[12].innerHTML = yearSum1.payCount;
				y_cells[13].innerHTML = yearSum1.payDate;
				y_cells[14].innerHTML = formatCurrency(yearSum1.capital);
				y_cells[15].innerHTML = formatCurrency(yearSum1.interest);
				y_cells[16].innerHTML = formatCurrency(yearSum1.amount);
				y_cells[17].innerHTML = formatCurrency(yearSum1.balance);
				y_cells[18].innerHTML = formatCurrency(yearSum1.other);
				amountYearSum += yearSum1.amount;
				balanceYearSum += yearSum1.balance;
				otherYearSum += yearSum1.other;
				yearSum1.clear();
				sumExists = true;
			} else {
				y_cells[12].innerHTML = "";
				y_cells[13].innerHTML = "";
				y_cells[14].innerHTML = "";
				y_cells[15].innerHTML = "";
				y_cells[16].innerHTML = "";
				y_cells[17].innerHTML = "";
				y_cells[18].innerHTML = "";
			}
*/
			
			if (sumExists) {
				y_cells[28].innerHTML = formatCurrency(amountYearSum);
				y_cells[29].innerHTML = formatCurrency(balanceYearSum);
				y_cells[30].innerHTML = formatCurrency(otherYearSum);
			} else {
				y_cells[28].innerHTML = "&nbsp;";
				y_cells[29].innerHTML = "";
				y_cells[30].innerHTML = "";
			}
		}

		// graph1
		if (graph1 != null) {
			graph1.plot(i, graph1Values);
		}

		// graph2
		if (graph2 != null) {
			graph2.plot(i, graph2Values1);
		}

		DateUtils.addMonth(payDate, 1);
		DateUtils.addMonth(nextDate, 1);
	}

	detailTableYear.style.visibility = 'visible';
	detailTable.style.visibility = 'visible';
}

function revertLoanResultDetail(cells, detail, index, others, yearSum, amari) {
	if (detail != null) {

		var payDate = detail.getAttribute("date");
		var amountSum = detail.getAttribute("amountSum");
		yearSum.amount += parseInt(amountSum);
		var balanceSum = detail.getAttribute("balanceSum");
		yearSum.balanceSum = balanceSum;

		var payCount = detail.getAttribute("payCount");
		var capital = "";
		var interest = "";
		var balance = "";
		if (payCount != "") {
			capital = detail.getAttribute("capital");
			interest = detail.getAttribute("interest");
			balance = detail.getAttribute("balance");

			yearSum.capital += parseInt(capital);
			yearSum.interest += parseInt(interest);
			yearSum.balance = parseInt(balance);
		}


		var bonusPayCount = detail.getAttribute("bonusPayCount");
		var bonusCapital = "";
		var bonusInterest = "";
		var bonusBalance = "";
		if ((bonusPayCount != null) && (bonusPayCount != "")) {
			bonusCapital = detail.getAttribute("bonusCapital");
			bonusInterest = detail.getAttribute("bonusInterest");
			bonusBalance = detail.getAttribute("bonusBalance");

			yearSum.bonusCapital += parseInt(bonusCapital);
			yearSum.bonusInterest += parseInt(bonusInterest);
			yearSum.bonusBalance = parseInt(bonusBalance);
		}

		if (amari == 0) {
			yearSum.payCount = payCount;
			yearSum.payDate = payDate;
		}

		cells[index].innerHTML = payCount;
		cells[index + 1].innerHTML = payDate;
		cells[index + 2].innerHTML = formatCurrency(amountSum);
		cells[index + 3].innerHTML = formatCurrency(capital);
		cells[index + 4].innerHTML = formatCurrency(interest);
		cells[index + 5].innerHTML = formatCurrency(bonusCapital);
		cells[index + 6].innerHTML = formatCurrency(bonusInterest);
		cells[index + 7].innerHTML = formatCurrency(balance);
		cells[index + 8].innerHTML = formatCurrency(bonusBalance);
		cells[index + 9].innerHTML = formatCurrency(balanceSum);

		var s = new Array();

		var danshin = detail.getAttribute("danshin");
		if ((danshin != null) && (danshin != "")) {
			s.push("<DIV>団信: " + formatCurrency(danshin) + "</DIV>");
			yearSum.other += parseInt(danshin);
		}

		if (others != null) {
			for (var i = 0, n = others.length; i < n; i++) {
				var other = others[i];
				var tagName = other.tagName;
				if ((tagName == 'previousReduce') || (tagName == 'previousRecalc')) {
					if (tagName == 'previousReduce') {
						s.push("<B>繰上　期間短縮</B>");
					} else {
						s.push("<B>繰上　再計算</B>");
					}
					var capital = parseInt(other.getAttribute("capital"));
					if (!isNaN(capital)) {
						s.push("<DIV>繰上額: " + formatCurrency(capital) + "</DIV>");
						yearSum.other += capital;
					}
					var serviceFee = parseInt(other.getAttribute("serviceFee"));
					if (!isNaN(serviceFee)) {
						s.push("<DIV>手数料: " + formatCurrency(serviceFee) + "</DIV>");
						yearSum.other += serviceFee;
					}
					var pastedInterest = parseInt(other.getAttribute("pastedInterest"));
					if (!isNaN(pastedInterest)) {
						s.push("<DIV>経過利息: " + formatCurrency(pastedInterest) + "</DIV>");
						yearSum.other += pastedInterest;
					}
					var balance = parseInt(other.getAttribute("balance"));
					if (!isNaN(balance)) {
						s.push("<DIV>残高: " + formatCurrency(balance) + "</DIV>");
						yearSum.balance = parseInt(balance);
					}
				} if (tagName == 'rateRecalc') {
					s.push("<B>返済方法変更</B>");
					var rate = other.getAttribute("rate");
					s.push("<DIV>金利: " + rate + "</DIV>");

					var payType = other.getAttribute("payType");
					if (payType != null) {
						if (payType == "1") {
							s.push("<DIV>返済方法: 元利均等返済</DIV>");
						} else if (payType == "2") {
							s.push("<DIV>返済方法: 元金均等返済</DIV>");
						}
					}
					var serviceFee = parseInt(other.getAttribute("serviceFee"));
					if (!isNaN(serviceFee)) {
						s.push("<DIV>手数料: " + formatCurrency(serviceFee) + "</DIV>");
						yearSum.other += serviceFee;
					}
				}
			}
		}
		if (s.length > 0) {
			cells[index + 10].innerHTML = s.join("");
		} else {
			cells[index + 10].innerHTML = "";
		}
	} else {
		for (var i = 0; i < 11; i++) {
			cells[index + i].innerHTML = "";
		}
	}
}

function getFirstElement(node, tagName) {
	var child = node.getElementsByTagName(tagName);
	if ((child) && (child.length > 0)) {
		return child[0];
	}
	return null;
}

function getLastElement(node, tagName) {
	var child = node.getElementsByTagName(tagName);
	if ((child) && (child.length > 0)) {
		return child[child.length - 1];
	}
	return null;
}

function getElementValue(node, tagName) {
	var e = getFirstElement(node, tagName);
	if ((e) && (e.firstChild)) {
		return e.firstChild.nodeValue;
	}
	return null;
}

function getValue(id) {
	var o = document.getElementById(id);
	if (o) {
		return o.innerHTML;
	}
}
function setValue(id, value) {
	var o = document.getElementById(id);
	if (o) {
		o.innerHTML = value;
	}
}

function formatCurrency(num) { 
	if ((num == null) || (num == "null")) { 
		return ""; 
	} 

	num = num + "";
	var sign = "";
	if (num.charAt(0) == "-") {
		sign = "-";
		num = num.substr(1);
	}

	switch(num.length) {
	case 0:
	case 1:
	case 2:
	case 3:
		return sign + num;
	case 4:
		return sign + num.substr(0, 1) + "," + num.substr(1, 3);
	case 5:
		return sign + num.substr(0, 2) + "," + num.substr(2, 3);
	case 6:
		return sign + num.substr(0, 3) + "," + num.substr(3, 3);
	case 7:
		return sign + num.substr(0, 1) + "," + num.substr(1, 3) + "," + num.substr(4, 3);
	case 8:
		return sign + num.substr(0, 2) + "," + num.substr(2, 3) + "," + num.substr(5, 3);
	case 9:
		return sign + num.substr(0, 3) + "," + num.substr(3, 3) + "," + num.substr(6, 3);
	case 10:
		return sign + num.substr(0, 1) + "," + num.substr(1, 3) + "," + num.substr(4, 3) + "," + num.substr(7, 3);
	case 11:
		return sign + num.substr(0, 2) + "," + num.substr(2, 3) + "," + num.substr(5, 3) + "," + num.substr(8, 3);
	case 12:
		return sign + num.substr(0, 3) + "," + num.substr(3, 3) + "," + num.substr(6, 3) + "," + num.substr(9, 3);
	default:
		return sign + num;
	}
} 

function calcCondition() {
	var f = document.f;

	var price = parseIntEx(f.loanConfigSet_price.value);
	if (isNaN(price) || (price < 0)) {
		return;
	}
	var cost = parseIntEx(f.loanConfigSet_cost.value);
	if (isNaN(cost) || (cost < 0)) {
		return;
	}
	var totalPayment = price + cost;
	f.loanConfigSet_totalPayment.value = formatCurrency(totalPayment);

	var sourceMoney = parseIntEx(f.loanConfigSet_sourceMoney.value);
	if (isNaN(sourceMoney) || (sourceMoney < 0)) {
		return;
	}

	var deposit = parseIntEx(f.loanConfigSet_deposit.value);
	if (isNaN(deposit) || (deposit < 0)) {
		return;
	}

	var balance0 = parseIntEx(f.balance0.value);
	if (isNaN(balance0) || (balance0 < 0)) {
		return;
	}
	var balance1 = parseIntEx(f.balance1.value);
	if (isNaN(balance1) || (balance1 < 0)) {
		return;
	}
	var balance = balance0 + balance1;
	f.loanConfigSet_totalCapital.value = formatCurrency(balance);

	var totalMoney = balance + sourceMoney;
	f.loanConfigSet_totalMoney.value = formatCurrency(totalMoney);

	var shortfall = totalPayment - totalMoney;
	if (shortfall != 0) {
//		f.loanConfigSet_shortfall.value = (shortfall > 0 ? " 不 " : " 余 ") + formatCurrency(Math.abs(shortfall));
		f.loanConfigSet_shortfall.value = formatCurrency(shortfall);
	} else {
		f.loanConfigSet_shortfall.value = "";
	}

	if (totalPayment > 0) {
		var capitalPercent = Math.floor(((totalPayment - deposit) / totalPayment) * 1000) / 10;
		f.loanConfigSet_capitalPercent.value = capitalPercent+ "%";
	}

//	window.status=price + "," + cost + "," +  sourceMoney + "," + deposit;
}
function parseIntEx(value) {
	if (value == null) {
		return 0;
	}
	if (value.length == "") {
		return 0;
	}

	value = value.replace(/,/g, "");
	return parseInt(value);
}

function changeCalcType(calcTypeCombo) {
	var danshinSupportCombo;

//	var stepTypeCombo;
//	var stepRateText;
	if (calcTypeCombo.name == "calcType0") {
		danshinSupportCombo = document.f.danshinSupport0;
//		stepTypeCombo = document.f.stepType0;
//		stepRateText = document.f.stepRate0;
	} else if (calcTypeCombo.name == "calcType1") {
		danshinSupportCombo = document.f.danshinSupport1;
//		stepTypeCombo = document.f.stepType1;
//		stepRateText = document.f.stepRate1;
	} else {
		return;
	}

	if (calcTypeCombo.selectedIndex == 0) {
		danshinSupportCombo.disabled = false;
//		stepTypeCombo.disabled = false;
//		stepRateText.disabled = false;
	} else {
		danshinSupportCombo.disabled = true;
//		danshinSupportCombo.selectedIndex = 0;
//		stepTypeCombo.disabled = true;
//		stepRateText.disabled = true;
	}
}

function changeChangeYear(s) {
	var val = parseInt(s.options[s.selectedIndex].value);
	if (isNaN(val)) {
		return;
	}
	if ((val < 0) || (val >= 35)) {
		return;
	}

	var f = document.f;
	var repaymentStartDate;
	if (f2.loanConfigIndexs[0].checked) {
		repaymentStartDate = new Date(f.repaymentStartDate0.value);
	} else if (f2.loanConfigIndexs[1].checked) {
		repaymentStartDate = new Date(f.repaymentStartDate1.value);
	} else {
		return;
	}

	if (isNaN(repaymentStartDate)) {
		DialogUtils.showErrorDialog("シミュレーション条件の初回返済日を入力してから、簡単指定を行ってください。");
		return;
	}

	var d = DateUtils.addMonth(repaymentStartDate, (val * 12) - 1);
	var year = new String(d.getFullYear());
	var month = new String(d.getMonth() + 1);

	var changeYear = f2.changeYear;
	var options = changeYear.options;
	for (var i = 0, n = options.length; i < n; i++) {
		var y = options[i].value;
		if (year == y) {
			changeYear.selectedIndex = i;
			break;
		}
	}

	var changeMonth = f2.changeMonth;
	options = changeMonth.options;
	for (var i = 0, n = options.length; i < n; i++) {
		var m = options[i].value;
		if (month == m) {
			changeMonth.selectedIndex = i;
			break;
		}
	}
}

function selectTable(table) {
	var page = window.open("", "", "width=400,height=200");
	page.document.open("text/csv");
	page.document.write("a,b,c");
	page.document.close();
}
	