//======================//
// seiten.js ver 1.00   //
// by ARIKUNI Tomomitsu //
//           on 2007/02 //
//======================//

////////////////////////////////////
// 初期化処理（onLoad で呼び出し）//
////////////////////////////////////

function init (seiten) {

	if (!document.getElementsByTagName) return false;

	// <a>タグへ各処理登録
	var a = document.getElementsByTagName('a');
	for (var i=0, n=a.length; i<n; i++) {

		// class による場合分け
		switch (a[i].className) {

			case 'e':	// 巻末註
				var end = a[i].href.split('/');	// e-node
				var eid = end[end.length-1];
				a[i].href = '../e/'+eid+'.htm';
				a[i].onclick = function() { return endnote(this); }
				break;

			case 'f':	// 脚註
				a[i].onclick = function() { return footnote(this); }
				break;

			case 'm':	// リファレンスメニュー
				a[i].onmouseover = function() { return menu(this); }
				break;

			case 'n':	// ナビ
				var nid = a[i].href.split('#')[1];
				a[i].href = seiten+'_n.htm#'+nid;
				a[i].onclick = function() { return navi(this); }
				break;

			case 'r':	// リファレンス
				a[i].onclick = function() { return reference(this); }
				break;

			case 't':	// 現代語訳
				var tid = a[i].href.split('#')[1];
				a[i].href = seiten+'_tl.htm#'+tid;
				a[i].onclick = function() { return translation(this); }
				break;

			case 'w':	// 語註
				var wnd = a[i].href.split('/');	// w-node
				var wid = wnd[wnd.length-1];
				a[i].href = '../w/'+wid+'.htm';
				a[i].onclick = function() { return wordnote(this); }
				break;

		}
	}
}

//////////////
// 脚註表示 //
//////////////

var fID = "";	// 表示中脚註ID
var FID;	// 新規表示脚註ID
var fX1;	// box 左端
var fX2;	// box 右端
var fY1;	// box 上端
var fY2;	// box 下端
var fOffSet = 16;	// 下方・左方オフセット値

function footnote (anc) {	// href：パス/親ファイル名.htm#f頁-番号

	if (!document.getElementById) return;

	// ID 取り出し
	var fid = anc.href.split('#')[1];	// f頁-番号

	// 表示位置計算
	var fn = document.getElementById(fid);	// fn:footnote
	var w = fn.offsetWidth;
	var x = event.clientX+scrollLeft()-fOffSet;	// 少し左へ
	var xm = document.body.clientWidth-w;
	if (x>xm) x = xm;	// 右にはみ出さない処理
	var y = event.clientY+scrollTop()+fOffSet;	// 少し下へ

	// 脚註表示
	fn.style.left = x + "px";
	fn.style.top = y + "px";
	fn.style.visibility = "visible";

	// 表示範囲保存（消去判定用）
	fX1 = x;
	fX2 = x + w;
	fY1 = y;
	fY2 = y + fn.offsetHeight;	// 高さは自動で取得

	// 表示更新中の脚註ID保存
	FID = fid;

	// クリック時リンク先へのジャンプ防止
	return false;

}

/////////////////////////////////
// 巻末注表示（本文・脚註より）//
/////////////////////////////////

var xID = "";	// 表示中外部 html ファイル共通ID
var ELM;	// div 要素

var xX1;	// box 左端
var xX2;	// box 右端
var xY1;	// box 上端
var xY2;	// box 下端
var xTM;	// タイマ
var xOffSet = 16	// 下方・左方オフセット値

function endnote (anc) {	// href：パス/項目名.htm

	if (!document.createElement) return;

	// 隠しフレームに外部ファイル読み込み
	top.hidden.location.href = anc;

	// 巻末註項目名取り出し
	var node = anc.href.split("/");
	var file = node[node.length-1];	// パス切捨て
	var eid = file.split(".")[0];	// 拡張子切捨て

	// div 要素生成
	ELM = document.createElement('div');
	ELM.className = 'en';	// これで書式を指定（seiten.css）
	ELM.id = eid;

	// 表示位置取得
	xX1 = event.clientX+scrollLeft()-xOffSet;	// 少し左へ
	xY1 = event.clientY+scrollTop()+xOffSet;	// 少し下へ

	// 読み込み完了を待って表示
	xTM = setInterval("xDisp()",100);

	// クリック時リンク先へのジャンプ防止
	return false;

}

