// イベントハンドラ：onClick
// 外部関数：addAnchor,checkAnchor,tohan
// 外部変数：anchorHead
// 特徴：イベント発生DTに対応するDD下に、DL-DT-DD構造を作成する。
// 要注意：LABELNUMBERのないブラウザによるHTML上不適正な出力は、ブラウザが強制的に解釈しなおし、メモリ上で変更するらしい。
// 　　　　すなわち、<dt>の前に出力された<a name=""></a>は、その一つ前のDDの中に存在するものと解釈されてしまう（DDの終了タグが後ろにずれ込む解釈）。ここでレス番号がずれることになる。
// 　　　　結果、souceIndexでは、[a,dt,dd],[a,dt,dd]...と並ぶが、ノードツリーでは(a),[dt,dd,a],[dt,dd...]と並ぶようである。最初のaはどの子ノードになるかは未調査。
//==========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");
//==========名前・ID検索等
// 名前・IDの検索・削除
function search(obj){
 var singleColor=event.altKey;
 var tag =obj.tagName;
 var objs=document.getElementsByTagName(tag);
 if(tag!="SPAN"){var reg=obj.innerText;var target="o.innerText"} //名前・トリップ
 else           {var reg=getID(obj);   var target="getID(o)"   } //ID
 if(!obj.parentElement.id.match(/^#/)){
  // カラー選択
  var c=0;
  if(!singleColor){
   while(document.getElementById(foundColor[c])){
    c++;
    if(!foundColor[c]){
     if(confirm("色を初期化しますか？")){c=0;singleColor=true;break;}
     else{c="exit";break;}
    }
   }
   if(c=="exit"){return;}
  }
  // 検索
  var found=new Array; var l=objs.length; if(document.getElementById("sizeinfo")){l--;}
  for(var i=l;i--;){
   var o=objs[i]; var p=o.parentElement;
   if(eval(target)==reg){activate(p,foundColor[c]);found.unshift(p.firstChild.innerText);}
   else if(singleColor) {deactivate(p)}
  }
  foundReturn(found);
 }else{
  var result=new Array;
  if(singleColor){result=document.getElementsByTagName("DT"); arrayElement="result[i]";}
  else           {result=obj.parentElement.title.split(" ");  arrayElement="getDTfromAnc(result[i])"}
  var l=result.length; if(result[l-1].id=="sizeinfo"){l--;}
  for(var i=l;i--;){
   var p=eval(arrayElement);
   deactivate(p);
  }
  if(document.getElementById("foundResult")){document.getElementById("foundResult").removeNode(true);}
 }
}
// ID文字列の抽出
function getID(obj){
 if(obj.innerText.match(/ID:(.*)$/)){return(RegExp.$1)}else{return(false)}
}
function activate(obj,color){
 obj.rev=obj.style.backgroundColor;
 obj.style.backgroundColor=color;
 obj.id=color; // 同一idが複数生じるがByNameではdtのnameから取得できないためやむなし
}
function deactivate(obj){
 obj.style.backgroundColor=obj.rev;
 obj.removeAttribute("rev");
 obj.removeAttribute("id");
 obj.removeAttribute("title");
}
// 結果表示
function foundReturn(found){
 if(!document.getElementById("foundResult")){document.body.insertAdjacentHTML('afterBegin','<div id="foundResult"></div>')}
 var obj=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()" title="Alt押下時\n着色レス全て"><input type="button" value="DEL" onclick="clearResult()" title="Alt押下時\n着色レス全て">';
 if(found.length>=20 && confirm("20以上あるけど表示する？")==false){
  obj.innerHTML=buttons;	obj.title=found.join(" ");
 }else{
  for(var i=0;i<found.length;i++){found[i] = addAnchor(found[i],found[i])}
  obj.innerHTML=found.join(" ")+buttons;
 }
 
}
// 結果消去、結果削除
function clearResult(){
 var obj=event.srcElement.parentElement;
 var result=new Array();var arrayElement;
 if(!event.altKey){result=obj.innerText ? obj.innerText.split(" ") : obj.title.split(" "); arrayElement="getDTfromAnc(result[i])";}
 else             {result=document.getElementsByTagName("DT");arrayElement="result[i]";}
 if(event.srcElement.value=="CLR"){
  //if(event.altKey && !confirm("チェックしたレスのすべての色を戻しますか？")){return;}
  for(var i=result.length;i--;){
   var dt=eval(arrayElement);
   if(dt.style.backgroundColor){deactivate(dt);}
  }
 }else{
  //if(event.altKey && !comfirm("チェックしたレスのすべてを削除しますか")){return;}
  for(var i=result.length;i--;){
   var dt=eval(arrayElement); var dd=dt.nextSibling;
    //Live機能追加 - 透明あぼ〜ん
   if(document.getElementsByName("ThreadURL")[0].content && anchorHead=="a"){location.href='func:ABONECLEAR?'+dt.firstChild.innerText;continue;}
   if(dt.style.backgroundColor){dt.removeNode(true); dd.removeNode(true);}
  }
 }
 obj.removeNode(true);
}

//==========単語検索
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=0;
 if(!singleColor){
  while(document.getElementById(foundColor[c])){
   c++;
   if(!foundColor[c]){
    if(confirm("色を初期化しますか？")){c=0;singleColor=true;break;}
    else{c="exit";break;}
   }
  }
  if(c=="exit"){return;}
 }
// if(document.getElementById("foundResult")){clearResult(true)}
 var dts=document.getElementsByTagName('DT');
 var dds=document.getElementsByTagName('DD');
 var l=dds.length;if(dts[l-1].id=="sizeinfo"){l--;}
 var found = new Array;
 var bodyText=document.body.createTextRange();
 for(var i=l;i--;){
  var o = dds[i];
  var p = dts[i];
  bodyText.moveToElementText(p);  var checkDT=bodyText.findText(word,0);
  bodyText.moveToElementText(o);  var checkDD=bodyText.findText(word,0);
  if(checkDT || checkDD){activate(p,foundColor[c]);found.unshift(p.firstChild.innerText)}
  else if(singleColor)  {deactivate(p);}
 }
 if(found){foundReturn(found)}
}
//==========逆参照
function searchRef(obj){
 if(obj.name!='reffered'){
  var num=obj.firstChild.innerText;
  var dds=document.getElementsByTagName('DD');
  var l=dds.length;
  var found = new Array;
  for(var i=l;i--;){
   //そのレスより前までいったら終了
   if(num==dds[i].previousSibling.firstChild.innerText){break}
   //逆参照内のDDなら回避
   if(dds[i].parentElement.className=="refResult"){continue}
   //逆参照の有無を確認して、DDの用意
   var exist=false;
   var dd=dds[i].cloneNode(true);
   if(dd.lastChild.tagName=="DL"){dd.lastChild.removeNode(true);} //逆参照の除去
   if(dd.lastChild.name){dd.lastChild.removeNode(true);} // LABELNUMBERがないものに係る不要アンカーの除去
   var ddAnc=dd.getElementsByTagName("A");
   for(var j=ddAnc.length;j--;){
    var a=ddAnc[j];
    if(checkAnchor(a.href)!=1){continue}
    var anc=tohan(a.innerText.replace(/[>＞]/g,""));
    if(num==anc.replace(/\D/g,"")){exist=true;break}
   }
   //存在したらDTを用意して、配列に格納
   if(exist){
    var dt=dds[i].previousSibling.cloneNode(true);
    found.unshift(dt.outerHTML.replace(/name=.*?>/,">")+dd.outerHTML.replace(/<a name=.*>/i,""));
    obj.name="reffered";
   }
  }
  if(found.length){returnRef(obj.nextSibling,found)}
 }else{
  obj.nextSibling.lastChild.removeNode(true);
  obj.name='';
 }
}
// 逆参照結果表示
function returnRef(dd,found){
 if(found.length<1 || found.length>=20 && confirm("20以上あるけど表示する？")==false){return false;}
 dd.insertAdjacentHTML('beforeEnd','<dl class="refResult">'+found.join("")+'</dl>')
// dd.previousSibling.name='reffered';
}

