/////////////////////////////////////////////////////////////////////////////
// 「２ちゃんねる」用ポップアップ生成スクリプト v0.4
// Copyright (C) 2002 by t-arai
//
// 「２ちゃんねる」のスレッド表示時に、専用ブラウザのようにレスをポップ
// アップ表示させるスクリプトです。
//
// ポップアップを許す最大行を設定してください。ただし、この値が正確に
// 反映されるわけではありません。あくまで目安と考えてください。
//
// 本スクリプトの処理時間は、ページに >>n が何個あるかで決まります。
// また非リンクの >>n に対応させると、その分時間がかかります。
//
// 
// v0.4 "》", ">>ｎ"(全角数字)に対応。
// v0.3 非リンクの >>n に対応。「まちBBS」に対応。状況表示。
// v0.2 引用レスが無いときにスクリプトエラーになっていたのを修正。
// v0.1 初公開
//
/////////////////////////////////////////////////////////////////////////////

//---------------------------------------------------------------------------
// 適当な値を設定してください。

var maxlines   = 40;		// ポップアップを何行まで表示させるか
var cut_notice = "<cut>"	// レスの切り捨てを示す文字列
var force_link = 0;			// 非リンクの >>n にも対応するか
							// (0 = no / 1 = yes / 2 = 起動時に選択)
//---------------------------------------------------------------------------


var pnir, id, window, document;

pnir     = new ActiveXObject("Sleipnir.API");
id       = pnir.GetDocumentID(pnir.ActiveIndex);
window   = pnir.GetWindowObject(id);
document = pnir.GetDocumentObject(id);

var res_begin, res_end;
var dt_tag, dt_len, dd_tag, a_tag, a_len;
var num, dd_old, dd_new, tmp_title
var i, j, k, per;

var res = new Array;

var re_title = new RegExp();
var re_nolink = new RegExp();
var re_age = new RegExp();
var re_res = new RegExp();

re_title.compile("(\\d+) (名前)?：");
//re_nolink.compile("(((&gt;){1,2})|(＞{1,2}))(\\d+(\\-\\d+)?)([^<]*?)(?!</A>)<BR>");
re_nolink.compile("(((&gt;){1,2})|(＞{1,2})|》)([0-9０-９]+([-−ー][0-9０-９]+)?)([^-−ー<0-9０-９]+?|<BR>)(?!</A>)");
re_age.compile("<B>( *)([0-9０-９]+)( *)<\\/B><\\/FONT>");
re_res.compile("([0-9０-９]+)([-−ー]([0-9０-９]+))?$");

if(document == null){
	pnir.MessageBox("Document オブジェクトを作成できません");
}else{

	if(force_link == 2){
		force_link = 7 - pnir.MsgBox("非リンクの >>n にも対応しますか？", "", 4);
	}
//	var start_t = new Date();

	document.body.style.cursor = "wait";
	dt_tag = document.all.tags("dt");
	dd_tag = document.all.tags("dd");
	dt_len = dt_tag.length;
	per = (dt_len > 900) ? 1 : (dt_len > 500) ? 2 : (dt_len > 200) ? 5 : 10;
	for(i=0; i<dt_len; i++){
		if((k=Math.ceil(i*100/dt_len)) % per == 0){
			window.status = "ページを解析しています... " + k +"%";
		}
		if(dt_tag[i].innerText.match(re_title)){
          num = Number(RegExp.$1);
          res[num] = dt_tag[i].innerText + "\n" + dd_tag[i].innerText;
		}
		if(force_link){
			if(dt_tag[i].innerHTML.match(re_age)){
				dt_tag[i].innerHTML = RegExp.leftContext + RegExp.$1 + '<a href="' + RegExp.$2
								 + '"><font color=green><b>' + RegExp.$2
								 + '</b></font></a></font>'+ RegExp.$3 + RegExp.rightContext;
			}
			dd_old = dd_tag[i].innerHTML;
			dd_new = "";
			while(dd_old.match(re_nolink)){
				dd_new += RegExp.leftContext + '<a href="' + RegExp.$5 + '" target=_blank>'
						+ RegExp.$1 + RegExp.$5 + "</a>" + RegExp.$7;
				dd_old = RegExp.rightContext;
			}
			dd_tag[i].innerHTML = dd_new + dd_old;
		}
	}

	window.status = "ポップアップを生成しています... ";
	a_tag = document.links;
	a_len = a_tag.length;
	per = (a_len > 900) ? 1 : (a_len > 500) ? 2 : (a_len > 200) ? 5 : 0;
	for(i=0; i<a_len; i++){
		if(per > 0 && (k=Math.ceil(i*100/a_len)) % per == 0){
			window.status = "ポップアップを生成しています... " + k + "%";
		}
		tmp_title = "";
		if(a_tag[i].innerText.match(re_res)){
          res_begin = isNaN(RegExp.$1) ? Number(escape(RegExp.$1).split("%uFF1").join(""))
                                       : Number(RegExp.$1);
          res_end   = (RegExp.$3) ? isNaN(RegExp.$3) ? Number(escape(RegExp.$3).split("%uFF1").join(""))
                                                     : Number(RegExp.$3)
                                  : res_begin;
          for(j=res_begin; j<=res_end; j++){
				tmp_title += (res[j]) ? res[j] + "\n\n" : "(" + j + ")\n";
			}
			if(tmp_title){
				while( tmp_title.lastIndexOf("\n") == tmp_title.length - 1 ){
					tmp_title = tmp_title.slice(0, -1);
				}
				a_tag[i].title = tmp_title.split("\n", maxlines).join("\n");
				if(a_tag[i].title != tmp_title) a_tag[i].title += "\n" + cut_notice;
			}else{
				a_tag[i].title = "";
			}
		}
	}
	window.status = "";
	document.body.style.cursor = "auto";
	document = null;

//	pnir.MessageBox((new Date() - start_t) / 1000);
//	start_t = null;

}

re_res = null;
re_age = null;
re_nolink = null;
re_title = null;
res = null;

window = null;
id = null;
pnir = null;

