aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorteramako2008-07-30 09:33:40 +0000
committerteramako2008-07-30 09:33:40 +0000
commita611448eb65bc4743022fe665a922260dff909ea (patch)
tree543a369d5cf3e34925e21134d89e98f538e7f15c
parent0e3cac231aab31c6f8c2f6ec6276bcb9506086be (diff)
downloadvimperator-plugins-a611448eb65bc4743022fe665a922260dff909ea.tar.bz2
initial release
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@16874 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r--ldr_unread_counter.js202
1 files changed, 202 insertions, 0 deletions
diff --git a/ldr_unread_counter.js b/ldr_unread_counter.js
new file mode 100644
index 0000000..0288afe
--- /dev/null
+++ b/ldr_unread_counter.js
@@ -0,0 +1,202 @@
+/**
+ * ==VimperatorPlugin==
+ * @name LDR unread counter
+ * @description Display unread count of LDR to statusbar
+ * @description-ja ステータスバーにLDRの未読件数を表示
+ * @version 0.1a
+ * @author teramako teramako@gmail.com
+ * ==/VimperatorPlugin==
+ *
+ * まず最初に
+ * let livedoor_id = "<livedoor ID>"
+ * とユーザIDを設定してください。
+ */
+
+liberator.plugins.ldrUnreadCounter = (function(){
+
+const defaultNameSpace = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+const gIntervalName = "ldr_check_intervals";
+const userIdName = "livedoor_id";
+
+var statusPanel, canvas;
+var icon_image = new Image();
+icon_image.src = "data:image/png;base64," +
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAQ5JREFUOMul" +
+ "kz1OAzEQhT87hihN2kUU3opjRELaiCYVgstQIKXLEdJT09IgrVJwi4SG7ehIgbR/Zik2WLblCCn7" +
+ "JMuemeenmbFHALDsOk7BUghx+Xji5QPUpGEQVOjYrUyUePUwivqlqTvcNdVzG5zqubV3K0PINXWH" +
+ "+mqFn9LtBjDOGWuHXABl6uP1hbEYV5bVcYH92rBfG1tOtAcAZQXJd7+7guPkxp4vrjc27vJl2kLa" +
+ "wofq97R15Be5Fdk+GRt3+fYZ/y6+OwJNCWS5baKLtO25gjv/J/48+2R5P+LsLaP6fPV8AJxHPpJb" +
+ "NwCznGaWM04yz6dLKAChF8NmQTIQAuC/LIpDW3QwDsWLEL8RGH9NPOjBNQAAAABJRU5ErkJggg==";
+
+/**
+ * initial function
+ */
+function init(){
+ createStatusButton();
+ manager.start();
+}
+
+/**
+ * create Status Icon to status line
+ */
+function createStatusButton(){
+ function createElement(localName, attrs, namespace){
+ var elm = document.createElementNS(namespace ? namespace : defaultNameSpace, localName);
+ for (var name in attrs) elm.setAttribute(name, attrs[name]);
+ return elm;
+ }
+ // FIXME: onclick時にLDRを開くように要修正
+ statusPanel = createElement("statusbarpanel", {
+ id: "ldr_unread_count_panel",
+ tooltiptext: "Count: " });
+ canvas = createElement("canvas", {
+ id: "ldr_unread_count_image",
+ width: "24", height: "16"
+ },"http://www.w3.org/1999/xhtml");
+ statusPanel.appendChild(canvas);
+
+ // Iconだけ最初に描画がしておく
+ var ctx = canvas.getContext("2d");
+ icon_image.onload=function(){ ctx.drawImage(icon_image,0,0); };
+ //ctx.drawImage(icon_image,0,0);
+
+ document.getElementById('status-bar').insertBefore( statusPanel,
+ document.getElementById('security-button').nextSibling);
+}
+function updateTooltip(str){
+ statusPanel.setAttribute("tooltiptext",str);
+}
+/**
+ * Update StatusIcon
+ * @param {String|Number} count
+ */
+function updateCanvasCount(count){
+ count = "" + count;
+
+ var ctx = canvas.getContext("2d");
+ ctx.clearRect(0,0,24,16);
+ ctx.save();
+
+ // LDR Icon の描画
+ ctx.drawImage(icon_image,0,0);
+
+ var width = ctx.canvas.width;
+ var height = ctx.canvas.height;
+ var len = ctx.mozMeasureText(count);
+
+ // 未読件数の背景を暗くする
+ // XXX: もっと良い色募集
+ ctx.save();
+ ctx.fillStyle = "rgba(48,48,48,0.75)";
+ ctx.fillRect(width-len-1,4,len+1,12);
+ ctx.restore();
+
+ // 未読件数の描画
+ // XXX: もっと良い色募集
+ ctx.fillStyle = "Cyan";
+ ctx.mozTextStyle = "12px sans-serif";
+ ctx.translate(width - len-1 ,height-1);
+ ctx.mozDrawText(count);
+ ctx.restore();
+}
+/**
+ * Draw Stop mark
+ */
+function canvasDrawStop(){
+ var ctx = canvas.getContext("2d");
+ ctx.clearRect(0,0,24,16);
+ ctx.drawImage(icon_image,0,0);
+ ctx.save();
+ //禁止マークの描画
+ ctx.strokeStyle = "Red";
+ ctx.lineWidth = "2";
+ ctx.beginPath();
+ ctx.arc(17,9,6,0,Math.PI*2,false);
+ ctx.stroke();
+ ctx.translate(17,9);
+ ctx.rotate(Math.PI/4);
+ ctx.beginPath();
+ ctx.moveTo(-6,0);
+ ctx.lineTo(6,0)
+ ctx.stroke()
+ ctx.restore();
+}
+
+var unreadCount = 0;
+function setCount(count){
+ unreadCount = count;
+ updateTooltip("Unread: " + count);
+ updateCanvasCount(count);
+}
+
+function checkCount(id){
+ try {
+ var xhr = new XMLHttpRequest();
+ xhr.mozBackgroundRequest = true;
+ xhr.open("GET", "http://rpc.reader.livedoor.com/notify?user=" + id, false);
+ xhr.send(null);
+ setCount(xhr.responseText.split("|")[1]);
+ } catch (e) {
+ liberator.log(e,0);
+ liberator.echoerr("LDR Unread Counter: " + e.message);
+ }
+}
+var timer = null;
+function startup(id){
+ setTimeout(function(){
+ checkCount(id);
+ timer = setTimeout(arguments.callee, manager.interval);
+ }, 1000);
+}
+// ---------------------------------------------------
+// PUBLIC
+// ---------------------------------------------------
+var manager = {
+ get user_id() {
+ return liberator.globalVariables[userIdName];
+ },
+ get interval() {
+ var interval = liberator.globalVariables[gIntervalName];
+ if (interval){
+ interval = parseInt(interval,10);
+ }
+ return (isNaN(interval) ? 120 : interval) * 1000;
+ },
+ set interval(value){
+ value = parseInt(value,10);
+ if (isNaN(value)) return null;
+
+ liberator.globalVariables[gIntervalName] = value;
+ return value;
+ },
+ get count(){
+ return unreadCount;
+ },
+ start: function(){
+ if (!this.user_id) {
+ liberator.echoerr("LDR Unread Counter: Please :let "+ userIdName + " = <livedoor ID>");
+ // FIXME: なんかエラーが出る。原因が良く分からん
+ //this.stop();
+ return;
+ }
+ if (timer === null)
+ startup(this.user_id);
+ else
+ liberator.echoerr("LDR Unread Counter has already started");
+ },
+ stop: function(){
+ window.clearTimeout(timer);
+ timer = null;
+ canvasDrawStop();
+ updateTooltip("LDR Unread Counter: stoped");
+ },
+ open: function(){
+ liberator.open(['http://reader.livedoor.com/reader/']);
+ }
+};
+
+init();
+return manager;
+})();
+
+// vim: sw=4 ts=4: