(function(){
	var	w=window,d=w.document;
	
	var	linklist=d.getElementById('link-list');
	if (!linklist) return;
	
	var	getElementsByTagAndClassName=(function(){
		var	splitClassName=function(className){
			return className.replace(/\s+/g,' ').replace(/(^\s|\s$)/g,'').split(' ');
		};
		return function(tagName,className,doc) {
			if (!doc) doc=d;
			var children=doc.getElementsByTagName(tagName);
			if (className) {
				var	chkElms=(typeof className=='string')?splitClassName(className):className;
				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=splitClassName(cname);
					for (var cj=0,lenj=cnameElms.length; cj<lenj; cj++) {
						if (flgElms[cnameElms[cj]]) {
							elements[elements.length]=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);	//	true: useCapture
			};
		}
		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	rmvEventHandler=(function(){
		if (w.attachEvent) {
			return function(obj,evt,handler){obj.detachEvent('on'+evt,handler)};
		}
		else if (w.addEventListener) {
			return function(obj,evt,handler){
				obj.removeEventListener(evt,handler,false);
			};
		}
		else {
			return function(obj,evt,handler){obj['on'+evt]=function(){}};
		}
	})();
	
	var	getObjectTop=(function(){
		if (w.navigator.userAgent.match(/msie/i)) {
			return	function(obj,doc){
				if (!doc) doc=d;
				var	style=obj.currentStyle;
				var	pos=obj.getBoundingClientRect();
				var	oTop=pos.top;
				if (doc.compatMode=='CSS1Compat') {
					oTop+=doc.documentElement.scrollTop-doc.documentElement.clientTop;
				}
				else {
					var	bstyle=doc.body.currentStyle;
					oTop+=doc.body.scrollTop-(parseInt(bstyle.borderTopWidth)||0);
				}
				return oTop;
			};
		}
		else {
			return	function(obj,doc){
				if (!doc) doc=d;
				var	chkflg=false;
				try {
					var style=obj.currentStyle||doc.defaultView.getComputedStyle(obj,'');
					if (style.display=='none') {
						var	bkdisplay=obj.style.display;
						obj.style.display='block';
						chkflg=true;
					}
				} catch(e){}
				var offsetTop=0,curObj=obj;
				try {
					while (curObj) {
						var	style=curObj.currentStyle||doc.defaultView.getComputedStyle(curObj,'');
						offsetTop+=curObj.offsetTop+(parseInt(style.borderTopWidth)||0);
						curObj=curObj.offsetParent;
					}
				} catch(e){}
				if (chkflg) obj.style.display=bkdisplay;
				return offsetTop;
			};
		}
	})();	//	end of getObjectTop()
	
	var	scrollOffset=20;
	var	scrollIntoView=function(obj,win){
		if (!win) win=w;
		doc=win.document;
		//obj.scrollIntoView(true);
		setTimeout(function(){
			//var	_x=0;
			var	_x=Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft);
			var	_y=getObjectTop(obj,doc)-scrollOffset;
			d.getElementById('dummy-spacer').style.height=(win.innerHeight||Math.max(doc.documentElement.clientHeight,doc.body.clientHeight))+'px';
			win.scrollTo(_x,_y);
		},10);
	};	//	end of scrollIntoView()
	
	var	links=linklist.getElementsByTagName('a');
	var	work=d.createElement('div');
	
	var	patListContainer=d.createElement('div');
	patListContainer.className='diary-list-container';
	
	var	patCommentList=d.createElement('ol');
	patCommentList.className='diary-comment-list';
	
	var	patListElement=d.createElement('li');
	patListElement.className='diary-comment-li';
	
	var	patCommentOn=new Image();
	patCommentOn.className='comment-open';
	patCommentOn.title=patCommentOn.alt='コメントを開く';
	patCommentOn.src='/image/icon-quickon.gif';
	patCommentOn.style.display='inline';
	
	var	patCommentOff=new Image();
	patCommentOff.className='comment-close';
	patCommentOff.title=patCommentOff.alt='コメントを閉じる';
	patCommentOff.src='/image/icon-quickoff.gif';
	patCommentOff.style.display='none';
	
	var	patCommentOff_b=patCommentOff.cloneNode(true);
	patCommentOff_b.className+=' comment-close-bottom';
	
	var	patBodyOn=new Image();
	patBodyOn.className='body-open';
	patBodyOn.title=patBodyOn.alt='本文を開く';
	patBodyOn.src='/image/icon-quickon_gr.gif';
	patBodyOn.style.display='block';
	
	var	patBodyOff=new Image();
	patBodyOff.className='body-close';
	patBodyOff.title=patBodyOff.alt='本文を閉じる';
	patBodyOff.src='/image/icon-quickoff_gr.gif';
	patBodyOff.style.display='none';
	
	var	patBodyOff_b=patBodyOff.cloneNode(true);
	patBodyOff_b.className+=' body-close-bottom';
	
	var	patErrorText=d.createElement('span');
	patErrorText.className='error-text';
	
	var	patBqBody=d.createElement('blockquote');
	patBqBody.className='diary-body';
	
	var	re_title=/<title.*?>([\s\S]*?)<\/title/i;
	var	re_body=/(<div[^>]*class="day".*?>[\s\S]*?)<div[^>]*class="comment"/i;
//	var	re_comment=/<form[^>]*id="comment-form".*?>([\s\S]*?)<\/form/i;
	var	re_comment=/(<div[^>]*class="comment".*?>[\s\S]*?)<div[^>]*class="calendar".*?>/i;
	var	re_scripts=/<script[\s\S]*?<\/script>/gi;
	var	re_abspath=/"(\/.*?)"/g;
	var	re_anchor=/#(.*)$/;
	
	var	getLinkTitle=function(link){
		var	linkPnode=link.parentNode;
		GAE_xmlhttpRequest({
			method	:	'GET'
		,	url		:	link.href
		,	onerror	:	function(xh){
				var	err=patErrorText.cloneNode(false);
				err.innerHTML='タイトル取得エラー('+xh.statusText+')';
				linkPnode.appendChild(err);
			}
		,	timeout	:	30	// (sec)
		,	ontimeout:	function(xh){
				var	err=patErrorText.cloneNode(false);
				err.innerHTML='タイトル取得タイムアウト';
				linkPnode.appendChild(err);
			}
		,	onload	:	function(xh){
				var	rslt=xh.responseText;
				if (rslt.match(re_title)) {
					link.innerHTML=RegExp.$1;
				}
				var	pc=patListContainer.cloneNode(false),clist=patCommentList.cloneNode(false);
				var	anchor='';
				if (link.href.match(re_anchor)) {
					anchor=RegExp.$1;
				}
				var	anchorelm=null;
				
				var	render_comment=false,render_body=false;
				var	conbutton=patCommentOn.cloneNode(false);
				conbutton.onclick=function(){
					if (!render_comment) {
						rslt=rslt.replace(re_scripts,'');
						rslt=rslt.replace(re_abspath,'http://d.hatena.ne.jp$1');
						if (rslt.match(re_comment)) {
							work.innerHTML=RegExp.$1;
							var	spans=work.getElementsByTagName('span');
							var	comments=[];
							for (var ci=0,len=spans.length; ci<len; ci++) {
								var	span=spans[ci];
								if (span.className!='commentbody') continue;
								//comments.unshift(span.parentNode);
								comments[comments.length]=span.parentNode;
							}
							for (var ci=0,len=comments.length; ci<len; ci++) {
								var	_comment=comments[ci];
								var	comment=patListElement.cloneNode(false);
								comment.appendChild(_comment);
								comment.className+=(ci%2)?' odd':' even';
								clist.appendChild(comment);
							}
							var	linkelms=clist.getElementsByTagName('a');
							for (var ci=0,len=linkelms.length; ci<len; ci++) {
								var	linkelm=linkelms[ci];
								if (anchor && linkelm.name==anchor) {
									anchorelm=linkelm;
									var	_p=anchorelm.parentNode;
									while (_p) {
										if (_p.className.match(/diary-comment-li/)) {
											_p.className+=' target';
											break;
										}
										_p=_p.parentNode;
									}
									break;
								}
							}
						}
						var	bqbody=patBqBody.cloneNode(false)
						bqbody.cite=link.href.replace(re_anchor,'');
						bqbody.style.display='none';
						var	bonbutton=patBodyOn.cloneNode(false);
						bonbutton.onclick=function(){
							if (!render_body) {
								if (rslt.match(re_body)) {
									work.innerHTML=RegExp.$1+'</div>';
									var	divs=work.getElementsByTagName('div');
									var	ads=[];
									for (var ci=0,len=divs.length; ci<len; ci++) {
										if (divs[ci].className=='ad') ads[ads.length]=divs[ci];
									}
									for (var ci=0,len=ads.length; ci<len; ci++) {
										ads[ci].parentNode.removeChild(ads[ci]);
									}
									var	_c=work.firstChild,_n;
									while (_c) {
										_n=_c.nextSibling;
										bqbody.insertBefore(_c,bqbody.lastChild);
										if (_c.nodeType==1 && _c.className.match(/body/)) {
											break;
										}
										_c=_n;
									}
								}
								render_body=true;
							}
							bonbutton.style.display='none';
							boffbutton.style.display='block';
							boffbutton_b.style.display='block';
							bqbody.style.display='block';
						}
						var	boffbutton=patBodyOff.cloneNode(false);
						boffbutton.onclick=function(){
							boffbutton.style.display='none';
							boffbutton_b.style.display='none';
							bonbutton.style.display='block';
							bqbody.style.display='none';
						};
						var	boffbutton_b=patBodyOff_b.cloneNode(false);
						boffbutton_b.onclick=function(){
							boffbutton.style.display='none';
							boffbutton_b.style.display='none';
							bonbutton.style.display='block';
							bqbody.style.display='none';
							scrollIntoView(bonbutton);
						}
						var	boffbutton_block=d.createElement('div');
						var	br=d.createElement('br');
						br.style.clear='both';
						boffbutton_block.appendChild(boffbutton_b);
						boffbutton_block.appendChild(br);
						
						bqbody.appendChild(boffbutton_block);
						
						pc.insertBefore(bqbody,clist);
						pc.insertBefore(bonbutton,bqbody);
						pc.insertBefore(boffbutton,bqbody);
						
						render_comment=true;
					}
					conbutton.style.display='none';
					coffbutton.style.display='inline';
					coffbutton_b.style.display='block';
					pc.style.display='block';
					if (anchorelm) scrollIntoView(anchorelm);
				};
				var	coffbutton=patCommentOff.cloneNode(false);
				coffbutton.onclick=function(){
					coffbutton.style.display='none';
					coffbutton_b.style.display='none';
					conbutton.style.display='inline';
					pc.style.display='none';
				};
				var	coffbutton_b=patCommentOff_b.cloneNode(false);
				coffbutton_b.onclick=function(){
					coffbutton.style.display='none';
					coffbutton_b.style.display='none';
					conbutton.style.display='inline';
					pc.style.display='none';
					scrollIntoView(link);
				}
				var	coffbutton_block=d.createElement('div');
				var	br=d.createElement('br');
				br.style.clear='both';
				coffbutton_block.appendChild(coffbutton_b);
				coffbutton_block.appendChild(br);
				
				linkPnode.appendChild(conbutton);
				linkPnode.appendChild(coffbutton);
				pc.appendChild(clist);
				pc.appendChild(coffbutton_block);
				linkPnode.appendChild(pc);
				
			}
		});
	};
	for (var ci=0,len=links.length; ci<len; ci++) {
		var	link=links[ci];
		if (!link.className.match(/comment-link/)) continue;
		getLinkTitle(link);
	}
})();
