Google Search Add Hatebu Count

By bluerabbit Last update May 29, 2007 — Installed 910 times.
// ==UserScript==
// @name		  Google Search Add Hatebu Count
// @namespace	  http://d.hatena.ne.jp/bluerabbit/
// @include		  http://www.google.co.jp/searc*
// ==/UserScript==

(function() {

	// -- [Main] ----------------------------------------------------------------------

	function main() {
		var resultItems = $X('//div[@class="g"]');
		for (var i = 0; i < resultItems.length; i++) {
			var item = resultItems[i];
			var url = $X('.//a[@class="l"][@href]', item)[0].href;
			var nobr = $S('.//nobr', item);
			nobr.appendChild(createHatebuEntryImg(url));
			var n = $N('img', {'src':'http://b.hatena.ne.jp/entry/image/large/' + url,'style':'margin-bottom:-5px;border:0pt none;'});
			var a = $N('a', {'href':'http://b.hatena.ne.jp/entry/' + url});
			a.appendChild(n);
			nobr.appendChild(a);
		}
	}

	function createHatebuEntryImg(url) {
		var TEXT = '\u3053\u306E\u30A8\u30F3\u30C8\u30EA\u30FC\u3092\u542B\u3080\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF';
		var img = $N('img', {'width':'16', 'height':'12','align':'absmiddle','title':TEXT,'alt':TEXT,'style':'border:0pt none;'});
		img.src = 'data:image/gif;base64,'+
				    'R0lGODlhEAAMAIAAABhBzv///yH5BAAAAAAALAAAAAAQAAwAAAIjDI6ZFu3/DjSrSWZB3mjTrFDV'+
				    'pXkf6Vxn2amSmobfRGvK3RUAOw==';
		var x = $N('a', {'href':'http://b.hatena.ne.jp/entry/' + url});
		x.appendChild(img);
		return x;
	}

	// -- [Templete] ----------------------------------------------------------------------

	// Firefox log api
	function log() { unsafeWindow.console.log.apply(unsafeWindow.console, Array.slice(arguments)) };

	function $(element) {
		return document.getElementById(element);
	}
	
	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 $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 $S(xpath, context) {
		context = context || document;
		return document.evaluate(xpath, context, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
	}
	
	window.addEventListener('load', function(){main();}, false);
})();