/*
	@author: James Nisbet
	@url: http://www.bandit.co.nz
	@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.2
*/

function GmailNotifier(doc) {
	
	// hi there
	
}

GmailNotifier.prototype = {
	
	// location of your Gmail atom feed - change this if you're using apps
	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() {
		if(this.gmail>=0) jetpack.tabs[this.gmail].focus();
		else {
			jetpack.tabs.open("http://mail.google.com");
			jetpack.tabs[ jetpack.tabs.length-1 ].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) {
		if(this.gmail>=0) {
			var title = jetpack.tabs[this.gmail].contentDocument.title;
			if(title.indexOf("...")>=0||title.indexOf("\u2026")>=0) {
				this.lastChat[1] = 0;
				// who's chattin?
				var who = title.replace(/says/i,"");
				
				// make sure this isn't the same person as last check
				if(who!=this.lastChat[0]) {
					this.lastChat[0] = who;
					this.notify("New chat from "+who,this.icons.chat);
				}
			}
			else this.lastChat[1]++;
			
			// have we checked twice with no chat detected?
			if(this.lastChat[1]>2) this.lastChat = ["",0]; // clear chat flag and await new chats
		}
	},
	
	change: function(to,msg,doc) {
		// update the count
		$(doc).find("#g-count").text( 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);
		
		// update count
		if(typeof to=="number") this.count = to;
	},
	
	notify: function(msg,type) {
		jetpack.notifications.show({
			title: "Gmail Bandit",
			body: msg,
			icon: type
		});
	},
	
	// try to find a tab with gmail open in it
	findGmail: function() {
		for(var i=0;i<jetpack.tabs.length;i++) {
			if(jetpack.tabs[i].url.indexOf("mail.google.com")>=0) {
				this.gmail = 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-count", doc).css({
			position: "absolute",
			fontFamily: "Tahoma, Arial, sans-serif",
			left: 0, top: 8,
			width: 20,
			display: "block",
			textAlign: "center",
			fontSize: "10px",
			cursor: "pointer",
			backgroundColor: "rgba(255,255,255,.5)"
		});
		gmail.findGmail();
		gmail.runUpdate(doc);
		
		// hook clicks
		$(doc).click(function() { gmail.goToInbox() });
		
		// update every x seconds
		setInterval( function() { gmail.runUpdate(doc) }, 60*1000 );
		
		// check for chats every 2 seconds (gmail cycles the title every 2 seconds)
		setInterval( function() { gmail.checkChats(doc) }, 2000 );
		
		// hook tab updates
		jetpack.tabs.onReady( function() { gmail.findGmail() } );
	},
	width: 20
});