// イベントハンドラ：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 foundResult;
//==========名前・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="objs[i].innerText"} //名前・トリップ
 else           {var reg=getID(obj);   var target="getID(objs[i])"   } //ID
 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(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(!foundResult){document.body.insertAdjacentHTML('afterBegin','<div id="foundResult"></div>');foundResult=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){
  foundResult.innerHTML=buttons;	foundResult.title=found.join(" ");
 }else{
  for(var i=0;i<found.length;i++){found[i] = addAnchor(found[i],found[i])}
  foundResult.innerHTML=found.join(" ")+buttons;
 }
 
}
// 結果消去、結果削除
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(foundResult){foundResult.removeNode(true);foundResult="";}
}

//==========単語検索
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];
  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;
  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){
    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="referred";
   }
  }
  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>')
}

// クリップボードにコピー
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を特定
function getDTfromAnc(num){
 var anc=document.anchors(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);
}