/********************
キーワードカララー Ver. 1.3 （KeyWords Colorer）
(c) Wings-Winds, 2008, http://www.wi-wi.jp/
http://sozai.wi-wi.jp/gadgets/kwc/index.html
********************/
var WIKWC={
	defs:{
		_style:'border-bottom:1px dotted #0000ff'
		,id:'WIKWC'
		,cname:'findtext'
		,cnt:0
		,baseurl:'http://sozai.wi-wi.jp/gadgets/kwc/'
		,scrname:'kwc.js'
	}
	,sWords:[]
	,gRngs:[]
	,divs:{
		container:null
		,popup:null
		,history:null
	}
	,opts:{
		posx:'left'
		,design:'blue'
		,color:'#000000'
		,bgcolor:'#ffffff'
		,kwcolor:'#ff0000'
		,kwbgcolor:'#ffe5e5'
	}
	,isPop:false
	,tpls:{
		container:'<div id="%id%" style="position:static;display:block;"></div>'
		,content:'<div style="position:relative;">'+
			'<div id="%id%view" style=""><a href="javascript:%id%.Popup();" title="setting"><img src="%baseurl%setting.png" alt="setting" style="width:24px;height:24px;border:0 none;text-align:left;vertical-align:top;">KeyWords Colorer</a></div>'+
			'<div id="%id%popup" style="display:none;">'+
				'<p><a href="%baseurl%" style="">(c) Wings-Winds</a></p>'+
				'<form onsubmit="return false;">'+
				'<fieldset><input type="text" name="%id%SearchText" size="10" onkeydown="%id%.SearchKey(event);" style="width:100px;border:1px solid #999;"><input type="button" value="検索" onclick="%id%.Search(this.form.%id%SearchText.value);this.form.%id%SearchText.focus();" style="width:45px;border:1px solid #999;"></fieldset>'+
				'<hr style="display:block;height:1px;width:120px;margin:5px auto;color:green;background-color:green;">'+
				'<p><a href="javascript:%id%.History();"><img src="%baseurl%del.png" alt="" style="border:0;text-align:left;vertical-align:middle;width:24px;height:14px;">履歴削除</a></p>'+
				'<fieldset id="%id%history" style="padding-left:24px;"></fieldset></form>'+
			'</div>'+
			'</div>'
	}
	,xmlns:''
	,isXml:false
	
};//

/****/
WIKWC.Init=function(){
	for(var t in this.tpls){
		while(this.tpls[t].search(/%(.+?)%/g)!=-1){
			var key=RegExp.$1;
			var r=new RegExp('%'+key+'%', 'g');
			this.tpls[t]=this.tpls[t].replace(r, this.defs[key]||'');
		}
	}

	this.SetXmlns();

	if(this.isXml){
		var div=this.U.CreateElement('div');
		div.innerHTML=this.tpls.container;
		this.divs.container=div.firstChild;
		div=null;
	}else{
		document.write(this.tpls.container);
	}

	if(window.addEventListener)
		window.addEventListener('load', function(){WIKWC.Start();}, false);
	else if(window.attachEvent)
		window.attachEvent('onload', function(){WIKWC.Start();} );
	
};//Init