//////////////
// 語註表示 //
//////////////

function wordnote (anc) {	// href：パス/_項目.htm

	if (!document.createElement) return;

	// 隠しフレームに外部ファイル読み込み
	top.hidden.location.href = anc;

	// 語註項目名取り出し
	var node = anc.href.split("/");
	var file = node[node.length-1];	// パス切捨て
	var wid = file.split(".")[0];	// 拡張子切捨て

	// div 要素生成
	ELM = document.createElement('div');
	ELM.className = 'wn';	// これで書式を指定（seiten.css）
	ELM.id = wid;

	// 表示位置取得
	xX1 = event.clientX+scrollLeft()-xOffSet;	// 少し左へ
	xY1 = event.clientY+scrollTop()+xOffSet;	// 少し下へ

	// 読み込み完了を待って表示（巻末註と共用）
	xTM = setInterval("xDisp()",100);

	// クリック時リンク先へのジャンプ防止
	return false;

}

/////////////////////////////////////////////////
// 外部 html ファイル表示（巻末註・語註で共用）//
/////////////////////////////////////////////////

function xDisp () {

	// 隠しフレームへの読み込み完了待ち
	if (top.hidden.document.readyState!='complete') return;

	// 内容コピー
	ELM.innerHTML = top.hidden.document.getElementsByTagName('p')[0].innerHTML;
	document.body.appendChild(ELM);

	// ID取り出し
	var xid = ELM.id;

	// 表示位置計算
	var elm = document.getElementById(xid);
	var w = elm.offsetWidth;
	var xm = document.body.clientWidth-w;
	if (xX1>xm) xX1 = xm;	// 右はみ出し防止

	// 表示
	elm.style.left = xX1 + "px";
	elm.style.top = xY1 + "px";
	elm.style.visibility = "visible";

	// 表示範囲保存（消去判定用）
	xX2 = xX1+w;
	xY2 = xY1 + elm.offsetHeight;

	// 表示中外部ファイルID保存
	xID = xid;

	// タイマオフ
	clearInterval(xTM);

}

////////////////////////////////
// 巻末註表示（巻末註内より） //
////////////////////////////////

var eN = 0;	// 表示中巻末註の数（重なることあり）
var eEL = new Array();	// div 要素
var eX1 = new Array();	// 左端座標（消去判定用）
var eY1 = new Array();	// 上端座標（消去判定用）
var eTM;	// タイマ
var X;	// 左端座標
var Y;	// 上端座標

function e (eid) {

	// 隠しフレームに外部ファイル読み込み
	var loc = "../e/"+eid+".htm";
	top.hidden.location.href = loc;

	// div 要素生成
	ELM = document.createElement('div');
	ELM.className = 'en';
	ELM.id = eid;

	// 表示位置計算
	X = event.clientX+scrollLeft()-xOffSet;
	Y = event.clientY+scrollTop()+xOffSet;

	// 読み込み完了を待って表示
	eTM = setInterval("eDisp()",100);	// 違いはここのみ

	// クリック時リンク先へのジャンプ防止
	return false;

}

function eDisp () {

	// 隠しフレームへの読み込み完了待ち
	if (top.hidden.document.readyState!='complete') return;

	// 内容コピー
	ELM.innerHTML = top.hidden.document.getElementsByTagName('p')[0].innerHTML;
	document.body.appendChild(ELM);

	// 表示範囲計算
	var w = ELM.offsetWidth;
	var xm = document.body.clientWidth-w;
	if (X>xm) X = xm;	// 右はみ出し防止

	// 表示
	ELM.style.left = X + "px";
	ELM.style.top = Y + "px";
	ELM.style.visibility = "visible";

	// ID登録（表示脚註数インクリメント、xDisp との違いはここのみ）
	eN++;
	eEL[eN] = ELM;
	eX1[eN] = X;
	eY1[eN] = Y;

	// タイマオフ
	clearInterval(eTM);

}

