// ==UserScript==
// @name          B! AND Search Prototype
// @namespace     http://www.towofu.net/gm/
// @description   B! AND Search Prototype
// @include       http://b.hatena.ne.jp/t/*
// ==/UserScript==

(function() {

var hateb = "http://b.hatena.ne.jp/t/";
var hitCount = 25;

function xpath(query, node /* = document */) {
	if (node == undefined) {
		node = document;
	}
	return document.evaluate(query, node, null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

function getTagsOf(entry) {
	var elms = entry.getElementsByTagName("a");
	var tags = new Array();
	var len = elms.length;
	for (var i = 0; i < len; i++) {
		if (elms[i].className == "tag") {
			tags.push(elms[i].innerHTML);
		}
	}
	return tags;
}

function removeEntry(entry) {
	//entry.style.display = "none";
	var div = xpath("//div[@class='optionsub']").snapshotItem(0);
	div.removeChild(entry);
	hitCount--;
}

function redirect() {
	var url = document.location.href;
	var tag = url.match(/\/t\/([^%]+)/)[1];
	var otherTags = url.match(/%20([^?]+)/)[1].replace('%20', '|');
	window.location.href = hateb + tag + "?others=" + otherTags;
}

function updateTools() {
	var links, len, a, i, elm;
	var url = window.location.href;
	var others = url.match(/[?&]others=([^&]+)/)[1].split("|");
	links = xpath("//form/following-sibling::*");
	len = links.snapshotLength;
	for (i = 0; i < len; i++) {
		a = links.snapshotItem(i);
		a.setAttribute("href", a.getAttribute("href") + "&others=" + others.join("|"));
	}
	links = xpath("//div[@class='pager']/a");
	len = links.snapshotLength;
	for (i = 0; i < len; i++) {
		a = links.snapshotItem(i);
		a.setAttribute("href", a.getAttribute("href").replace(/\?tag=([^&]+)&/, "/$1?") + "&others=" + others.join("|"));
	}
	elm = xpath("//input[@name='tag']").snapshotItem(0);
	elm.setAttribute("value", elm.getAttribute("value") + " " + others.join(" "));
	elm = document.getElementsByTagName("h2")[0];
	elm.innerHTML = elm.innerHTML.replace("」", "」「" + others.join("」「") + "」");
	elm = document.getElementsByTagName("h3")[0];
	elm.innerHTML = elm.innerHTML.replace("」", "」「" + others.join("」「") + "」") + " (" + hitCount + "/25 ヒット)";
	elm = xpath("//div[@id='breadcrumbs']").snapshotItem(0);
	elm.innerHTML = elm.innerHTML.replace(/(&gt; .+)/, "$1&nbsp;&nbsp;" + others.join("&nbsp;&nbsp;"));
	/*
	elm = document.getElementsByTagName("title")[0];
	elm.innerHTML = elm.innerHTML.replace(/タグ (.+)/, "タグ $1 " + others.join(" "));
	alert(elm.innerHTML);
	*/
}

function doFiltering() {
	var entries = xpath("//div[@class='entry']");
	var url = window.location.href;
	var others = url.match(/[?&]others=([^&]+)/)[1].split("|");
	var len = entries.snapshotLength;
	for (var i = 0; i < len; i++) {
		var entry = entries.snapshotItem(i);
		//var tags = xpath("//a[@class='tag']", entry);
		var tags = getTagsOf(entry);
		for (var n = 0; n < others.length; n++) {
			if (tags.indexOf(others[n]) == -1) {
				removeEntry(entry);
				break;
			}
		}
	}
	updateTools();
}

function main() {
	var url = document.location.href;
	if (url.indexOf("%20") != -1) {
		redirect();
	}
	else if (url.indexOf("others=") != -1) {
		doFiltering();
	}
	else return;
}

main();

})();
