/*
 * 読み込み後にスタイル変更するとアンカーがずれるので
 */
if (document.styleSheets)
	var sheet = document.styleSheets[0];
	if (sheet.insertRule) {
		var rule  = "dt.source-code { display: block }";
		sheet.insertRule(rule, sheet.cssRules.length);
	}

/*
 * ページ読み込み時に実行するルーチン
 */
function init() {
	if (!document.getElementById) return;

	var dtElements = document.getElementsByTagName("dt");
	var ddElements = document.getElementsByTagName("dd");
	var i;

	for (i = 0; i < ddElements.length; i++)
		if (ddElements[i].className == "source-code")
			ddElements[i].style.display = "none";

	for (i = 0; i < dtElements.length; i++) {
		if (dtElements[i].className == "source-code") {
			removeChildNodes(dtElements[i]);
			dtElements[i].appendChild(createButton());
			dtElements[i].style.display = "block";
		}
	}
}

/*
 * ソースコードを表示する
 */
function showSourceCode(e) {
	var ddElement = getDdElement(e.target.parentNode);
	if (ddElement)
		with (ddElement.style)
			display = display != "block" ? "block" : "none";
}

/*
 * DT要素に対するDD要素を返す
 */
function getDdElement(dtElement) {
	var temp = dtElement;
	while (temp = temp.nextSibling)
		if (temp.nodeName.toUpperCase() == "DD")
			return temp;
}

/*
 * すべての子ノードを削除する
 */
function removeChildNodes(node) {
	for (var i = 0; i < node.childNodes.length; i++)
		node.removeChild(node.childNodes[i]);
}

/*
 * ソースコード表示用のボタンを生成する
 */
function createButton() {
	var inputElement = document.createElement("input");
	inputElement.setAttribute("type" , "button");
	inputElement.setAttribute("value", "ソースコード");
	addEvent(inputElement, "click", showSourceCode);
	return inputElement;
}

/*
 * イベントを追加もしくは設定する
 */
function addEvent(target, type, listener) {
	var listenerIE = function() {
		var e = {
			target : window.event.srcElement
		};
		listener(e);
	};
	if (target.addEventListener)
		target.addEventListener(type, listener, false);
	else if (target.attachEvent)
		target.attachEvent("on" + type, listenerIE);
	else
		target["on" + type] = listenerIE;
}