///////////////////////////////////
// 現代語訳表示（終了時に閉じる）//
///////////////////////////////////

var tW;	// ウィンドウ
var tF=0;	// フラグ
var tID="";	// 現表示位置
var tnID;	// 新表示位置
var	tTM;	// タイマ

function translation (anc) {	// href：パス/親ファイル名_tl.htm#t段落-番号

	// 表示位置計算（x は固定）
	var y=window.event.screenY+20;	// やや下へ
	var yM=screen.availHeight-200;
	if (yM<y) y=yM;

	// ID 取り出し
	tnID = anc.href.split("#")[1];	// t段落-番号

	// ウィンドウ既オープン時
	if ((tF) && (!tW.closed)) {

		// 表示位置・内容更新
		var x = tW.screenLeft;
		tW.moveTo(x,y);	
		tW.navigate(anc.href);
		tW.focus();

		// 対応位置強調
		tW.document.getElementById(tID).style.color="black";
		tW.document.getElementById(tnID).style.color="red";

		// 現表示位置保存
		tID = tnID;

	// ウィンドウ未オープン時
	} else {

		// 新規オープン
		var op="width=520,height=165,left=450,top="+y+",scrollbars=1,resizable=1,status=0";
		tW=window.open(anc.href,'tl',op);
		tF=-1;	// 現代語訳ウィンドウフラグ

		// 読み込み完了を待って表示
		tTM = setInterval("t_indicate()",100);

	}

	// クリック時リンク先へのジャンプ防止
	return false;

}

function t_indicate () {

	// ウィンドウオープン完了待ち
	if (tW.document.readyState!='complete') return;

	// 該当箇所強調
	tW.document.getElementById(tnID).style.color="red";

	// 現表示位置保存
	tID = tnID;

	// タイマオフ
	clearInterval(tTM);

}

///////////////////////////////////////////////
// 補注表示（各ウィンドウの onBlur で閉じる）//
///////////////////////////////////////////////

function cm (cid) {

	// 表示位置計算
	var x=window.event.screenX;
	var xM=screen.availWidth-500;
	if (xM < x) x=xM;

	var y=window.event.screenY;
	var yM=screen.availHeight-330;
	if (yM < y) y=yM;

	// ウィンドウ設定＆表示
	var op="width=460,height=300, top="+y+",left="+x+",resizable=1,scrollbars=1,status=no";
	window.open('../x/'+cid+'.htm','cm',op);

	// クリック時リンク先へのジャンプ防止
	return false;

}

//////////////////////////////
// ポップアップメニュー表示 //
//////////////////////////////

var mID = "";	// 表示中メニューID

function menu (anc) {	// href：パス/親ファイル名#m-頁-番号

	if (!document.getElementById) return;

	// ID 取り出し
	var mid = anc.href.split("#")[1];
	if (mid == mID) return false;

	// 他ポップアップ消去
	closePopUp();

	// メニュー取得
	var menu = document.getElementById(mid);

	// 表示位置計算
	var x = event.clientX+scrollLeft()-10;
	var xm = document.body.clientWidth - menu.offsetWidth;
	if (x>xm) x=xm;
	var y = event.clientY+scrollTop()+16;

	// メニュー表示
	menu.style.left = x + "px";
	menu.style.top = y + "px";
	menu.style.visibility = "visible";

	// 表示中メニューID登録
	mID = mid;

	// クリック時リンク先へのジャンプ防止
	return false;

}

//////////////////////
// リファレンス表示 //
//////////////////////

var rF = 0;	// リファレンス表示フラグ
var rFN;	// 対象ファイル名
var rID;	// 現参照位置
var rTM;	// タイマ

