/* Tagz.in Notifier Jetpack
By yuth (Yathi Raj) adapted
from Delicious Notifier Notifier by osunick (Nick Nguyen)
This Jetpack shows the tagz icon in your status bar as well as the number of
saves for your current page.
Minor optimizations by Jeethu Rao
*/
(function() {
const CACHE_TIMEOUT = 300000;
const URL_RE = new RegExp('^(http|https)://','i');
function TagzNotifier(doc) {
$(doc).click( this.goToURL );
var notifier = this;
var currentUrl=jetpack.tabs.focused.contentWindow.location.href;
var cbFunc = (function() {
var jpUrl = jetpack.tabs.focused.contentWindow.location.href;
if (currentUrl != jpUrl) {
currentUrl = jpUrl;
notifier.update(doc);
}
});
jetpack.tabs.onReady(cbFunc);
jetpack.tabs.onFocus(cbFunc);
setInterval( cbFunc, 5000 );
}
TagzNotifier.prototype = {
goToURL:function(){
var bookmark_url= jetpack.tabs.focused.contentWindow.location.href;
var bookmark_title = jetpack.tabs.focused.contentWindow.document.title;
jetpack.tabs.open(["http://tagz.in/save/?ver=1&url=",
encodeURIComponent(bookmark_url),
"&title=",
encodeURIComponent(bookmark_title)].join(''));
jetpack.tabs[ Jetpack.tabs.length-1 ].focus();
},
getURLData: function( page_url, cbFunc ) {
var rez;
var url = "http://tagz.in/url/?format=json&hash=" + encodeURIComponent(this.hashURL(page_url));
if(jetpack.storage.live.url_cache===undefined) {
jetpack.storage.live.url_cache = {};
}
var url_cache = jetpack.storage.live.url_cache;
var that = this;
if(url in url_cache) {
rez = url_cache[url];
if((new Date() - rez[0]) < CACHE_TIMEOUT) {
cbFunc.call(that,rez[1]);
}
}
return $.get(url, function(json) {
url_cache[url] = [new Date(),json];
cbFunc.call(that,json);
});
},
updateIcon: function(doc, data) {
var count = 0;
if(data && data.found) {
count = data.saves;
}
if(count) {
doc.find("#tagz-icon-disabled").hide();
doc.find("#tagz-icon").show();
doc.find("#count").text(count);
} else {
doc.find("#tagz-icon").hide();
doc.find("#tagz-icon-disabled").show();
doc.find("#count").text('');
}
},
update: function(doc) {
var url = jetpack.tabs.focused.contentWindow.location.href;
doc = $(doc);
if(!URL_RE.test(url)) {
return this.updateIcon(doc);
}
var that = this;
this.getURLData(url, function(data) {
if(url==jetpack.tabs.focused.contentWindow.location.href) {
that.updateIcon(doc,(JSON ? JSON.parse(data) : jetpack.json.decode(data)).data);
}
});
},
normalizedURL: function(url) {
var query_string = '', url_component = url, url_len;
if(url.indexOf('?')!=-1){
url_component = url.substr(0, url.indexOf('?'));
query_string = url.substr(url.indexOf('?'), url.length);
}
if (url_component[url_component.length-1]=="/"){
url_component = url_component.substr(0, url_component.length-1);
}
url = url_component + query_string;
url_len = url.length;
if(url.substr(url_len-1)=='?') {
url = url.substr(0,url_len-1);
}
return url;
},
hashURL: function(url) {
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
var result = {};
converter.charset = "UTF-8";
var data = converter.convertToByteArray(this.normalizedURL(url), result);
var ch = Components.classes["@mozilla.org/security/hash;1"]
.createInstance(Components.interfaces.nsICryptoHash);
ch.init(ch.SHA256);
ch.update(data,data.length);
var hash = ch.finish(false);
// convert the binary hash data to a hex string.
var s = [toHexString(hash.charCodeAt(i)) for (i in hash)].join("");
return s;
}
};
function toHexString(charCode) {
return ("0" + charCode.toString(16)).slice(-2);
}
var tagz_icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAB2UlEQVQ4T4WSW2saURSFz5%2FIa0v%2FhTD01xVK0jZ9bEIT%2BgO8onhHQ" + "VHxlpl4m3hBxE4VtfZt6BniOFk5%2B4hjrMY%2B7JftXt9aazxM13V0Oh20Wi00m000Gg1omgZVVVGv188AsFPD2u02HMc5mMlkIiGVSuUkhJEzCQzDkM7j8diF0E6kQLFYf" + "BXCKDIdkxstarWaapombNuWewKWy2XkcrmjEEau20MhfhSRDcuyMDdtZH9tkoxGIxQKBWSz2QMII%2Bdt5PV6DRL%2F%2Fuvg0%2F0TPtwBGWPz23A4pBRIpVJ7ECY68uVyK"+ "Y9WqxVmwvlCe8K3DvBdBz7f7yCDwYBSIBaLuRBWrVbfi458sVjIo%2FbSls7XAvCjC9w87EP6%2FT6lQDgclhBJKZVKiujI5%2FO5PHr4Y%2BNcdXCt7yAXGpD%2BuYF0u11"+ "KgWAweOZ2yefziujIZ7PZAeRWAL42gMs7C%2FZ6kyKRSMDv97%2Fd%2B6Kin5LJZPh0OnUhHwXki6hw1VzBtB5fit%2B5FV5OOp1Wkskkp5dIEF1ArloOLHvn7PP5pPgogCYe"+"jyvRaJTTS9z%2BxSQW%2Bz3xqwCaSCTiEV%2Ba0wPr9XpHxScBNKFQyBMIBDiJvV7vgfi%2FABrh6hHiN%2F%2Fut%2FMMWsw67KA76pgAAAAASUVORK5CYII%3D";
var tagz_icon_disabled = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAABEElEQVQoU2XPXUvCcBSA8fMldlv4LYTRF9ZeMFIzEqabqJsbZkWtLMYwXHQlw"+"l8yD08XjTGNc3V4fhfnyCMPzLhjSkRIYCH7I%2FdoMQtCRgdEZigpEQmKkhLg7RGZooQgfrjmByVhiFMiEqEk%2BN%2BjdMOKN5R3XLoFkRBF2bFhjYfDHGWOQycnEpgvlC0r"+"XHwCPOYoL3RpWggi45Oh%2BURZ4uATMclJTIeGhQgysF2ToWT0CYiY4PKK8kSTc0sQpGc7ZlmQkAF9dsS0OT3Ob%2B3at%2BYDJaOHxwjzlytI8e%2BNfW0WKBljtsS0qVeQE"+"kBa9pVJUZSYVp73AHJZbZiE51I%2BAMhF9cy0qBX5H0Dq1dpRef8FdjdwKOIUd0MAAAAASUVORK5CYII%3D";
jetpack.statusBar.append({
html: <>
<img id="tagz-icon-disabled" style="padding-top:2px;" />
<img id="tagz-icon" style="padding-top:2px;display:none;" />
<span id="count" style="position:absolute;right:2px;top:8px;font-weight:bold;font-family:sans-serif;font-size:12px;cursor: pointer;background-color:rgba(255,255,255, .0);"></span>
</>,
onReady: function(doc){
doc.getElementById('tagz-icon').src = tagz_icon;
doc.getElementById('tagz-icon-disabled').src = tagz_icon_disabled;
var deliciousNotifier = new TagzNotifier(doc);
},
width: 20
});
})();