// ==UserScript==
// @name           hatebCommentDisplay
// @namespace      http://txqz.net/
// @description    display hatena bookmark's comment on submit page.
// @checkurl       http://txqz.net/scripts/hateb_comment_display.js
// @include        http://b.hatena.ne.jp/add*
// ==/UserScript==
//

(function(){
	document.addEventListener('DOMContentLoaded', function() {
		if(document.getElementById('edit_form') ==null || document.getElementById('tags_completion') == null)
			return;
		
		document.add.title.size = 100;
		document.add.comment.size = 100;
		var url = decodeURIComponent(location.search.match(/&url=([^&]+)/i)[1]).replace(/#/,'%23').replace(/\?/,'%3F');
		var field = document.createElement('div');
		var tagField = document.createElement('ul');
		var commentUrls = [];
		tagField.id = 'tagField';
		tagField.style.lineHeight = '1.3';
		tagField.style.fontSize = '90%';
		tagField.style.marginRight = '10px';
		var commentField = document.createElement('ul');
		commentField.id = 'commentField';
		commentField.style.lineHeight = '1.3';
		commentField.style.fontSize = '90%';
		commentField.style.marginRight = '10px';
		var req = new XMLHttpRequest();
		req.open('GET', ['http://b.hatena.ne.jp/entry/rss/', url].join(''), true);
		
		req.setRequestHeader('Content-Type', 'application/xml; charset=UTF-8');
		req.onreadystatechange = function() {
			if(req.readyState < 4)
				tagField.innerHTML = ['読み取り中 (', req.readyState, ')'].join('');
			if(req.readyState == 4 && req.status == 200) {
				tagField.innerHTML = "";
				var res = req.responseXML;
				var items = res.getElementsByTagName('item');
				var tags = {};
				var dispCount = 0;
				for(var i = 0; i < items.length; i++) {
					var id = items[i].getElementsByTagName('title')[0].text;
					var body = items[i].getElementsByTagName('description')[0].text;
					var taglist = items[i].getElementsByTagNameNS('http://purl.org/dc/elements/1.1/', 'subject');
					for(var j = 0; j < taglist.length; j++) {
						var tag = taglist[j];
						if(tag != null) {
							if(tags[tag.text])
								tags[tag.text]++;
							else tags[tag.text] = 1;
						}
					}
					if(body != "") {
						commentUrls[dispCount] = items[i].getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'about');
						dispCount++;
						var line = document.createElement('li');
						var img = ['http://www.hatena.ne.jp/users/', id.substr(0,2), '/', id, '/profile_s.gif'].join('');
						line.innerHTML = ['<img src="', img, '" alt="" />', id, ' - ', body].join('');
						commentField.appendChild(line);
					}
				}
				for(tag in tags) {
					var line = document.createElement('li');
					line.style.display = 'inline';
					line.style.marginRight = '10px';
					line.innerHTML = [tag, '[', tags[tag], ']'].join('');
					line.addEventListener('click', function() {
						var string = ['[', this.text.replace(/\[\d+\]/, ''), ']'].join('');
						var match = RegExp(['\\[', this.text.replace(/\[\d+\]/, ''), '\\]'].join(''));
						if(match.test(document.add.comment.value)) {
							document.add.comment.value = document.add.comment.value.replace(match,'');
							this.style.color = '#000000';
						} else {
							document.add.comment.value = string + document.add.comment.value;
							this.style.color = '#999999';
						}
					}, false);
					tagField.appendChild(line);
				}
				field.appendChild(tagField);
				field.appendChild(commentField);
				document.body.appendChild(field);
				
				Hatena.Star.EntryLoader.loadEntries = function() {
					var entries = [];
					var items = document.getElementById('commentField').getElementsByTagName('li');
					for(var i = 0; i < items.length; i++) {
						var starContainer = Hatena.Star.EntryLoader.createStarContainer();
						var commentContainer = Hatena.Star.EntryLoader.createCommentContainer();
						var item = items[i];
						item.appendChild(commentContainer);
						item.appendChild(starContainer);
						entries.push({
							 'uri': commentUrls[i]
							,"title": item.text.replace(/^[^ ]+ - /,'')
							,"star_container": starContainer
							,"comment_container": commentContainer
						});
					}
					return entries;
				};
			}
		}
		req.send('');
		
		var move = document.createElement('button');
		move.appendChild(document.createTextNode('コメントを見る'));
		move.onclick = ['location.href="http://b.hatena.ne.jp/entry/', url, '";return false;'].join('');
		document.getElementById('edit_form').insertBefore(move, document.getElementById('tags_completion'));
		document.getElementById('edit_form').removeChild(document.getElementById('tags_completion'));
		
	}, false);
})();

