// ==UserScript==
// @name           linkPop.user.js
// @namespace      http://furyu.tea-nifty.com/
// @description    linkPop ver.0.01m
// @include        http://*
// ==/UserScript==

(function(){

// ======
var	limitLinks=0;				// upper limit to the number of link objects(0:unlimited)
var	waitCssFile=300;			// ms
var	linkColor='#0000ee';		// color of link
var	visitColor='#551a8b';		// color of visited-link
var	bgColor='#faf0f0';			// background-color
var	bgColorHeader='#99CCFF';	// background-color of table-header
var	overlay=(typeof lp_overlay=='undefined'||lp_overlay==true)?true:false;
// ======

var	d,w;
if (typeof unsafeWindow!='undefined') {
	w=unsafeWindow; if (w!=top) return false; d=w.document;
}
else {
	w=window; d=document;
}
var	isIE=(w.navigator.userAgent.match(/msie\s+(\d)\./i))?true:false;
var	ieVN=(isIE)?RegExp.$1:0;
var	isFF=(w.navigator.userAgent.match(/firefox/i))?true:false;
var	isOpera=(w.opera)?true:false;

// === TEST
var	t1,t2,t3;
t1=(new Date()).getTime();

try {
	var	cssAddRule=(function(){
		var	s=d.styleSheets[0];
		if (s.addRule) {			// for IE
			return function(selector,property){s.addRule(selector,'{'+property+'}')};
		}
		else if (s.insertRule) {	// for others
			return function(selector,property){s.insertRule(selector+'{'+property+'}',s.cssRules.length)};
		}
	})();	//	end of cssAddRule()
	cssAddRule('a.lp_link:link','color:'+linkColor+';');
	cssAddRule('a.lp_link:visited','color:'+visitColor+';');
	if (isIE) {
		cssAddRule('#lp_link_window td','word-break:break-all;');
	}
	waitCssFile=0;
}
catch (e) {
	var	css=d.createElement('link');
	css.rel='stylesheet';
	css.type='text/css';
	css.href='http://furyu.tea-nifty.com/script/linkPop.css';
	d.getElementsByTagName('head')[0].appendChild(css);
}

setTimeout(function(){

function	getObjectColor(obj) {
	var	style=obj.currentStyle||d.defaultView.getComputedStyle(obj,'');
	return style.color;
}	//	end of getObjectColor()

var	addWordBreak=(function(){
	if (isIE) {
		return function(html) {return html};
	}
	else {
		var	wb='<wbr />';
		var	reg1=/[:\-\.\/\?=;_,\d]/g, fnc1=function(s){return s+wb};
		var	reg2=/%/g, fnc2=function(s){return wb+s};
		return function(html) {
			return html.replace(reg1,fnc1).replace(reg2,fnc2);
		};
	}
})();	//	end of addWordBreak()

function	getCookie(name) {
	var	value=null;
	for (;;) {
		var	key=name+'=';
		var	curCookie=d.cookie;
		var	keyStart=curCookie.indexOf(key);
		if (keyStart<0) break;
		var	valStart=keyStart+key.length;
		var	valEnd=curCookie.indexOf(';',valStart);
		if (valEnd<0) valEnd=curCookie.length;
		value=decodeURIComponent(curCookie.substring(valStart,valEnd));
		break;
	}
	return value ;
}	//	end of getCookie()

function	setCookie(name,value,expires) {
	d.cookie=[
		name + '=' + encodeURIComponent(value)
	,	'expires=' + expires.toGMTString()
	,	'domain=' + d.domain
	,	'path=/'
//	,	'secure;'
	].join(';');
	return	getCookie(name);
}	//	end of setCookie()

function	setCookiePerm(name,value) {
	var	expires = new Date();
	expires.setFullYear(expires.getFullYear()+100);
	return setCookie(name,value,expires);
}	//	end of setCookiePerm()

var	getEncodeHref=(function(){
	if (isIE&&ieVN<7) {
		var	reg=/%[0-7][a-f\d]/gi;
		var	fnc_unescape=function(s){return unescape(s)};
		return function(href) {
			var	tmphref=escape(href);
			if (href!=tmphref) href=tmphref.replace(reg,fnc_unescape);
			return href;
		};
	}
	else if (isOpera) {
		return function(href) {
			href=encodeURI(href);
			return href;
		};
	}
	else return function(href) {return href};
})();	//	end of getEncodeHref()

var	links_nonvisited=[];
var	links_visited=[];
var	links_check=[];

var	links=d.getElementsByTagName('a');

var	getHtml=(function(){
	var	regScriptElm=/<(no)?script.*?>(.|[\r\n])*?<\/(no)?script>/mgi;
	var	regTag=/<\/?[^>]+>/gi;
	return function(link,html) {
		var	htmlNoTag=html.replace(regScriptElm,'').replace(regTag,'');
		if (htmlNoTag) {
			return htmlNoTag;
		}
		else {
			try {
				link.innerHTML=html;
			}
			catch(e) {
				return '';
			}
			var	tmpTitle='';
			var	img=link.getElementsByTagName('img')[0];
			if (img) tmpTitle=img.title||img.alt;
			return tmpTitle.replace(regTag,'');
		}
	};
})();	//	end of getHtml()

var	getLinkObj=function(href,html) {
	var	link=d.createElement('a');
	link.className='lp_link';
	link.href=href;
	link.target='_self';
	link.innerHTML=getHtml(link,html);
// === Debug
//	d.body.appendChild(link);
	return link;
};

var	updateLinkObj=function(link,html) {
	var	oldHtml=link.innerHTML;
	var	newHtml=getHtml(link,html);
	link.innerHTML=(oldHtml.length<newHtml.length)?newHtml:oldHtml;
	return link;
};

var	testLink=getLinkObj('file:///C:/linkPop_CHECK_LINK_COLOR/','linkPop_test');
var	lColor=getObjectColor(testLink);

var	cntLinkObj=0;
for (var ci=0,len=links.length; ci<len; ci++) {
	var	link=links[ci];
	var	href=getEncodeHref(link.href);
	if (link.className.match(/^lp_link/i) ) continue;
	if (!href) continue;
	var	tgt=links_check[href];
	if (tgt) {
		updateLinkObj(tgt,link.innerHTML);
		continue;
	}
	else {
		tgt=getLinkObj(href,link.innerHTML);
		links_check[href]=tgt;
		cntLinkObj++;
	}
	var	lc=getObjectColor(tgt);
	if (lc==lColor) {
		links_nonvisited[links_nonvisited.length]=tgt;
	}
	else {
		links_visited[links_visited.length]=tgt;
	}
	if (0<limitLinks&&limitLinks<=cntLinkObj) break;
// === Debug
//	tgt.innerHTML=lc+' vs '+lColor+':'+tgt.innerHTML;
}

// === TEST
t2=(new Date()).getTime();

var	tgtwin=d.getElementById('lp_link_window') || d.createElement('div');
tgtwin.id='lp_link_window';

with (tgtwin.style) {
	width='100%'; margin='0px'; padding='0px'; display='block'; color='#000000';
	if (overlay) {
		position='absolute'; top='0px'; left='0px';
		backgroundColor='transparent';
	}
	else {
		backgroundColor=bgColor;
	}
	zIndex='10000';
};

var	makeTable=function(links, id, text) {
	var	table=d.createElement('table');
	with (table.style) {
		margin='4px'; width='95%'; border='solid darkblue 2px'; borderCollapse='collapse';
	}
	var	tbody=d.createElement('tbody');
	table.appendChild(tbody);
	
	var	tr=d.createElement('tr');
	var	th1=d.createElement('th');
	with (th1.style) {
		textAlign='left'; fontSize='14px'; border='solid darkblue 1px'; color='darkblue'; backgroundColor=bgColorHeader; width='30%';
	}
	th1.innerHTML='<a id="'+id+'"></a>'+text+' ('+links.length+')';
	
	var	th2=d.createElement('th');
	with (th2.style) {
		textAlign='left'; fontSize='14px'; border='solid darkblue 1px'; color='darkblue'; backgroundColor=bgColorHeader;
	}
	th2.innerHTML='URI';
	
	tr.appendChild(th1);
	tr.appendChild(th2);
	
	tbody.appendChild(tr);
	
	var	td1Style={textAlign:'left',fontSize:'14px',border:'solid darkblue 1px',color:'black',width:'30%'};
	var	td2Style={textAlign:'left',fontSize:'14px',border:'solid darkblue 1px',color:'black'};
	for (var ci=0,leni=links.length; ci<leni; ci++) {
		var	link=links[ci];
		if (!link.innerHTML) {
			link.innerHTML='(*)';
		}
		else {
			link.innerHTML=addWordBreak(link.innerHTML);
		}
		try {
			var	href=getEncodeHref(link.href);
		}
		catch(e) {
//			alert(link.innerHTML);
			continue;
		}
		var	tr=d.createElement('tr');
		
		var	td1=d.createElement('td');
		td1.appendChild(link);
		var	tdStyle=td1.style;
		for (var elm in td1Style) tdStyle[elm]=td1Style[elm];
		
		var	td2=d.createElement('td');
		td2.innerHTML=addWordBreak(href);
		tdStyle=td2.style;
		for (var elm in td2Style) tdStyle[elm]=td2Style[elm];
		
		tr.appendChild(td1);
		tr.appendChild(td2);
		
		tbody.appendChild(tr);
	}
	return table;
};

var	table_nonvisited=makeTable(links_nonvisited,'lp_non_visited','NON-VISITED LINKS');
var	table_visited=makeTable(links_visited,'lp_visited','VISITED LINKS');

tgtwin.innerHTML=[
	'<div id="lp_link_table" style="display:none;margin:0px;padding:0px;width:100%;font-size:12px;text-align:left;">'
,	'<div style="margin:4px;padding:0px;"><br />'
,	'<a href="#lp_visited" class="lp_link" style="clear:both;" target="_self">To VISITED LINKS</a><br />'
,	'<div class="lp_link_table_frame"></div>'
,	'<a href="#lp_non_visited" class="lp_link" style="clear:both" target="_self">Return</a><br />'
,	'<br />'
,	'<div class="lp_link_table_frame"></div>'
,	'<a href="#lp_visited" class="lp_link" style="clear:both" target="_self">Return</a><br />'
,	'<a href="#lp_non_visited" class="lp_link" style="clear:both" target="_self">To NON-VISITED LINKS</a><br />'
,	'<br />'
,	'</div>'
,	'</div>'
].join('');

var	divs=tgtwin.getElementsByTagName('div');
for (var ci=0,cnt=0,len=divs.length; ci<len; ci++) {
	var	div=divs[ci];
	if (div.className!='lp_link_table_frame') continue;
	div.appendChild(((cnt==0)?table_nonvisited:table_visited));
	cnt++;
}
d.body.insertBefore(tgtwin,d.body.firstChild);

var	lpbutton=d.createElement('div');
lpbutton.innerHTML='<img src="http://furyu.tea-nifty.com/script/arrowdown.gif" width="16" height="16" style="float:left" title="Show Link List" alt="Show Link List" />&nbsp;<span>Show Link List</span><br style="clear:both" />';
with (lpbutton.style) {
	lineHeight='16px';
	fontSize='12px';
	textAlign='left';
	cursor='pointer';
}
var	lpbutton2=lpbutton.cloneNode(true);
lpbutton2.innerHTML=lpbutton.innerHTML.replace(/Show/g,'Hide').replace(/arrowdown/,'arrowup');
if (overlay) {};

var	tgttable=d.getElementById('lp_link_table');
tgtwin.removeChild(tgttable);

var	tgtTagNames=['select','object','iframe','embed'];
var	tgtObjs=[];

var	setLinkButtonDynamic=function(){
	var	lpbuttonSpan=lpbutton.getElementsByTagName('span')[0];
	lpbuttonSpan.style.display='none';
	with (lpbutton.style) {
		lineHeight='4px'; backgroundColor='transparent';
	}
	lpbutton.onmouseover=function(){
		lpbuttonSpan.style.display='inline';
		with (lpbutton.style) {
			lineHeight='16px'; backgroundColor=bgColor;
		}
	};
	lpbutton.onmouseout=function(){
		lpbuttonSpan.style.display='none';
		with (lpbutton.style) {
			lineHeight='4px'; backgroundColor='transparent';
		}
	};
};

var	setLinkButtonStatic=function(){
	var	lpbuttonSpan=lpbutton.getElementsByTagName('span')[0];
	lpbuttonSpan.style.display='inline';
	with (lpbutton.style) {
		lineHeight='16px'; backgroundColor=bgColor;
	}
	lpbutton.onmouseover=lpbutton.onmouseout=function(){};
};

var	objectResume=function(){
	while (tgtObjs.length) {
		var	tgtObj=tgtObjs.pop();
		try{tgtObj.style.display=tgtObj.odisplay;}catch(e){};
	}
	tgtwin.style.backgroundColor='transparent';
	setLinkButtonDynamic();
} ;	//	end of objectResume()

var	objectSuspend=function(){
	tgtObjs=[];
	for (var ci=0,leni=tgtTagNames.length; ci<leni; ci++) {
		var	objs=d.getElementsByTagName(tgtTagNames[ci]) ;
		for (var cj=0,lenj=objs.length; cj<lenj; cj++) {
			objs[cj].odisplay=objs[cj].style.display;
			objs[cj].style.display='none';
			tgtObjs[tgtObjs.length]=objs[cj];
		}
	}
	tgtwin.style.backgroundColor=bgColor;
	setLinkButtonStatic();
} ;	//	end of objectSuspend()

lpbutton2.onclick=lpbutton.onclick=function(){
	if (tgttable.style.display=='none') {
		tgttable.style.display='block';
		tgtwin.insertBefore(tgttable,tgtwin.firstChild);
		lpbutton.innerHTML=lpbutton.innerHTML.replace(/Show/g,'Hide').replace(/arrowdown/,'arrowup');
		setCookiePerm('lp_show','true');
		if (overlay) {
			objectSuspend();
		}
	}
	else {
		tgttable.style.display='none';
		tgtwin.removeChild(tgttable);
		lpbutton.innerHTML=lpbutton.innerHTML.replace(/Hide/g,'Show').replace(/arrowup/,'arrowdown');
		setCookiePerm('lp_show','false');
		if (overlay) {
			objectResume();
		}
	}
	w.scrollTo(0,0);
};
tgttable.insertBefore(lpbutton2,tgttable.firstChild);
tgtwin.appendChild(lpbutton);

setLinkButtonDynamic();

// === TEST
t3=(new Date()).getTime();
/*
alert('t1-t2:'+(t2-t1)+' t3-t1:'+(t3-t1));
*/
if (getCookie('lp_show')=='true') lpbutton.onclick();

}
,waitCssFile);

})();