function reference (anc) {	// href：パス/対象ファイル名.htm#表示位置_参照位置

	// 旧アンカー一時保存
	var hrefOLD = anc.href;

	// パラメータ取り出し
	var path = anc.href.split('_')[0];	// 参照位置切捨て
	var rid = anc.href.split('_')[1];	// 参照位置
	var node = path.split('/');
	var comp = node[node.length-1];	// 対象ファイル名
	var file = comp.split('.')[0];	// 拡張子切捨て
	var rbm = comp.split('#')[1];	// 表示位置

	// 参照位置未指定時
	if (!rid) {
		rid = rbm;	// 参照位置＝表示位置

	// 参照位置指定時
	} else {
		anc.href = path;	// 正規 href 設定
	}

	// 主フレームよりの呼び出し時（サブフレームで参照）
	if (self.name=="main") {

		// サブフレームオープンチェック
		if (!rF) {
			top.document.getElementById('fsr').rows="66%,*,0%";
			rF=-1;
		}

		// サブフレーム表示
		top.ref.location.href=anc;

		// 該当箇所強調
		indicate(top.ref,file,rid);

	// サブフレームよりの呼び出し時（メインフレームで参照）
	} else {

		// 親ファイル取り出し
		var nd=top.main.location.href.split("/");
		var pfile=nd[nd.length-1].split(".")[0];	// パス・拡張子切捨て

		// 親ファイル（主フレームで表示中）
		if (file==pfile) {

			// 主フレームをナビ
			top.main.navigate(anc);

			// 主フレームでの強調位置取得
			var mid = top.main.id;

			// 現強調個所消去
			if (mid) {
				top.main.document.getElementById(mid).style.color="black";
			}

			// 参照箇所強調
			top.main.document.getElementById(rid).style.color="red";

			// 現照箇所保存
			top.main.id = rid;

		// 別ファイル（第三のファイル）
		} else {

			// 表示位置＝参照位置に戻して
			var bm = anc.href.split('#')[0]+"#"+rid;

			// サブフレームに表示
			self.location.href=bm;

		}
	}

	// アンカー復旧
	anc.href = hrefOLD;

	// クリック時リンク先へのジャンプ防止
	return false;

}

//////////////////////
// 参照箇所強調表示 //
//////////////////////

function indicate (frame,file,rid) {

	// 読み込み完了時
	if (frame.document.readyState=='complete') {

		// 同一ファイル・別参照位置
		if ((file==rFN)&&(rid!=rID)) {
			frame.document.getElementById(rID).style.color="black";	// 前の強調オフ
		}

		// 参照箇所強調
		frame.document.getElementById(rid).style.color="red";

		// 参照ファイル・参照位置保存
		rFN = file;
		rID = rid;

	// 読み込み未完了時
	} else {
		rFN = file;
		rID = rid;
		rTM = setInterval("ri_wait()",200);	// 読み込み完了を待って表示
	}

}

function ri_wait () {

	var body = top.ref.document;

	// 読み込み完了待ち
	if (body.readyState!="complete") return;

	// 参照箇所強調
	body.getElementById(rID).style.color="red";

	// タイマオフ
	clearInterval(rTM);

}

////////////////////////////////////
// 引用リスト表示（巻末註内より） //
////////////////////////////////////

var qID;
var qEL = "";	// div 要素
var qTM;	// タイマ
var qX;	// 左端座標
var qY;	// 上端座標

function q (qid) {

	// 隠しフレームに外部ファイル読み込み
	var loc = "../q/"+qid+".htm";
	top.hidden.location.href = loc;

	// div 要素生成
	ELM = document.createElement('div');
	ELM.className = 'menu';
	ELM.id = qid;

	// 表示位置計算
	qX = event.clientX+scrollLeft()-10;
	qY = event.clientY+scrollTop()+10;

	// 読み込み完了を待って表示
	qTM = setInterval("qDisp()",100);

	// クリック時リンク先へのジャンプ防止
	return false;

}