// クリップボードにコピー
function copyText(target){
 var num=event.srcElement.parentElement.name;
 var obj=getDTfromAnc(num);
 var decoy=document.createDocumentFragment();
 var textarea=document.createElement("TEXTAREA");
 if     (target=="res") {textarea.value=obj.firstChild.innerText+" ："+obj.childNodes[1].innerText+" ："+obj.lastChild.innerText+"\n"+obj.nextSibling.innerText+"\n";}
 else if(target=="name"){textarea.value=obj.childNodes[1].innerText+"\n";}
 else if(target=="id")  {textarea.value=obj.lastChild.innerText.substr(15)+"\n";}
 decoy.appendChild(textarea);
 var copyText=decoy.getElementsByTagName("TEXTAREA")[0].createTextRange();
 copyText.execCommand("Copy")
 event.srcElement.parentElement.removeNode(true);
}
// アンカーからDTを特定\\
function getDTfromAnc(num){
 var obj; var anc=document.getElementsByName(anchorHead+num)[0];
 if(!anc){return("")} //LABELNUMBER対応のあぼ〜ん若しくは未出番号なら終了
 if(document.anchors[0].parentElement.tagName=="DT"){   //LABELNUMBER対応のもの
  obj=anc.parentElement;
 }else{  //LABELNUMBER非対応のもの
  if(num==1){
   if(anc){obj=anc.nextSibling}else{return("")}
  }else{
   if(!anc.nextSibling){obj=anc.parentElement.nextSibling}else{return("")}
  }
 }
 return(obj);
}