// ==UserScript==
// @name           cocoShowHB.user.js
// @namespace      http://furyu.tea-nifty.com/
// @description    Show comments of HatenaBookmark on cocolog ver.0.01e
// @include        http://*-nifty.com/*
// @exclude        http://*http://
// ==/UserScript==

(function(){
var	maxShowNum=3;
var	maxShowSide=5;

var	oWindow=window;
if (typeof unsafeWindow!='undefined') {
	window=unsafeWindow;
	document=window.document;
}
var	w=window,d=document;
var	AutoPagerize=w.AutoPagerlike||oWindow.AutoPagerize;

var	getElementsByTagAndClassName=function(tagName,className,parent) {
	if (!parent) parent=d;
	var children=parent.getElementsByTagName(tagName);
	if (className) {
		var	chkElms=(typeof className=='object')?className:className.split(' ');
		var	flgElms=[];
		for (var ci=0,len=chkElms.length; ci<len; ci++) flgElms[chkElms[ci]]=true;
		var elements=[];
		for (var ci=0,leni=children.length; ci<leni; ci++) {
			var child=children[ci];
			var cname=child.className;
			if (!cname) continue;
			var cnameElms = cname.split(' ');
			for (var cj=0,lenj=cnameElms.length; cj<lenj; cj++) {
				if (flgElms[cnameElms[cj]]) {
					elements.push(child);
					break;
				}
			}
		}
		return elements;
	}
	else {
		return children;
	}
}	//	end of getElementsByTagAndClassName()

var	setEventHandler=(function(){
	if (w.attachEvent) {
		return function(obj,evt,handler){obj.attachEvent('on'+evt,handler)};
	}
	else if (w.addEventListener) {
		return function(obj,evt,handler){obj.addEventListener(evt,handler,false)};
	}
	else {
		return function(obj,evt,handler){var org=obj['on'+evt];obj['on'+evt]=function(){if(typeof org=='function')org();handler()}};
	}
})();	//	end of setEventHandler()

var	addScript=(function(){
	var	head=d.getElementsByTagName('head')[0]
	return function(src){
		var	s=d.createElement('script');
		s.type='text/javascript';
		s.src=src;
		head.appendChild(s);
	}
})();	//	end of addScript()

var	stripTags=function(txt){return txt.replace(/<\/?[^>]+>/gi,'')};
	
(function(){
var	stgt=d.getElementById('cocoShowHBside');
while (stgt) {
	if (stgt.getElementsByTagName('ul')[0]) break;
	var	list=d.createElement('ul');
	stgt.appendChild(list);
	var	h1=d.getElementsByTagName('h1')[0];
	if (!h1) break;
	var	link=h1.getElementsByTagName('a')[0];
	if (!link) break;
	w.cocoShowHBside=function(result){
		if (result&&0<result.count) {
			var	entries=result.value.items,cmtcnt=0,items=[],itemHashes=[];
			for (ci=0,len=entries.length; ci<len&&cmtcnt<maxShowSide; ci++) {
				var	entry=entries[ci], content=stripTags(entry.content);
				if (0<content.replace(/(\s|[\r\n])/mg,'').length) {
					cmtcnt++;
//					var	itemURL=entry['annotate:reference']['rdf:resource'];
					var	itemURL=entry['rdf:about'];
					var	econtent=entry['content:encoded'],bmURI=entry.link;
					if (econtent&&econtent.match(/(http:\/\/b\.hatena\.ne\.jp\/.*?\/\d+#bookmark-\d+)/mi)) {
						bmURI=RegExp.$1;
					}
					var	item=itemHashes[itemURL];
					if (!item) {
						var	item=items[items.length]=d.createElement('li');
						var	itemlink=d.createElement('a');
						itemlink.innerHTML=entry.title.replace(/^.*?: /,'');
						itemlink.href=itemURL;
						var	cmtlist=d.createElement('ul');
						cmtlist.className='tree';
						item.appendChild(itemlink);
						item.appendChild(cmtlist);
						list.appendChild(item);
						itemHashes[itemURL]=item;
					}
					var	cmtlist=item.lastChild;
					var	cmt=d.createElement('li');
					cmt.className='lst';
					var	date=new Date(entry['dc:date'].replace(/[+\-][\d:]+$/,'').replace(/\-/g,'/').replace(/T/,' '));
					var	hid=entry['dc:creator'];
					cmt.innerHTML=[
						date.toLocaleString()+'<br \/>'
//					,	'<a href="'+entry.link+'" title="'+stripTags(entry.content)+'">'
					,	'<a href="'+bmURI+'" title="'+content+'">'
					,	'<img src="http://www.hatena.ne.jp/users/'+hid.slice(0,2)+'/'+hid+'/profile_s.gif" border="0" \/>'
					,	'&nbsp;'+hid
					,	'<\/a>'
					].join('');
					cmtlist.appendChild(cmt);
				}
			}
			for (ci=0,len=items.length; ci<len; ci++) {
				var	cmt=items[ci].lastChild.lastChild;
				if (cmt) cmt.className=cmt.className.replace(/lst/,'end');
			}
		}
	};
	addScript('http://pipes.yahoo.com/furyu/hblist?_render=json&_callback=cocoShowHBside&_run=1&url='+encodeURIComponent(link.href));
	break;
}
})();

if (w.cocoShowHBSidebarOnly) return;

var	callcounter=0;
var	cocoShowHB=function(node,url) {
	if (getElementsByTagAndClassName('div','cocoHBshow',node)[0]) return;
	
	var	baseURL='http://b.hatena.ne.jp/entry/',baseImg=baseURL+'image/',baseRSS=baseURL+'rss/';
	//var	targetURL=url.replace(/#/g,function(s){return encodeURIComponent(s)});
	var	targetURL=url.replace(/#.*$/,'');
	if (!targetURL.match(/\.html$/)||targetURL.match(/index.html$/)) return;
	
	var	bottom=getElementsByTagAndClassName('div','entry-bottom',d)[0];
	if (!bottom) {
		if (node===d&&!AutoPagerize) {
			var	selffnc=arguments.callee;
			setTimeout(function(){selffnc(node,url)},100);
		}
		return;
	}
	var	parent=getElementsByTagAndClassName('div','entry',node)[0];
	if (!parent) return;
	
	var	hbdiv=d.createElement('div');
	hbdiv.className='cocoHBshow entry-trackback trackbacks';
	hbdiv.innerHTML=[
		'<h2 class="date-header"><a href="'+baseURL+targetURL+'" '
	,	'title="'+unescape('%u3053%u306E%u8A18%u4E8B%u3092%u542B%u3080%u30D6%u30C3%u30AF%u30DE%u30FC%u30AF')+'">'
			//	"この記事を含むブックマーク"
	,	unescape('%u306F%u3066%u306A%u30D6%u30C3%u30AF%u30DE%u30FC%u30AF')	//	"はてなブックマーク"
	,	'<\/a>'
	,	'<img src="'+baseImg+targetURL+'" border="0" style="margin:auto 2px" class="hbcounter" \/>'
	,	'<a href="http://b.hatena.ne.jp/append?'+targetURL+'">'
	,	'<img src="http://b.hatena.ne.jp/images/append.gif" alt="append" border="0" style="margin:auto 2px" class="hbappend" '
	,	'title="'+unescape('%u3053%u306E%u8A18%u4E8B%u3092%u306F%u3066%u306A%u30D6%u30C3%u30AF%u30DE%u30FC%u30AF%u306B%u8FFD%u52A0')+'" \/>'
			//	"この記事をはてなブックマークに追加"
	,	'<\/a>'
	,	unescape('%uFF1A%u30B3%u30E1%u30F3%u30C8')		//	"：コメント"
	,	'<\/h2>'
	,	'<div class="hbloading" style="display:none;"><img src="http://furyu-tei.sakura.ne.jp/icon/nowloading1.gif" alt="now loading" \/></div>'
	].join('');
	
	var	nowloading=getElementsByTagAndClassName('div','hbloading',hbdiv)[0];
	var	counter=getElementsByTagAndClassName('img','hbcounter',hbdiv)[0];
	var	errflg=false;
	counter.onload=function(){
		var	list=d.createElement('ul'),ci=0,len=0;
		list.style.listStyleType='none';
		hbdiv.appendChild(list);
		
		if (errflg||1<counter.width) {
			var	callbackName='showHBcallback'+callcounter;
			callcounter++;
			nowloading.style.display='block';
			w[callbackName]=function(result){
				hbdiv.removeChild(nowloading);
				var	addList=function(entry){
					var	li=d.createElement('li');
					var	hid=entry.id,text=entry.content,link=entry.link,date=entry.date,tagStrs=[],tags=entry.tags;
					for (var ci=0,len=tags.length; ci<len; ci++) {
						var	tag=tags[ci];
						tagStrs[tagStrs.length]='<a href="http://b.hatena.ne.jp/t/'+encodeURIComponent(tag)+'" style="text-decoration:none;">'+tag+'<\/a>';
					}
					li.innerHTML=[
						'<a href="'+link+'">'
					,	'<img src="http://www.hatena.ne.jp/users/'+hid.slice(0,2)+'/'+hid+'/profile_s.gif" border="0" \/>'
					,	'<\/a>&nbsp;'
					,	'<a href="'+link+'">'+hid+'<\/a>&nbsp;&nbsp;'
					,	'<span style="font-size:10px;font-family:verdana">'+date+'<\/span>'
					,	'<div style="margin:0 18px;font-size:10px;font-family:verdana">'+tagStrs.join(' ')+'<\/div>'
					,	'<div style="margin:0 18px">'+text+'<\/div>'
					].join('');
					list.appendChild(li);
				};
				if (result&&0<result.count) {
					var	entries=result.bookmarks,cmtEntries=[],eid=result.eid;
					for (ci=0,len=entries.length; ci<len; ci++) {
						var	entry=entries[ci], content=stripTags(entry.comment).replace(/(https?:\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)/mgi,'<a href="$1">$1<\/a>');
						if (0<content.replace(/(\s|[\r\n])/mg,'').length) {
							var	date=entry.timestamp;
							var	no=cmtEntries.length,tags=entry.tags;
							if (!tags) {
								tags=[];
							}
							else if (tags.constructor==String) {
								tags=[tags];
							}
							cmtEntries[no]={
								id		:	entry.user
							,	content	:	content
							,	link	:	'http://b.hatena.ne.jp/'+entry.user+'/'+date.replace(/^(\d+)\/(\d+)\/(\d+)\s.*$/,'$1$2$3')+'#bookmark-'+eid
							,	date	:	date
							,	no		:	no
							,	tags	:	tags
							};
						}
					}
					var	cmtCount=cmtEntries.length,cmtCountStr=cmtCount.toString();
					if (cmtCountStr.length<5) cmtCountStr=(100000+cmtCount).toString().replace(/^./,'');
					var	header=hbdiv.getElementsByTagName('h2')[0],cimg=new Image();
					cimg.border='0';
					cimg.src='http://b.hatena.ne.jp/images/users/normal/'+cmtCountStr+'.png';
					cimg.style.margin='auto 2px';
					header.appendChild(cimg);
					for (ci=0,len=cmtCount; ci<len&&ci<maxShowNum; ci++) {
						addList(cmtEntries[ci]);
					}
				}
				var	li=d.createElement('li');
				if (ci<len) {
					var	more=d.createElement('a');
					more.href=baseURL+targetURL;
					more.innerHTML='more..';
					more.onmouseover=function(){
						li.style.display='none';
						for (; ci<len; ci++) {
							addList(cmtEntries[ci]);
						}
					};
					li.appendChild(more);
				}
				else {
					li.innerHTML='&nbsp;';
				}
				list.appendChild(li);
				w[callbackName]=null;
			};
			addScript('http://b.hatena.ne.jp/entry/json/?callback='+callbackName+'&url='+encodeURIComponent(targetURL));
		}
		else {
			hbdiv.removeChild(nowloading);
			var	li=d.createElement('li');
			li.innerHTML='&nbsp;';
			list.appendChild(li);
		}
	};
	counter.onerror=function(){
		errflg=true;
		counter.onload();
	}
	var	posted=getElementsByTagAndClassName('p','posted',node)[0];
	if (posted&&posted.nextSibling) {
		parent.insertBefore(hbdiv,posted.nextSibling);
	}
	else {
		parent.appendChild(hbdiv);
	}
}	//	end of cocoShowHB()

cocoShowHB(d,w.location.href);

if (AutoPagerize) {
	var	addFilter=(AutoPagerize.addElementFilter)?AutoPagerize.addElementFilter:AutoPagerize.addFilter;
	addFilter(function(nodes,url,siteinfo){
		if (0<nodes.length) {
			var	node=nodes[0];
			if (!url) {
				var	p=node.previousSibling;
				if (!p) return;
				var	link=p.getElementsByTagName('a')[0];
				if (!link) return;
				url=link.href;
			}
			cocoShowHB(node,url);
		}
	});
}
})()
