// ==UserScript==
// @name        Mixi Show regist date
// @description
// @namespace   http://lowreal.net/
// @include     http://mixi.jp/*
// ==/UserScript==


(function () {
	var verbose = true;
	
	var NUM2MONTH = {
		1 : "2004-02",
		1000 : "2004-03",
		2000 : "2004-03",
		4000 : "2004-03",
		8000 : "2004-04",
		12000 : "2004-05",
		16010 : "2004-05",
		24010 : "2004-06",
		32010 : "2004-06",
		48010 : "2004-07",
		64010 : "2004-08",
		80010 : "2004-08",
		112010 : "2004-09",
		144010 : "2004-10",
		176010 : "2004-11",
		208010 : "2004-11",
		272010 : "2004-12",
		336010 : "2005-01",
		400010 : "2005-02",
		464020 : "2005-03",
		528020 : "2005-03",
		656020 : "2005-05",
		784020 : "2005-06",
		912020 : "2005-06",
		1168020 : "2005-08",
		1424020 : "2005-09",
		1680020 : "2005-10",
		1936030 : "2005-11",
		2192030 : "2005-12",
		2448030 : "2005-12",
		2960030 : "2006-02",
		3472030 : "2006-03",
		3984030 : "2006-04",
		4496040 : "2006-05",
		5008040 : "2006-06",
		5520040 : "2006-07",
		6032040 : "2006-08"
	};
	
	function id2month(id) {
		for (i in NUM2MONTH)
			if (id < Number(i))
				return NUM2MONTH[i];
		return "2006-08 \u4EE5\u964D";
	};
	
	
	if (location.href.match(/show_friend\.pl\?id=(\d+)/)) {
		var id = Number(RegExp.$1);
		$X("/html/body/table[3]/tbody/tr/td/table/tbody/tr/td[1]/table[1]/tbody/tr[3]/td")[0].appendChild(
			$N("span", {"class":"f08x"}, "(\u767B\u9332\u65E5\u306F" + id2month(id) + "\u3054\u308D)")
		);
	}

	if (verbose) {
		$X("//a[starts-with(@href, 'show_friend.pl?') and img]").forEach(function (i) {
			if (i.href.match(/id=(\d+)/)) {
				var id = Number(RegExp.$1);
				i.appendChild(
					$N("div", {style:"font-size: 80%; opacity: 0.7; background: #000; color: #fff; position: absolute; margin: -1em 0 0 0"}, id2month(id))
				);
			}
		});
	}

	/* template functions  */
	function $N (name, attr, childs) {
		var ret = document.createElement(name);
		for (k in attr) {
			if (!attr.hasOwnProperty(k)) continue;
			v = attr[k];
			if (k == "class") {
				ret.className = v;
			} else {
				ret.setAttribute(k, v);
			}
		}
		switch (typeof childs) {
			case "string": {
				ret.appendChild(document.createTextNode(childs));
				break;
			}
			case "object": {
				for (var i = 0, len = childs.length; i < len; i++) {
					var child = childs[i];
					if (typeof child == "string") {
						ret.appendChild(document.createTextNode(child));
					} else {
						ret.appendChild(child);
					}
				}
				break;
			}
		}
		return ret;
	}
	
	function $X (exp, context) {
		if (!context) context = document;
		var resolver = function (prefix) {
			var o = document.createNSResolver(context)(prefix);
			return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
		}
		var exp = document.createExpression(exp, resolver);

		var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
		switch (result.resultType) {
			case XPathResult.STRING_TYPE : return result.stringValue;
			case XPathResult.NUMBER_TYPE : return result.numberValue;
			case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
			case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
				result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
				var ret = [];
				for (var i = 0, len = result.snapshotLength; i < len ; i++) {
					ret.push(result.snapshotItem(i));
				}
				return ret;
			}
		}
		return null;
	}
	
	function $S (str) {
		return str.replace(/#{([^}]+)}/g, function (w, $1) {
			return eval($1);
		});
	}

})();