/****/
WIKWC.Start=function(){
	delete this.Init;
	
	var scrs=document.getElementsByTagName('script');
	if(this.isXml){
		for(var i=0;i<scrs.length;i++){
			//if(scrs[i].src==WIKWC.defs.baseurl+WIKWC.defs.scrname){
			if(scrs[i].src.indexOf(WIKWC.defs.scrname)!=-1){
				scrs[i].parentNode.insertBefore(this.divs.container, scrs[i]);
				break;
			}
		}
	}else{
		this.divs.container=document.getElementById(this.defs.id);
	}

	// オプションの初期化
	var scr;
	for(var i=0;i<scrs.length;i++){
		scr=scrs[i].src;
	//	if(scr.indexOf(scr.indexOf(this.defs.baseurl+this.defs.scrname))!=-1){
		if(scr.indexOf(this.defs.scrname)!=-1){
			scr=scr.substring(scr.indexOf('?')+1);
			break;
		}
	}
	if(scr){
		for(var i=0,ts=scr.split('&'),t;i<ts.length;i++){
			t=ts[i].split('=');
			this.opts[t[0]]=t[1];
		}
	}
	delete scrs;
	delete scr;
	
	this.divs.container.innerHTML=this.tpls.content;
	this.divs.popup=document.getElementById(this.defs.id+'popup');
	this.divs.history=document.getElementById(this.defs.id+'history');


	// スタイルシートの適用
	this.SetOptionStyles();
	
	this.SetDefaultStyles(this.divs.container);
	var cs=[];
	for(var i=0,c,ds=this.divs.container.childNodes;i<ds.length;i++){
		c=ds[i];
		if(c.nodeType==1)
			cs.push(c);
	}
	for(var i=0,c;c=cs[i];i++){
		if(c.nodeType!=1)
			continue;
		this.SetDefaultStyles(c);
		if(c.hasChildNodes)
			//for(var j=0,ch;ch=c.childNodes[j];j++)
			for(var j=0,ch;j<c.childNodes.length;j++){
				ch=c.childNodes[j];
				if(ch.nodeType==1)
					cs.push(ch);
			}
	}
	delete cs;

	// リファラーのカラーリング
	var buf=document.referrer;
	var refs={};
	if(buf)
		buf=buf.substring(buf.indexOf('?')+1);
	if(buf)
		buf=buf.split('#')[0];
	if(buf){
		var as=buf.split('&');
		for(var i=0,a;i<as.length;i++){
			a=as[i].split('=');
			refs[decodeURIComponent(a[0])]=decodeURIComponent(a[1]);
		}
		delete as;
	}
	// Google, MSN, Yahoo!, Livedoor, Biglobe, ask.jp ,live : q
	// Yahoo! Japan : p
	// Infoseek-rakuten : qt
	// Excite : search
	// Goo : MT
	// @Nifty : Text
	// Fresh Eye : kw
	// Baidu : wd
	// Wordpress : s
	// Movable Type : search
	buf=refs['q']||refs['p']||refs['qt']||refs['search']||refs['MT']||refs['Text']||refs['kw']||refs['wd']||refs['s'];
	if(buf)
		this.sWords=buf.split('+');
	delete buf;
	delete refs;

	this.Search();
	
};//Start

/****/
WIKWC.Search=function(txt){
	if(txt && txt.length!=0)
		this.sWords=txt.split(' ');

	if(document.body.createTextRange)
		this.IE();
	else if(document.createTextNode && window.find)
		if(navigator.userAgent.toLowerCase().indexOf('applewebkit')!=-1)
			if(txt)
				this.SF();
			else
				setTimeout("WIKWC.SF()",100);
		else
			this.FX();
	else if(window.opera)
		this.OP();

	var t=document.getElementsByName(this.defs.id+'SearchText');
	if(t)
		t[0].value='';

	this.sWords=[];

	delete t;

};//Search


/****/
WIKWC.SearchKey=function(e){
	var c;
	if(e){
		c=e.keyCode;
	}else{
		c=event.keyCode;
	}
	if(c==13)
		this.Search(e.target?e.target.value:event.srcElement.value);
	
	if(e.target)
		e.target.focus();
	else
		event.srcElement.focus();
};//SearchKey
/****/
WIKWC.IE=function(){
	for(var i=0,word;i<this.sWords.length;i++){
		word=this.sWords[i];
		var oRange = document.body.createTextRange();
		var txt=this.MakeWord(word, 'span',true);
		while( oRange.findText(word)){
			oRange.pasteHTML(txt);
			oRange.moveStart('character',txt.length);
		}
		this.History(word);
		this.defs.cnt++;
	}
	return true;

};//IE

/****/
WIKWC.FX=function(){
	var p=[window.scrollX, window.scrollY];
	var sel=document.createRange();
	sel.collapse(document.body, true);

	for(var i=0,word;i<this.sWords.length;i++){
		word=this.sWords[i];

		// findの検索開始位置をドキュメントの最初に持って行く
		document.body.blur();

		// 実際の検索開始
		while(find(word,false,false)){ // case insensitive
			sel=getSelection();
			if(sel!=undefined && sel.rangeCount>0)
				sel.getRangeAt(0).surroundContents(this.MakeWord(word,'span'));
			
		}
		if(sel!=undefined && sel.rangeCount>0){
			sel.collapse(document.body, true);
			sel=null;
		}
		this.History(word);
		this.defs.cnt++;

	}
	scrollTo(p[0],p[1]);
	return true;
};//FX

