// ==UserScript==
// @name            Crossing Hatena
// @namespace       http://www.akatsukinishisu.net/userscripts
// @description     Crossing a user's pages in Hatena's services
// @include         http://*.hatena.ne.jp/*
// ==/UserScript==
// Version: 2010-06-07

(function(){
	var d = document;
	if ( !d.contentType.match(/^text\/html/i) ) return;
	var xulns = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
	var hatena = '\u306F\u3066\u306A';
	var services = {
		q: '\u4EBA\u529B\u691C\u7D22' + hatena,
		a: hatena + '\u30A2\u30F3\u30C6\u30CA',
		b: hatena + '\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF',
		d: hatena + '\u30C0\u30A4\u30A2\u30EA\u30FC',
		f: hatena + '\u30D5\u30A9\u30C8\u30E9\u30A4\u30D5',
		g: hatena + '\u30B0\u30EB\u30FC\u30D7',
		r: hatena + 'RSS',
		counter: hatena + '\u30AB\u30A6\u30F3\u30BF\u30FC',
		graph: hatena + '\u30B0\u30E9\u30D5',
		ring: hatena + '\u30EA\u30F3\u30B0',
		i: hatena + '\u30A2\u30A4\u30C7\u30A2',
		s: hatena + '\u30B9\u30BF\u30FC',
		m: hatena + '\u30E1\u30C3\u30BB\u30FC\u30B8',
		h: hatena + '\u30CF\u30A4\u30AF',
		ugomemo: '\u3046\u3054\u30E1\u30E2' + hatena,
		k: hatena + '\u30AD\u30FC\u30EF\u30FC\u30C9',
		c: hatena + '\u30B3\u30B3',
		mono: hatena + '\u30E2\u30CE\u30EA\u30B9',
		www: hatena + ' \u30D7\u30ED\u30D5\u30A3\u30FC\u30EB'
	};
	if (d.cookie.match(/rk=/)) {
		services.my = 'My' + hatena;
	}

	var url = location.href;
	var current, user;
	if (url.match(/http:\/\/([^.]+\.)?([abcdfghikrqs]|graph|ring|counter|ugomemo|mono|www)\.hatena\.ne\.jp\/([A-Za-z][A-Za-z0-9_-]+)\//)) {
		current = RegExp.$2;
		user = RegExp.$3;
	}
	else if (url.match(/http:\/\/www\.hatena\.ne\.jp\/my/)) {
		current = 'my';
		user = d.getElementsByTagName('strong')[0].firstChild.firstChild.data;
	}
	else if (url.match(/http:\/\/m\.hatena\.ne\.jp\//)) {
		current = 'm';
		user = d.getElementsByTagName('h1')[0]
			.getElementsByTagName('a')[1]
			.firstChild.data
			.replace(/\u306E\u30E1\u30C3\u30BB\u30FC\u30B8/, '');
	}

	if (!current || !user) return;
	if (user == 'entry') return;
	if (user == 'keyword') return;
	if (user == 'idea') return;
	if (user == 'feed') return;

	var box = d.createElementNS(xulns, 'box');
	var bs = box.style;
	bs.position = 'fixed';
	bs.top = '0';
	bs.left = '0';
	bs.zIndex = '100';
	bs.textAlign = 'left';
	bs.backgroundColor = 'ButtonFace';
	bs.border = 'outset 1px ButtonFace';
	bs.MozOpacity = '0.7';

	var mbar = d.createElementNS(xulns, 'menubar');
	mbar.style.borderStyle = 'none';
	box.appendChild(mbar);

	var menu = d.createElementNS(xulns, 'menu');
	menu.setAttribute('label', 'go!');
	mbar.appendChild(menu);
	var mpu = d.createElementNS(xulns, 'menupopup');
	menu.appendChild(mpu);

	for (var srv in services) {
		if (srv == 'www') {
			mpu.appendChild(d.createElementNS(xulns, 'menuseparator'));
		}
		var mi = d.createElementNS(xulns, 'menuitem');
		mpu.appendChild(mi);
		mi.setAttribute('label', services[srv]);
		if (srv == 'a' && !url.match(/simple/)) {
			var mias = d.createElementNS(xulns, 'menuitem');
			mpu.appendChild(mias);
			mias.setAttribute('label', ' simple');
			mias.addEventListener('click', aSimpleHandler(user), false);
		} else if (srv == 'd') {
			if (!url.match(/about/)) {
				var midab = d.createElementNS(xulns, 'menuitem');
				mpu.appendChild(midab);
				midab.setAttribute('label', ' about');
				midab.addEventListener('click', dAboutHandler(user), false);
			}
			if (!url.match(/archive/)) {
				var midar = d.createElementNS(xulns, 'menuitem');
				mpu.appendChild(midar);
				midar.setAttribute('label', ' archive');
				midar.addEventListener('click', dArchiveHandler(user), false);
			}
		}
		if (
			srv == current &&
			(
				(srv != 'd' && srv != 'a')
				|| (srv == 'a' && !url.match(/simple/))
				|| (srv == 'd' && !url.match(/about|archive/))
			)
		) {
			mi.setAttribute('disabled', 'true');
			continue;
		}
		mi.addEventListener('click', dispatchHandler(srv, user), false);
	}
	d.body.appendChild(box);

	function dispatchHandler(domain, user) {
		var url;
		if (domain == 'my') {
			url = 'http://www.hatena.ne.jp/my';
		}
		else if (domain == 'm') {
			url = 'http://m.hatena.ne.jp/';
		}
		else if (domain == 'ugomemo') {
			url = 'http://ugomemo.hatena.ne.jp/' + user + '/following';
		}
		else{
			url = 'http://' + domain + '.hatena.ne.jp/' + user + '/';
		}
		return makeHandler(url);
	}

	function aSimpleHandler(user) {
		var url = 'http://a.hatena.ne.jp/' + user + '/simple';
		return makeHandler(url);
	}

	function dAboutHandler(user) {
		var url = 'http://d.hatena.ne.jp/' + user + '/about';
		return makeHandler(url);
	}

	function dArchiveHandler(user) {
		var url = 'http://d.hatena.ne.jp/' + user + '/archive';
		return makeHandler(url);
	}

	function makeHandler(url) {
		return function(e) {
			var btn = e.button;
			if (btn == 0) {
				location.href = url;
			} else if (btn == 1) {
				window.open(url, '_blank');
			}
		}
	}
})();

