By
Bandit
—
Uploaded
May 27, 2009
/*
@author: James Nisbet
@url: http://blog.bandit.co.nz
@info: http://lab.bandit.co.nz/scripts/jetpacks/gmail.htm
@update: http://lab.bandit.co.nz/scripts/jetpacks/bandit-gmail.js
@title: Jetpack Gmail Checker
@description: Jetpack Gmail checker, adapted from Mozilla's example script
@version: 0.5
*/
function GmailNotifier(doc) {
// hi there
}
GmailNotifier.prototype = {
// location of your Gmail atom feed - change this if you're using apps
// should now automatically detect apps domains
url: "http://mail.google.com/mail/feed/atom",
// go to inbox - if a tab is already open focus it, otherwise open a new one
goToInbox: function() {
// find gmail
this.findGmail();
// focus it if it's there
if(this.gmail>=0) jetpack.tabs[this.gmail].focus();
else {
jetpack.tabs.open("http://mail.google.com"); // you can change this to your apps domain if you want
this.gmail = (jetpack.tabs.length - 1);
jetpack.tabs[ this.gmail ].focus();
}
},
// polling function
runUpdate: function(doc) {
self = this; // juggling name spaces
doc = $(doc);
// check for new messages
$.get( self.url, function(xml) {
var el = $(xml).find("fullcount"); // unread message count
if( el ){
var msg = "";
var newcount = parseInt(el.get(0).textContent);
if(newcount>self.count) {
// are there any unread messages?
if(newcount==0) {
msg = "No new emails";
}
else {
// if this is the first time we're checking
if(self.count==-1) msg = newcount+" unread emails";
else {
// otherwise just give an update
// so how many new messages
var diff = (newcount-self.count);
if(diff==1) {
var sender = $(xml).find("name").get(0).textContent;
msg = "New email from "+sender;
}
else msg = diff+" new emails";
}
}
}
// update!
self.change(newcount,msg,doc);
}
else self.change("Login","Please login to Gmail",doc);
});
},
// check for chat messages if gmail is open
checkChats: function(doc) {
// this.findGmail();
if(this.gmail>=0) {
var title = jetpack.tabs[this.gmail].contentDocument.title;
if(title.indexOf("says…")>=0||title.indexOf("says...")>=0) {
// reset chat flag
this.lastChat[1] = 0;
// who's chattin?
var who = title.replace("says...","").replace("says…","").replace(/^\s+|\s+$/g,"");
// see if this person's in our lastChat array
var loc = this.iterateChats("find",who);
// make sure this isn't the same person as last check
if(loc<0) {
this.iterateChats("add",who);
this.notify("New chat from "+who,this.icons.chat);
}
}
else this.iterateChats("iterate");
// have we checked five times with no chat detected?
if(this.lastChat[1]>=5) this.lastChat = [[],0]; // clear chat flag and await new chats
}
},
iterateChats: function(func,val) {
chats = this.lastChat[0];
if(func=="iterate") {
for(var c in chats) {
if(chats[c][0]!=val) chats[c][1]++; // add one to the iteration count
if(chats[c][1]>2) chats.splice(c,1); // remove if it's been more than 2 iterations since this was shown
}
this.lastChat[1]++;
}
else if(func=="find") {
for(var c in chats) {
if(chats[c][0]==val) {
chats[c][1] = 0; // reset iteration counter
return c; // return the array location of the name requested
}
}
return -1; // otherwise return false
}
else if(func=="add") chats[chats.length] = [val,0]; // add this user to the array
this.lastChat[0] = chats;
return true;
},
change: function(to,msg,doc) {
// update the count
if(typeof to=="number") {
$(doc).find("#g-count").text(to);
this.count = to;
}
// update the icon
var icon = (to>0) ? this.icons.unread : this.icons.read;
$(doc).find("#g-icon").get(0).src = icon;
// notify
if(msg!="") this.notify(msg,icon);
},
notify: function(msg,type,title) {
if(typeof title == "undefined") title = "Gmail Bandit";
jetpack.notifications.show({
title: title,
body: msg,
icon: type
});
},
// try to find a tab with gmail open in it
findGmail: function() {
this.gmail = -1;
for(var i=0;i<jetpack.tabs.length;i++) {
turl = jetpack.tabs[i].url;
if(turl.indexOf("mail.google.com")>=0) {
this.gmail = i;
// try to automatically detect apps domains
if(turl.indexOf("/a/")>=0) {
this.url = "http://mail.google.com"+
turl.match(/\/a\/[a-z0-9\.\-]+/i)+
"/feed/atom";
}
return i;
}
}
},
gmail: -1,
count: -1,
lastChat: [[],0],
// gmail favicons - thanks to http://userscripts.org/scripts/show/24430
icons: {
chat: 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxMRnxZSkS5AAAAFgAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAemtkuz4yLLs4KyeMAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFltLRf+3p6D/ZVZR/ywhHrsAAAAfAAAAFgAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAHzQpJbt9bWf/6dnS/+nZ0v9xYVz/Nysn/zQpJbsxJiOMAAAAHwAAAA8AAAAAAAAAAAAAAAAAAAAWPzMujEc5NP+Cc2z/6dnS/+nZ0v/p2dL/6dnS/+bWz/+mlY//eWhj/0c5NP8/My6MAAAAFgAAAAAAAAAHVEZAu5GBev/ZycL/6dnS/+nZ0v/p2dL/6dnS/+nZ0v/p2dL/5dXO/9XEvf/Csar/hnZw/1RFQLsAAAAPSj46VYZ3cf/r3Nb/69zW/+vc1v/r3Nb/69zW/+vc1v/r3Nb/69zW/+vc1v/fz8n/0L+5/9C/uf+RgHr/WkxHjG1dV//BtK7/7+Pd/+/k3//w5eD/8Obh//Hm4v/x5uL/8ebi//Dm4f/w5eD/6d3Y/9HBu//Rwbr/xrav/2xcVv9zZF//9Ozo//bw7f/48/H/+vb0//v49v/8+fj//Pr5//z5+P/7+Pb/+vb0//fy8P/Txb//0sS+/9LDvf9yY13/e25o/9zX1f/9/Pz//v39//7+/v///v7///////////////////7+//7+/v/28/L/1cnE/9XIw//Ty8f/eWpl/4N3cleupqP/////////////////////////////////////////////////7Ofl/9bKxf/18fD/qJ6b/4BzblcAAAAAjIF8sru1sv//////////////////////////////////////+Pb2//f19P/18vH/tq2q/4l9eLIAAAAAAAAAAAAAAACUiYWylImF/8C6uP/08/P//////////////////v79/+7s6v+6sq//kIWA/5CFgLIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcko98nJKP/5ySj/+cko//m5GN/5mPi/+YjYn/mI2JfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAPv/AAD4/wAA+H8AAPAPAADAAwAAgAEAAIAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAAD4HwAA//8AAA==',
read: 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAACMuAAAjLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0Wsv8NFrL/gYGu/4GBrv+Bga7/gYGu/4GBrv+Bga7/gYGu/4GBrv+Bga7/gYGu/4GBrv+Bga7/DRay/w0Wsv8QGbX/EBm1/8HB0//g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/wcHT/xAZtf8QGbX/FBy5/xQcuf+Jibn/x8fZ/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/x8fZ/4mJuf8UHLn/FBy5/xogvv8aIL7/zc3g/42Nvv/NzeD/7u7u/+7u7v9qat3/amrd/+7u7v/u7u7/zc3g/42Nvv/NzeD/GiC+/xogvv8gJcP/ICXD//X19f/T0+f/kZHE/6Sk0v9SUtv/PT3U/z091P9SUtv/pKTS/5GRxP/T0+f/9fX1/yAlw/8gJcP/Ki7K/youyv/7+/v/+/v7/6qq2f9YWOH/Q0Pb/zw82P88PNj/Q0Pb/1hY4f+qqtn/+/v7//v7+/8qLsr/Ki7K/zc60f83OtH///////////9fX+b/R0fd/0RE3P+6uv//urr//0RE3P9KSt//X1/m////////////NzrR/zc60f9GR9f/RkfX//////9mZuf/U1Pg/0xM3v+9vf////////////+9vf//TEze/1NT4P9mZuf//////0ZH1/9GR9f/UlLd/1JS3f9tbej/V1fg/1RU3//AwP///////////////////////8DA//9UVN//YGDk/21t6P9SUt3/UlLd/1tb4f9bW+H/W1vh/1tb4f/Dw///////////////////////////////////w8P//1tb4f9bW+H/W1vh/1tb4f9gYOH/YGDh/2Bg4f+Kitz/np7P/56ez/+ens//np7P/56ez/+ens//np7P/56ez/+Kitz/YGDh/2Bg4f9gYOH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//////////////////w==',
unread: 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAACMuAAAjLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALopAP+6KQD/rYh4/62IeP+tiHj/rYh4/62IeP+tiHj/rYh4/62IeP+tiHj/rYh4/62IeP+tiHj/uikA/7opAP+9LAD/vSwA/9LDvf/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/0sO9/70sAP+9LAD/wTEA/8ExAP+5koD/2MnD/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/2MnD/7mSgP/BMQD/wTEA/8Y6A//GOgP/4NDI/76Wg//g0Mj/7e3t/+3t7f/jhVr/44Va/+3t7f/t7e3/4NDI/76Wg//g0Mj/xjoD/8Y6A//MQQn/zEEJ//X19f/n1s//xJqH/9OtnP/jc0D/3GIp/9xiKf/jc0D/062c/8Sah//n1s//9fX1/8xBCf/MQQn/0kwU/9JMFP/7+/v/+/v7/9q0o//pekb/5Ggv/+FiJ//hYif/5Ggv/+l6Rv/atKP/+/v7//v7+//STBT/0kwU/9lZI//ZWSP////////////ugE7/5mwz/+VpMP//zrf//863/+VpMP/objf/7oBO////////////2Vkj/9lZI//eaDL/3mgy///////uhVX/6HZA/+ZvOf//0Lr/////////////0Lr/5m85/+h2QP/uhVX//////95oMv/eaDL/5XRA/+V0QP/vjF3/6HlF/+d3Qv//0r3////////////////////////Svf/nd0L/7IBP/++MXf/ldED/5XRA/+l8Sf/pfEn/6XxJ/+l8Sf//1MD//////////////////////////////////9TA/+l8Sf/pfEn/6XxJ/+l8Sf/of0//6H9P/+h/T//gnH7/0KiV/9Colf/QqJX/0KiV/9Colf/QqJX/0KiV/9Colf/gnH7/6H9P/+h/T//of0//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//////////w=='
}
}
jetpack.statusBar.append({
html: <>
<img src="http://mail.google.com/mail/images/favicon.ico" id="g-icon" />
<span id="g-count"></span>
</>,
onReady: function(doc) {
var gmail = new GmailNotifier(doc);
$("#g-icon", doc).css({
float: "left",
cursor: "pointer"
});
$("#g-count", doc).css({
fontFamily: "Tahoma, Arial, sans-serif",
width: 14,
float: "left",
display: "block",
textAlign: "left",
fontSize: "11px",
lineHeight: "15px",
marginLeft: "2px",
textShadow: "#fff 0px 0px 1px",
cursor: "pointer"
});
gmail.findGmail();
gmail.runUpdate(doc);
// hook clicks
$(doc).click(function() { gmail.goToInbox() });
// check for new mail every 15 seconds
setInterval( function() { gmail.runUpdate(doc) }, 15*1000 );
// check for chats every 2 seconds (gmail cycles the title every 2 seconds)
setInterval( function() { gmail.checkChats(doc) }, 2*1000 );
},
width: 32
});