/****/
WIKWC.SF=function(){
	var p=[window.scrollX, window.scrollY];
	var sel=document.createRange();
	sel.collapse(document.body,0);
	document.body.blur();
	for(var i=0,word;i<this.sWords.length;i++){
		word=this.sWords[i];
		var len=this.MakeWord(word,'span',true).length;

		//カーソルをドキュメントの最後に
		while(find(word,false,false));

		sel=getSelection();
		if(sel!=undefined && sel.rangeCount>0)
			sel.getRangeAt(0).surroundContents(this.MakeWord(word,'span'));

		// 苦肉の策ってことで。最後から前に向かって検索
		while(find(word,false,true)){
			sel=getSelection();
			if(sel!=undefined && sel.rangeCount>0)
				sel.getRangeAt(0).surroundContents(this.MakeWord(word,'span'));
		}
		sel=null;
		this.History(word);
		this.defs.cnt++;
	}
	scrollTo(p[0],p[1]);
	return true;
};//SF

/****/
WIKWC.OP=function(){
	return true;
}


/****/
WIKWC.Delete=function(word){
	var es=document.getElementsByTagName('span');
	for(var i=0,e;i<es.length;i++){
		e=es[i];
		if(!e || e.className.indexOf(this.defs.cname)==-1)
			continue;
		if(word!=undefined && word!=e.textContent && word!=e.innerText)
			continue;
		
//		if(e.removeNode)
//			e.removeNode(false);
//		else{
			var txt=document.createElement(e.nodeName);
			txt.appendChild(document.createTextNode(e.textContent||e.innerText));
			e.parentNode.replaceChild(txt, e);
//		}
	}
	
	var t=document.getElementsByName(this.defs.id+'SearchText');
	if(t)
		t[0].focus();
	delete t;

	return true;

};//Delete

/****/
WIKWC.History=function(word, add){
	if(word==undefined){
		this.Delete();
		while(this.divs.history.firstChild)
			this.divs.history.removeChild(this.divs.history.firstChild);
	}else if(add=='delete'){
		this.Delete(word);
		for(var i=0,c,t;c=this.divs.history.childNodes[i];i++){
			t=c.textContent||c.innerText;
			if(t==word){
				this.divs.history.removeChild(c);
				break;
			}
		}
	}else{
		var p=document.createElement('p');
		var a=this.MakeWord(word,'a');
		a.title=word+'を削除';
		a.href='javascript:void("'+word+'を履歴から削除");';
		a.onclick=function(){WIKWC.History(word, 'delete');};
		p.appendChild(a);
		this.SetDefaultStyles(p);
		this.divs.history.appendChild(p);
	}
};//History

/****/
WIKWC.MakeWord=function(word,tag, wantsText){
	var div=document.createElement('div');

	var t='<'+tag+' class="'+this.defs.cname+this.defs.cnt+'" style="color:'+this.opts.kwcolor+';background-color:'+this.opts.kwbgcolor+';'+this.defs._style+'">'+word+'</'+tag+'>';
	if(wantsText)
		return t

	div.innerHTML=t;
	return div.firstChild;
};//MakeWord

/**
<a href="javascript:WIKWC.Popup()">なのでreturnなし
**/
WIKWC.Popup=function(){
	if(this.isPop){
		with(this.divs.popup.style){
		display='none';
		}
		var t=document.getElementsByName(this.defs.id+'SearchText');
		if(t)
			t[0].blur();
	}else{
		with(this.divs.popup.style){
		display='block';
		}
		var t=document.getElementsByName(this.defs.id+'SearchText');
		if(t)
			t[0].focus();
	}
	this.isPop=!this.isPop;
};//Popup


