hatena_archive_bookmark

By tomo.snowbug Last update Jul 18, 2008 — Installed 75 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// ==UserScript==
// @name           hatena_archive_bookmark
// @namespace      http://d.hatena.ne.jp/tomo_snowbug/
// @include        http://d.hatena.ne.jp/*/archive*
// ==/UserScript==

HatenaArchiveAddBookmark = {

	targets: null,
	
	init: function() {
		window.setTimeout(HatenaArchiveAddBookmark.loadTargetAnchors,500);
		this.addCategoryAnchorHandler();
		this.addRssCount();
		this.registerSettingCommand();
		if (GM_getValue(this.isHatebEnabledKey) === undefined) {
			//初回に設定画面を表示
			this.showSettingPanel();
		}
	},
	
	loadTargetAnchors: function() {
		HatenaArchiveAddBookmark._loadTargetAnchors.apply(HatenaArchiveAddBookmark, arguments);
	},
	_loadTargetAnchors: function() {
		if (this.targets === null) {
			//call first time.
			this.targets = [];
			var titleAnchor = document.evaluate("/html/body/h1/a[1]", document, null, 7, null).snapshotItem(0);
			this.targets.push(titleAnchor);
		} else {
			this.targets = [];
		}
		var allAnchors = document.evaluate("//ul[@class='archives']/descendant::a", document, null, 7, null);
		for (var i = 0; i < allAnchors.snapshotLength; i++) {
			var target = allAnchors.snapshotItem(i);
			if (target && target.href.indexOf("/archive") == -1) {
				this.targets.push(target);
			}
		}
		this.addBookmarkCounts();
	},
	
	addBookmarkCounts: function() {
		HatenaArchiveAddBookmark._addBookmarkCounts.apply(HatenaArchiveAddBookmark, arguments);
	},
	_addBookmarkCounts: function() {
		var bks = this.targets;
		var loadAtOnce = 2
		if (bks.length == 0) return;
		for (var i = 0; i < loadAtOnce; i++) {
			var target = bks.shift();
			this.addBookmarkCount(target);
		}
		//callback later.
		window.setTimeout(HatenaArchiveAddBookmark.addBookmarkCounts,250);
	},
	
	addBookmarkCount: function(target) {
		
		if (!target) return;
		console.log("::::"+target);
		
		addFc2BookmarkCount(target);
		addBuzzurlBookmarkCount(target);
		addYahooBookmarkCount(target);
		addLivedoorClipCount(target);
		addHatebCount(target);
		return;
		
		function insertNext(tar,ins) {
			tar.parentNode.insertBefore(ins, tar.nextSibling);
		}
		function createImageTag(url) {
			var img = document.createElement("img");
			img.src = url;
			img.style.verticalAlign = "middle";
			img.style.margin = "0px 1px";
			img.style.border = "0px";
			return img;
		}
		function createAnchorTag(url,child) {
			var anc = document.createElement("a");
			anc.href = url;
			anc.appendChild(child);
			return anc;
		}
		function addHatebCount(target) {
			if (!GM_getValue(HatenaArchiveAddBookmark.isHatebEnabledKey)) return;
			var apiUrl = "http://b.hatena.ne.jp/entry/image/";
			var bookmarkUrl = "http://b.hatena.ne.jp/entry/";
			var img = createImageTag(apiUrl + target.href);
			var anc = createAnchorTag(bookmarkUrl + target.href, img);
			anc.title = "\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af";
			insertNext(target, anc);
		}
		function addLivedoorClipCount(target) {
			if (!GM_getValue(HatenaArchiveAddBookmark.isLDClipEnabledKey)) return;
			var apiUrl = "http://image.clip.livedoor.com/counter/";
			var bookmarkUrl = "http://clip.livedoor.com/page/";
			var img = createImageTag(apiUrl + target.href);
			var anc = createAnchorTag(bookmarkUrl + target.href, img);
			anc.title = "livedoor\u30af\u30ea\u30c3\u30d7";
			insertNext(target, anc);
		}
		function addYahooBookmarkCount(target) {
			if (!GM_getValue(HatenaArchiveAddBookmark.isYahooBKMEnabledKey)) return;
			var apiUrl = "http://num.bookmarks.yahoo.co.jp/image/small/";
			var bookmarkUrl = "http://bookmarks.yahoo.co.jp/url?url=";
			var img = createImageTag(apiUrl + target.href);
			var anc = createAnchorTag(bookmarkUrl + encodeURIComponent(target.href), img);
			anc.title = "yahoo\u30d6\u30c3\u30af\u30de\u30fc\u30af";
			insertNext(target, anc);
		}
		function addBuzzurlBookmarkCount(target) {
			if (!GM_getValue(HatenaArchiveAddBookmark.isBuzzurlBKMEnabledKey)) return;
			var apiUrl ="http://api.buzzurl.jp/api/counter/";
			var bookmarkUrl = "http://buzzurl.jp/entry/";
			var img = createImageTag(apiUrl + target.href);
			var anc = createAnchorTag(bookmarkUrl + target.href, img);
			anc.title = "Buzzurl";
			insertNext(target, anc);
		}
		function addFc2BookmarkCount(target) {
			if (!GM_getValue(HatenaArchiveAddBookmark.isFc2BKMEnabledKey)) return;
			var apiUrl ="http://bookmark.fc2.com/image/users/";
			var bookmarkUrl = "http://bookmark.fc2.com/search/url?url=";
			var img = createImageTag(apiUrl + target.href);
			var anc = createAnchorTag(bookmarkUrl + encodeURIComponent(target.href), img);
			anc.title = "fc2\u30d6\u30c3\u30af\u30de\u30fc\u30af";
			insertNext(target, anc); 
		}
	},
	
	addCategoryAnchorHandler: function() {
		var categoryAnchors = document.evaluate("//div[@id='archive-category']/descendant::a", document, null, 7, null);
		for (var i = 0; i < categoryAnchors.snapshotLength; i++) {
			categoryAnchors.snapshotItem(i).addEventListener("click",function() {
				window.setTimeout(HatenaArchiveAddBookmark.loadTargetAnchors,500);
			},false);
		}
	},
	addRssCount: function() {
		//add LDR and fastladder count.
		var apiUrl_ldr = "http://rpc.reader.livedoor.com/count?feedlink=";
		var apiUrl_flr = "http://rpc.fastladder.com/count?feedlink=";
		var targetAnc = null;
		var allAnc = document.getElementsByTagName("a");
		for (var i = 0; i < allAnc.length; i++) {
			if (allAnc[i].href.match(/.*\/rss$/)) {
				targetAnc = allAnc[i];
				break;
			}
		}
		if (targetAnc == null) return;
		//add LDR count.
		if (GM_getValue(this.isLdrEnabledKey)) {
			GM_xmlhttpRequest({
				method: 'GET',
				url: apiUrl_ldr + encodeURIComponent(targetAnc.href),
				headers: {
					'User-Agent': 'Mozilla/4.0 (compatible) Greasemonkey',
					},
				onload: function(ret) {
					var count = ret.responseText;
					var ctag = createCountTag();
					if(count == 1) {
						ctag.innerHTML = "LDR: "+ count + " user";
						insertNext(targetAnc, ctag);
					} else if (count > 1) {
						ctag.innerHTML = "LDR: "+ count + " users";
						insertNext(targetAnc, ctag);
					}
				}
			});
		}
		//add fastladder count.
		if (GM_getValue(this.isFastLadderEnabledKey)) {
			GM_xmlhttpRequest({
				method: 'GET',
				url: apiUrl_flr + encodeURIComponent(targetAnc.href),
				headers: {
					'User-Agent': 'Mozilla/4.0 (compatible) Greasemonkey',
				},
				onload: function(ret){
					var count = ret.responseText;
					var ctag = createCountTag();
					if (count == 1) {
						ctag.innerHTML = "Fastladder: " + count + " user";
						insertNext(targetAnc, ctag);
					} else if (count > 1) {
						ctag.innerHTML = "Fastladder: " + count + " users";
						insertNext(targetAnc, ctag);
					}
				}
			});
		}
		
		function createCountTag() {
			var ret = document.createElement("span");
			ret.setAttribute("style",
				"border: 1px solid green; margin: 0px 3px;padding: 1px 1px 0px;" +
				"font-size: 10px; font-waight: normal;");
			return ret;
		}
		
		function insertNext(tar,ins) {
			tar.parentNode.insertBefore(ins, tar.nextSibling);
		}
	},
	registerSettingCommand: function() {
		GM_registerMenuCommand("Hatena Archive Bookmark - config",HatenaArchiveAddBookmark.showSettingPanel);
	},
	settingPanel: null,
	isHatebEnabledKey: "__hateb_Enabled",
	isLDClipEnabledKey: "__ldclip_Enabled",
	isYahooBKMEnabledKey: "__ybkm_Enabled",
	isBuzzurlBKMEnabledKey: "__buzzurl_Enabled",
	isFc2BKMEnabledKey: "__fc2bkm_Enabled",
	isLdrEnabledKey: "__ldr_Enabled",
	isFastLadderEnabledKey: "__fast_LadderEnabled",
	showSettingPanel: function() {
		HatenaArchiveAddBookmark._showSettingPanel.apply(HatenaArchiveAddBookmark, arguments);
	},
	_showSettingPanel: function() {
		if (this.settingPanel != null) return;
		var panelBase = createBase();
		var enableHatebCheck = createCheckUi("hatena bookmark",this.isHatebEnabledKey);
		var enableLdClipCheck = createCheckUi("livedoor clip",this.isLDClipEnabledKey);
		var enableYahooBKMCheck = createCheckUi("yahoo bookmark",this.isYahooBKMEnabledKey);
		var enableBuzzurlBKMCheck = createCheckUi("buzzurl",this.isBuzzurlBKMEnabledKey);
		var enableFc2BKMCheck = createCheckUi("fc2 bookmark",this.isFc2BKMEnabledKey);
		var enableLdrCheck = createCheckUi("livedoor reader",this.isLdrEnabledKey);
		var enableFlrCheck = createCheckUi("fastladdr",this.isFastLadderEnabledKey);
		append(panelBase,enableHatebCheck,
			enableLdClipCheck,enableYahooBKMCheck,enableBuzzurlBKMCheck,
			enableFc2BKMCheck,enableLdrCheck,enableFlrCheck);
		var enterButton = createEnterButtonUi();
		append(panelBase, enterButton);
		append(window.top.document.body, panelBase);
		this.settingPanel = panelBase;
		return;
				
		function createBase() {
			var ret = create("div");
			ret.setAttribute("style","position:fixed; right:10px; bottom:10px;" +
				"width: 200px; height:200px; background-color:black; color:white;" +
				"opacity: 0.7; border:3px double silver;" +
				"font-size:12px; padding:5px;");
			ret.id = this.settingPanelId;
			var title = create("p");
			title.innerHTML = "Hatena Archive Bookmark: config";
			ret.appendChild(title);
			return ret;
		}
		function createCheckUi(label, id) {
			var ret = create("div");
			ret.setAttribute("style","text-align: left;");
			var _label = create("label");
			_label.setAttribute("for",id);
			_label.setAttribute("style","padding: 0px 5px;");
			_label.innerHTML = label;
			var check = create("input");
			check.id = id;
			check.type = "checkbox";
			check.setAttribute("style"," vertical-align: middle;");
			checked = GM_getValue(id);
			if (checked === true) check.checked = true;
			ret.appendChild(check);
			ret.appendChild(_label);
			return ret;
		}
		function createEnterButtonUi() {
			var button = create("input");
			button.type = "button";
			button.value = " OK ";
			var topdoc = window.top.document;
			button.addEventListener("click", function() {
				setValue(HatenaArchiveAddBookmark.isHatebEnabledKey);
				setValue(HatenaArchiveAddBookmark.isLDClipEnabledKey);
				setValue(HatenaArchiveAddBookmark.isYahooBKMEnabledKey);
				setValue(HatenaArchiveAddBookmark.isBuzzurlBKMEnabledKey);
				setValue(HatenaArchiveAddBookmark.isFc2BKMEnabledKey);
				setValue(HatenaArchiveAddBookmark.isLdrEnabledKey);
				setValue(HatenaArchiveAddBookmark.isFastLadderEnabledKey);
				topdoc.body.removeChild(HatenaArchiveAddBookmark.settingPanel);
				HatenaArchiveAddBookmark.settingPanel = null;
				
				function setValue(id) {
					var target = topdoc.getElementById(id);
					if (target && target.checked === true) {
						console.log("set true: " +id);
						GM_setValue(id, true);
					} else {
						GM_setValue(id, false);
					}
				}
			}, false);
			return button;
		}
		function append() {
			var parent = arguments[0];
			for (var i = 1; i < arguments.length; i++) {
				parent.appendChild(arguments[i]);
			}
		}
		function create(ele) {
			return window.top.document.createElement(ele);
		}
	},
};

HatenaArchiveAddBookmark.init();