function qDisp () {

	// 隠しフレームへの読み込み完了待ち
	if (top.hidden.document.readyState!='complete') return;

	// 内容コピー
	ELM.innerHTML = top.hidden.document.getElementsByTagName('div')[0].innerHTML;
	document.body.appendChild(ELM);

	// 表示範囲計算
	var xm = document.body.clientWidth-ELM.offsetWidth;
	if (qX>xm) qX = xm;	// 右はみ出し防止

	// 表示
	ELM.style.left = qX + "px";
	ELM.style.top = qY + "px";
	ELM.style.visibility = "visible";

	// ID登録
	qID = ELM.id;
	qEL = ELM;
	// タイマオフ
	clearInterval(qTM);

}

//////////////////
// 引用個所表示 //
//////////////////

function s (p,file,bm) {

	var loc = "../"+p+"/"+file+".htm#"+bm;

	// 親ファイル取り出し
	var nd=top.main.location.href.split("/");
	var pfile=nd[nd.length-1].split(".")[0];	// パス・拡張子切捨て

	// 親ファイルなら
	if (file==pfile) {

		// 主フレームをナビ
		top.main.navigate(loc);

	} else {

		// サブフレームオープンチェック
		if (!rF) {
			top.document.getElementById('fsr').rows="66%,*,0%";
			rF=-1;
		}

		// サブフレームへ表示
		top.ref.location.href=loc;

		rFN = file;
		rID = bm;

	}

}

//////////////////
// ナビ画面表示 //
//////////////////

var nF = 0;	// ナビ表示フラグ
var nID;	// 科段ID
var nTM;	// タイマ

function navi (anc) {	// href：パス/親ファイル名_n.htm#科段ID

	// フレームチェック
	if (self.name!="main") {
		alert("主フレームからでないとナビは表示できません");
		return false;
	}

	// 移動
	top.navi.location.href=anc;

	// ナビ画面オープンチェック
	if (!nF) {
		top.document.getElementById("fsc").cols="20%,*";
		nF=-1;
		var bm=anc.href.split("#")[1];
		self.navigate("#"+bm);
	}

	// ID 取得
	nID = anc.href.split("#")[1];

	// 参照箇所強調（セレクト）
	if (top.navi.document.readyState=="complete") {
		top.navi.document.getElementById(nID).focus();
	} else {
		nTM=setInterval("n_wait()",100);	// 新規オープンならば読み込み完了を待つ
	}

	// クリック時リンク先へのジャンプ防止
	return false;
}

function n_wait () {

	var body = top.navi.document;

	// 読み込み完了待ち
	if (body.readyState!="complete") return;

	// 参照箇所強調
	body.getElementById(nID).focus();

	// タイマオフ
	clearInterval(nTM);

}

//////////////////////////
// ポップアップ表示消去 //
//////////////////////////

function closePopUp () {

	// イベント発生座標取得
	var x = event.clientX + scrollLeft();
	var y = event.clientY + scrollTop();

	// 各ポップアップチェック
	popUpCheck (x,y);

	// リファレンスフレーム内（メイン→サブ）
	if ((rF)&&(top.ref.document.readyState=="complete")) {
		top.ref.popUpCheck(0,0);
	}

	// メインフレーム内（サブ→メイン）
	if (self.name=="ref") {
		top.main.popUpCheck(0,0);
	}

}