/****/
WIKWC.SetOptionStyles=function(){
	//option処理
	with(this.divs.container.style){
	width='150px';
	height='30px';
	border='1px solid blue';
	padding='2px 4px';
	margin='2px';
	
	}//with container
	
	with(this.divs.popup.style){
	left='-5px'; // border,padding
	position='absolute';
	border='1px solid blue';
	padding='2px 4px';
	top='30px';
	width='150px';
	}//with popup

};//SetOptionStyles

/****/
WIKWC.SetDefaultStyles=function(elm){
	var defaults={
	color:this.opts.color//'#000000'
	,backgroundColor:this.opts.bgcolor//'white'
	,backgroundImage:'none'
	,backgroundPosition:'center top'
	,backgroundRepeat:'no-repeat'
	,fontSize:'14px'
	,fontWeight:'normal'
	,lineHeight:'normal'
	,fontStyle:'normal'
	,fontVariant:'normal'
	,position:'static'
	,marginTop:'0'
	,marginBottom:'0'
	,marginLeft:'0'
	,marginRight:'0'
	,paddingTop:'0'
	,paddingBottom:'0'
	,paddingLeft:'0'
	,paddingRight:'0'
	,borderTopWidth:'0px'
	,borderTopStyle:'none'
	,borderBottomWidth:'0px'
	,borderBottomStyle:'none'
	,borderLeftWidth:'0px'
	,borderLeftStyle:'none'
	,borderRightWidth:'0px'
	,borderRightStyle:'none'
	,styleFloat:'none'
	,cssFloat:'none'
	,clear:'both'
	,textAlign:'left'
	,width:'auto'
	,height:'auto'
	,visibility:'visible'
//	,overflow:'hidden' // ブラウザデフォルトはoverflow:auto
//	,clip:'auto' // clipはIEでエラーになるため処理できない
	,zoom:'normal'
	,textJustify:'auto'
	,textIndent:'0px'
	,letterSpacing:'normal'
	,wordSpacing:'normal'
	,textDecoration:'none'
	,whiteSpace:'normal'
	};//defaults
	
	for(var i in defaults){
		if(!this.GetStyle(elm,i))
			elm.style[i]=defaults[i];
	}
	// displayプロパティの初期化
	// 空文字列の代入だけで良いかも知れない
	if(elm.style.display==''){
	elm.style['display']='';
	var nm=elm.nodeName.toUpperCase();
	if(nm=='DIV' || nm=='P' || nm=='HR')
		elm.style['display']='block';
	else if(nm=='A' || nm=='SPAN')
		elm.style['display']='inline';
	else if(nm=='IMG')
		elm.style['display']='inline';
		//elm.style['display']='inline-block'; // 各ブラウザ未サポート
	}
	
};//SetDefaultStyles

/****/
WIKWC.GetStyle=function(el, prop){
	return (!!el.style && el.style[prop])?el.style[prop]:'';
};//GetStyle


/** XHTMLへのサポート ***/
/****
属性にはnamespaceがなくてもよい
****/
WIKWC.SetAttribute=function(tag, attrname, value){
//	if(this.isXml && tag.nodeName.toUpperCase()!='SCRIPT'){
//		if(value==undefined)
//			value=attrname;
//		tag.setAttributeNS(this.xmlns, attrname, value, 1);
//	}else
		tag.setAttribute(attrname, value, 1);
	return tag;
};//SetAttribute

/*****/
WIKWC.CreateElement=function(tagname){
	if(this.isXml)
		return document.createElementNS(this.xmlns, tagname);
	else
		return document.createElement(tagname);
};//CreateElement

/*****/
WIKWC.SetXmlns=function(){
	var isIE=!window.opera && window.all;
	var ns="http://www.w3.org/1999/xhtml";
	var doc=document.documentElement;
	if(isIE || !doc || !document.createElementNS || !doc.getAttributeNS){
		this.isXml=false;
		return this;
	}
	var cType=doc.contentType||'';
	if( cType.indexOf('xml')!=-1
	 || document.xmlVersion!=null
	 || doc.getAttributeNS(ns, 'xmlns')
	 ){
		this.isXml=true;
		this.xmlns=ns;
	}else{
		this.isXml=false;
	}
	
	return this;
};//SetXmlns


/****/
WIKWC.Init();

