// 日付文字列の着色設定　着色する:1　着色しない:0
coloring=1;
threshold1=[2,"#0000FF"]; // 書き込みが複数あるID のしきい値と色
threshold2=[5,"#FF0000"]; // 書き込みが多数あるID のしきい値と色
threshold3=[1,"#0000FF"]; // 書き込みがある    レス のしきい値とレス番号の色
threshold4=[4,"#FF0000"]; // 書き込みが多数あるレス のしきい値とレス番号の色
// イベントハンドラ：onClick
// 外部関数：addAnchor,checkAnchor,tohan
// 外部変数：anchorHead,browser
// 特徴：イベント発生DTに対応するDD下に、DL-DT-DD構造を作成する。
//==========CSSの出力
var nCSS='';
nCSS+='#foundResult{position:absolute;top:expression(body.scrollTop+25);right:18px;padding:2px 5px;z-index:6;background-color:white;border:1px solid #999}';
nCSS+='.refResult{margin:0.5em 0.3em; border:1px solid #666;padding-right:0px}';
nCSS+='.refResult{border-top:none}';
nCSS+='.refResult dt{margin-right:0px;}';
nCSS+='.refResult dd{margin-left:0.8em;}';
document.write('<style type="text/css">'+nCSS+'</style>\n');
//==========検索による色指定（16進数又はWeb形式の色名で指定。いくつでも可）
var foundColor = new Array("#ffdfee","#eeffdf","#ffeedf","#dfffee","#eedfff","#ffffe1");
var nCSS='';
for(var css=0;css<foundColor.length;css++){
 nCSS+='#COLOR'+css+" a{border-color:"+foundColor[css]+"}";
 nCSS+='#COLOR'+css+" a:hover{border-color:red}";
}
document.write('<style type="text/css">'+nCSS+'</style>\n');
//==========グローバル変数
var dts=document.getElementsByTagName('DT');
var dds=document.getElementsByTagName('DD');
var fR;
//==========IDと参照をハッシュに格納
var idHash=new Array(); var refHash=new Array(); var searchEnd=0;
function setHash(){
 var l=dts.length;
 if(dts[l-1].rel=="setEnd"){return} // 最後まで調査済みなら回避
 for(var i=searchEnd;i<l;i++){
  if(dds[i].parentElement.className=="refResult"){continue} // 逆参照内のDDなら回避
  var num=dts[i].firstChild.innerText; var span=dts[i].lastChild;
  // ID
  var t=getID(span); idHash[t] = idHash[t] ? idHash[t]+" "+num : num;
  // ref
  var ddAnc=dds[i].getElementsByTagName("A");
  for(var j=ddAnc.length;j--;){
   if(checkAnchor(ddAnc[j].href)!=1){continue}
   var anc=tohan(ddAnc[j].innerText.replace(/[>＞]/g,""));
   if(anc.match(/(\d*)\D+(\d*)/)){
    var start=parseInt(RegExp.$1); var end=parseInt(RegExp.$2);
    if(end-start>100){continue} // >>1-1000とかは華麗にスルー
    for(var k=start;k<=end;k++){
     if(num>=k){refHash[k]=refHash[k] ? refHash[k]+" "+num : num;} // 未来へのアンカーはスルー
    }
   }else{anc=parseInt(anc);
     if(num>=anc){refHash[anc]=refHash[anc] ? refHash[anc]+" "+num : num;} // 未来へのアンカーはスルー
   }
  }
 }
 dts[l-1].rel="setEnd"; searchEnd=l;
 if(!coloring){return;} // 着色不要なら終了
 for(var i=l;i--;){
  if(!dts[i].innerText){continue}
  if(dts[i].innerText.match(/id:/i)){ // IDがない板で、高速化するかも？
   var span=dts[i].lastChild; var t=getID(span);
   if(idHash[t] && span){
    var idResult=idHash[t].split(/\s/); if(t=="???"){idResult=""}
    if     (idResult.length>=threshold2[0]){span.style.color=threshold2[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
    else if(idResult.length>=threshold1[0]){span.style.color=threshold1[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
    else if(idResult.length==1){span.title="同一IDは\nありません"}
   }
  }
  var numA=dts[i].firstChild; var num=numA.innerText; 
  if(refHash[num]){
   var refResult=refHash[num].split(/\s/);
   if     (refResult.length>=threshold4[0]){numA.style.color=threshold4[1];dts[i].title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
   else if(refResult.length>=threshold3[0]){numA.style.color=threshold3[1];dts[i].title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
   else{numA.title="これへのレスはない模様"}
  }
 }
}
//==========名前・ID検索等
// IDの検索・削除
function searchID(obj){
 var singleColor=event.altKey;
 var decoy=obj.parentElement ? obj.parentElement : obj;
 var reg=getID(obj);
 if(!decoy.id.match(/^COLOR/)){
  if(!idHash[reg]){return}
  var target=new Array();target=idHash[reg].split(" ");
  // カラー選択
  var c = singleColor ? 0 : selectColor();
  if  (c=="restart"){c=0;singleColor=true}
  else if(c=="exit"){return;}
  // 検索
  for(i in target){var dt=getDTfromAnc(target[i]);activate(dt,c);}
  foundReturn(target);
 }else{
  clearResult(obj);return;
 }
}
// IDポップアップ
function searchPopup(obj){
 var objs=document.getElementsByTagName(obj.tagName);
 var reg=getID(obj);if(!reg){return}
 var target=idHash[reg].split(" ");
 if(target.length==1){return}
 if(!obj.rel){obj.rel=obj.href;} obj.href="decoy:";
 var targetString=""; for(i in target){targetString+=returnString(target[i])} //中身の切り出し
 if(targetString){popup(targetString);}else{obj.href=obj.rel;} //対象が存在したらrelに退避してポップアップ
}
// 名前の検索・削除
function search(obj){
 var singleColor=event.altKey;
 var objs=document.getElementsByTagName(obj.tagName);
 var reg=obj.innerText; var target="objs[i].innerText"; //名前・トリップ
 var decoy=obj.parentElement ? obj.parentElement : obj;
 if(!decoy.id.match(/^COLOR/)){
  // カラー選択
  var c = singleColor ? 0 : selectColor();
  if  (c=="restart"){c=0;singleColor=true}
  else if(c=="exit"){return;}
  // 検索
  var found=new Array; var l=objs.length;
  for(var i=l;i--;){
   var dt=objs[i].parentElement; if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
   if(eval(target)==reg){activate(dt,c);found.unshift(dt.firstChild.innerText);}
   else if(singleColor) {deactivate(dt)}
  }
  foundReturn(found);
 }else{
  clearResult(obj);return;
 }
}

// ID文字列の抽出
var regID=new RegExp("ID:(.*)$");
function getID(obj){
 if(regID.test(obj.innerText)){return(RegExp.$1)}else{return(false)}
}
// 色設定
function activate(obj,c){
 var color=foundColor[c];
 obj.rev=obj.style.backgroundColor;
 obj.style.backgroundColor=color;
 obj.id="COLOR"+c; // 同一idが複数生じるがByNameではdtのnameから取得できないためやむなし
}
// 色復帰
function deactivate(obj){if(!obj){return}
 obj.style.backgroundColor=obj.rev;
 if(obj.id!="sizeinfo"){obj.removeAttribute("id");}
 obj.removeAttribute("rev");
 obj.removeAttribute("title");
}
// カラー選択
function selectColor(){
 var c=0;
 while(document.getElementById("COLOR"+c)){
  c++;
  if(!foundColor[c]){if(confirm("色を初期化しますか？")){return("restart")}else{return("exit")}}
 }
 return(c);
}
// 結果表示
function foundReturn(found){
 if(!fR){document.body.insertAdjacentHTML('afterBegin','<div id="foundResult"></div>');fR=document.getElementById("foundResult");}
 //dtのtitleに
 for(var i=found.length;i--;){dt=getDTfromAnc(found[i]);dt.title=found.join(" ");}
 //foundResultに
 var buttons='<input type="button" value="CLR" onclick="clearResult(this)" title="Alt押下時\n着色レス全て"><input type="button" value="DEL" onclick="clearResult(this)" title="Alt押下時\n着色レス全て">';
 if(found.length>=20 && confirm("20以上あるけど表示する？")==false){
  fR.innerHTML=buttons;	fR.title=found.join(" ");
 }else{
  for(var i=0;i<found.length;i++){found[i] = addAnchor(found[i],found[i])}
  fR.innerHTML=found.join(" ")+buttons;
 }
 fR.style.visibility="visible";
}
// 結果消去、結果削除
function clearResult(obj){
 var fromObj=obj.parentElement;
 var singleColor=event.altKey;
 var result=new Array();var arrayElement; var numbers=fromObj.title ? fromObj.title : fromObj.innerText;
 if(singleColor){result=dts;               arrayElement="result[i]";}
 else           {result=numbers.split(" ");arrayElement="getDTfromAnc(result[i])";}
 var l=result.length;
 if(!result[0]){
  /* 検索結果ゼロでもresultがnullにならない対策 */
 }else if(event.srcElement.value!="DEL"){
  for(var i=l;i--;){
   var dt=eval(arrayElement);
   deactivate(dt);
  }
 }else{
  for(var i=l;i--;){
   var dt=eval(arrayElement); var dd=dt.nextSibling;
    //Live機能追加 - 透明あぼ〜ん
   if(browser=="Live2ch"){location.href='func:ABONECLEAR?'+dt.firstChild.innerText;}
   dt.removeNode(true); dd.removeNode(true);
  }
 }
 if(fR){fR.innerText="";fR.style.visibility="hidden";}
}

//==========単語検索
function findIt(word){
 if(!word){
  var word = prompt("検索する文字を入力してください。","");
  word = unescape(escape(word).split("%00")[0]); //IE5のバグ対策
 }
 if(!word || word=="null"){return}
 // カラー選択
 var singleColor=event.altKey;
 var c = singleColor ? 0 : selectColor();
 if  (c=="restart"){c=0;singleColor=true}
 else if(c=="exit"){return;}
 // 検索
 var found=new Array; var l=dds.length;
 var bodyText=document.body.createTextRange();
 for(var i=l;i--;){
  var dt=dts[i]; var dd=dds[i];  if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
  bodyText.moveToElementText(dt);  var checkDT=bodyText.findText(word,0);
  bodyText.moveToElementText(dd);  var checkDD=bodyText.findText(word,0);
  if(checkDT || checkDD){activate(dt,c);found.unshift(dt.firstChild.innerText)}
  else if(singleColor)  {deactivate(dt);}
 }
 if(found){foundReturn(found)}
}
//==========逆参照
function searchRef(obj){
 if(obj.name!='referred'){
  var num=obj.firstChild.innerText;
  if(refHash[num]){
   var refArr=refHash[num].split(/\s/); var refs="";
   for(var i=0;i<refArr.length;i++){
    var dtOrg=getDTfromAnc(refArr[i]); var dt=dtOrg.cloneNode(true); var dd=dtOrg.nextSibling.cloneNode(true);
    // 本文以外を削除
    if(dd.lastChild){
     if(dd.lastChild.tagName=="DL"){dd.lastChild.removeNode(true);} //逆参照の除去
     if(dd.lastChild.name){dd.lastChild.removeNode(true);} // LABELNUMBERがないものに係る不要アンカーの除去
    }
    // 本文を格納
    refs+=dt.outerHTML.replace(/name=.*?>/,">")+dd.outerHTML.replace(/<a name=.*>/i,"");
   }
   obj.nextSibling.insertAdjacentHTML("beforeEnd",'<dl class="refResult">'+refs+'</dl>')
   obj.name="referred";
  }
 }else{
  obj.nextSibling.lastChild.removeNode(true);
  obj.name='';
 }
}
//==========クリップボードにコピー
function copyText(target){
 var num=event.srcElement.parentElement.name;
 var obj=getDTfromAnc(num);
 var textarea=document.createElement("TEXTAREA");
 var message=obj.nextSibling.innerText.replace(/\s(\r\n|$)/g,"\n");
 if     (target=="res") {textarea.value=obj.firstChild.innerText+" ："+obj.childNodes[1].innerText+" ："+obj.lastChild.innerText+"\n"+message;}
 else if(target=="name"){textarea.value=obj.childNodes[1].innerText+"\n";}
 else if(target=="id")  {textarea.value="ID:"+(obj.lastChild.innerText.split(/ID:/))[1]+"\n";}
 var copyText=textarea.createTextRange();
 copyText.execCommand("Copy")
 event.srcElement.parentElement.removeNode(true);
}
//==========アンカーからDTを特定
var ancs=document.anchors;
function getDTfromAnc(num){
 var anc=ancs(anchorHead+num);
 if(!anc){return("")} //LABELNUMBER対応のあぼ〜ん若しくは未出番号なら終了
 var obj=anc.parentElement; //LABELNUMBER対応のもの
 if(obj.tagName!="DT"){ //LABELNUMBER非対応のもの
  if(num==1){if(anc){obj=anc.nextSibling}                           else{return("")}}
  else      {if(!anc.nextSibling){obj=anc.parentElement.nextSibling}else{return("")}}
 }
 return(obj);
}