function popUpCheck (X,Y) {

	// メニュー消去
	if (mID) {
		document.getElementById(mID).style.visibility = "hidden";
		mID = "";
	}

	// 脚註消去
	if (fID) {
		if ((X<fX1)||(fX2<X)||(Y<fY1)||(fY2<Y)) {
			document.getElementById(fID).style.visibility = "hidden";
			fID = "";
		}
	}
	if (FID) {
		document.getElementById(FID).style.visibility = "visible";
		fID = FID;	// 消去ルーチン通過後、表示中扱いに
		FID = "";
	}

	// 巻末註・語註消去
	if (xID) {
		if ((X<xX1)||(xX2<X)||(Y<xY1)||(xY2<Y)) {
			document.getElementById(xID).style.visibility = "hidden";
			xID = "";
		}
	}

	// 引用リスト消去
	if (qID) {
		var x2 = qX+qEL.offsetWidth;
		var y2 = qY+qEL.offsetHeight;
		if ((X<qX)||(x2<X)||(Y<qY)||(y2<Y)) {
			qEL.style.visibility = "hidden";
			qID = "";
		}
	}

	// 巻末註から呼び出された巻末註消去
	if (eN>0) {
		for (var j=1,m=eN; j<=m; j++) {
			var e = eEL[j];
			var x1 = eX1[j];
			var y1 = eY1[j];
			var x2 = x1+e.offsetWidth;
			var y2 = y1+e.offsetHeight;

			if ((X<x1)||(x2<X)||(Y<y1)||(y2<Y)) {
				e.style.visibility = "hidden";

				// ガベッジ・コレクション
				for (var k=j,l=m;k<=l;k++) {
					eEL[k]=eEL[k+1];
					eX1[k]=eX1[k+1];
					eY1[k]=eY1[k+1];
				}
				j--;
				m--;
				eN--;
			}
		}
	}

}

////////////////////
// 画面表示初期化 //
////////////////////

function winClear () {

	// ESC キー押下判定
	if (event.keyCode==27) {

		// 脚註表示強制消去
		if (fID) {
			document.getElementById(fID).style.visibility = "hidden";
			fID = "";
		}

		// 巻末註・語註表示強制消去
		if (xID) {
			document.getElementById(xID).style.visibility = "hidden";
			xID="";
		}

		// メニュー表示強制消去
		if (mID) {
			document.getElementById(mID).style.visibility = "hidden";
			mID = "";
		}

		// 引用リスト表示強制消去
		if (qID) {
			qEL.style.visibility = "hidden";
			qID = "";
		}

		// レファレンス表示強制消去（ウィンドウ上下分割キャンセル）
		if (rF) {
			top.document.getElementById("fsr").rows="100%,*,0%";
			rF=0;
			top.ref.document.getElementById(rID).style.color="black";
			rFN="";
			rID="";
		}

		// ナビ表示強制消去（ウィンドウ左右分割キャンセル）
		if (nF) {
			var y = document.body.scrollTop * 0.835;	// 適当な値、正確には無理
			top.document.getElementById("fsc").cols="0%,*";
			window.scroll(0,y);
			nF=0;
		}

		// 強調表示消去
		var obj=document.getElementsByTagName("sup");
		var iM=obj.length;
		for(i=0;i<iM;i++) {
			obj[i].style.color="black";
		}

	}
}

////////////////
// 小ルーチン //
////////////////

// 表示中上端座標取得 //
function scrollTop () {
	if (window.pageYOffset)
		return window.pageYOffset;
	if (document.compatMode == "CSS1Compat")
		return document.body.parentNode.scrollTop;
	if (document.body.scrollTop)
		return document.body.scrollTop;
	return 0;
}

// 表示中左端座標取得 //
function scrollLeft () {
	if (window.pageXOffset)
		return window.pageXOffset;
	if (document.compatMode == "CSS1Compat")
		return document.body.parentNode.scrollLeft;
	if (document.body.scrollLeft)
		return document.body.scrollLeft;
	return 0;
}

// 現代語訳表示サブウィンドウクローズ（終了時）
function closeAll() {
	if (tF) tW.close();
}

// 前画面へ戻る //

function backPage () {

	history.back();

}

//////////////////
// イベント登録 //
//////////////////

// ポップアップ表示オフ→画面上のクリック
document.onclick = closePopUp;

// 画面表示初期化→ESCキー
document.onkeyup = winClear;

// 現代語訳ウィンドウクローズ→終了時
window.onunload = closeAll;

// 戻る→画面ダブルクリック
document.ondblclick = backPage;
