GWave Favicon Alerts

By Peter Wooley Last update Nov 26, 2009 — Installed 1,245 times.

There are 1 previous version of this script.

// ==UserScript==
// @name           GWave Favicon Alerts
// @description    Alerts you to the number of unread items in Google Wave.
// @version        1.1
// @date           2009-11-25
// @author         Peter Wooley
// @namespace      http://peterwooley.com
// @include        http*://wave.google.com/*
// ==/UserScript==

// Wait for the window to load to try and initialize
window.addEventListener('load', function() {
	  new GWaveFaviconAlerts;
	}, true);


function GWaveFaviconAlerts() {
	var self = this;
	
	this.construct = function() {
		this.head = document.getElementsByTagName("head")[0];
		this.pixelMaps = {
			icons: {
				'unread': [["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(0, 96, 192, 1)","rgba(0, 102, 204, 0.748031496063)","rgba(0, 102, 204, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 0.748031496063)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 0.748031496063)","rgba(255, 170, 0, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 0.748031496063)","rgba(0, 144, 53, 1)"],["rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 0.748031496063)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 0.748031496063)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 0.748031496063)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 0.748031496063)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)"],["rgba(0, 102, 204, 0.503937007874)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 0.503937007874)","rgba(255, 170, 0, 0.503937007874)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 0.503937007874)"],["rgba(0, 102, 204, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 0)","rgba(255, 170, 0, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 0)"],["rgba(0, 102, 204, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 0)","rgba(255, 170, 0, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 0.503937007874)","rgba(255, 64, 64, 0.503937007874)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 0.503937007874)","rgba(0, 153, 57, 0.503937007874)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 0.748031496063)","rgba(0, 102, 204, 1)","rgba(0, 102, 204, 1)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 0.748031496063)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 0.748031496063)","rgba(255, 170, 0, 1)","rgba(255, 170, 0, 1)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 0.748031496063)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(0, 102, 204, 0)","rgba(0, 102, 204, 0.748031496063)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 1)","rgba(255, 64, 64, 0.748031496063)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 170, 0, 0)","rgba(255, 170, 0, 0.748031496063)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 1)","rgba(0, 153, 57, 0.748031496063)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"],["rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)","rgba(255, 255, 255, 0)"]]
				},
			numbers: {
				0: [
					[1,1,1],
					[1,0,1],
					[1,0,1],
					[1,0,1],
					[1,1,1]
				],
				1: [
					[0,1,0],
					[1,1,0],
					[0,1,0],
					[0,1,0],
					[1,1,1]
				],
				2: [
					[1,1,1],
					[0,0,1],
					[1,1,1],
					[1,0,0],
					[1,1,1]
				],
				3: [
					[1,1,1],
					[0,0,1],
					[0,1,1],
					[0,0,1],
					[1,1,1]
				],
				4: [
					[0,0,1],
					[0,1,1],
					[1,0,1],
					[1,1,1],
					[0,0,1]
				],
				5: [
					[1,1,1],
					[1,0,0],
					[1,1,1],
					[0,0,1],
					[1,1,1]
				],
				6: [
					[0,1,1],
					[1,0,0],
					[1,1,1],
					[1,0,1],
					[1,1,1]
				],
				7: [
					[1,1,1],
					[0,0,1],
					[0,0,1],
					[0,1,0],
					[0,1,0]
				],
				8: [
					[1,1,1],
					[1,0,1],
					[1,1,1],
					[1,0,1],
					[1,1,1]
				],
				9: [
					[1,1,1],
					[1,0,1],
					[1,1,1],
					[0,0,1],
					[1,1,0]
				],
				'+': [
					[0,0,0],
					[0,1,0],
					[1,1,1],
					[0,1,0],
					[0,0,0],
				],
				'k': [
					[1,0,1],
					[1,1,0],
					[1,1,0],
					[1,0,1],
					[1,0,1],
				]
			}
		};
		
		this.timer = setInterval(this.poll, 500);
		this.poll();
		
		return true;
	}
	
	this.drawUnreadCount = function(unread) {
		if(!self.textedCanvas) {
			self.textedCanvas = [];
		}
		
		if(!self.textedCanvas[unread]) {
			var iconCanvas = self.getUnreadCanvas();
			var textedCanvas = document.createElement('canvas');
			textedCanvas.height = textedCanvas.width = iconCanvas.width;
			var ctx = textedCanvas.getContext('2d');
			ctx.drawImage(iconCanvas, 0, 0);
			
			ctx.fillStyle = "#fef4ac";
			ctx.strokeStyle = "#dabc5c";
			ctx.strokeWidth = 1;
			
			var count = unread.length;
			
			if(count > 4) {
				unread = "1k+";
				count = unread.length;
			}
			
			var bgHeight = self.pixelMaps.numbers[0].length;
			var bgWidth = 0;
			var padding = count < 4 ? 1 : 0;
			var topMargin = 2;
			
			for(var index = 0; index < count; index++) {
				bgWidth += self.pixelMaps.numbers[unread[index]][0].length;
				if(index < count-1) {
					bgWidth += padding;
				}
			}
			bgWidth = bgWidth > textedCanvas.width-4 ? textedCanvas.width-4 : bgWidth;
			
			ctx.fillRect(textedCanvas.width-bgWidth-4,topMargin,bgWidth+4,bgHeight+4);
			
			var digit;
			var digitsWidth = bgWidth;
			for(var index = 0; index < count; index++) {
				digit = unread[index];
				
				if (self.pixelMaps.numbers[digit]) {
					var map = self.pixelMaps.numbers[digit];
					var height = map.length;
					var width = map[0].length;
					
					ctx.fillStyle = "#2c3323";
					
					for (var y = 0; y < height; y++) {
						for (var x = 0; x < width; x++) {
							if(map[y][x]) {
								ctx.fillRect(14- digitsWidth + x, y+topMargin+2, 1, 1);
							}
						}
					}
					
					digitsWidth -= width + padding;
				}
			}	
			
			ctx.strokeRect(textedCanvas.width-bgWidth-3.5,topMargin+.5,bgWidth+3,bgHeight+3);
			
			self.textedCanvas[unread] = textedCanvas;
		}
		
		return self.textedCanvas[unread];
	}
	this.getIcon = function() {
		return self.getUnreadCanvas().toDataURL('image/png');
	}	
	this.getUnreadCanvas = function() {
		if(!self.unreadCanvas) {
			self.unreadCanvas = document.createElement('canvas');
			self.unreadCanvas.height = self.unreadCanvas.width = 16;
			
			var ctx = self.unreadCanvas.getContext('2d');
			
			for (var y = 0; y < self.unreadCanvas.width; y++) {
				for (var x = 0; x < self.unreadCanvas.height; x++) {
					if (self.pixelMaps.icons.unread[y][x]) {
						ctx.fillStyle = self.pixelMaps.icons.unread[y][x];
						ctx.fillRect(x, y, 1, 1);
					}
				}
			}
		}
		
		return self.unreadCanvas;
	}
	this.getUnreadCount = function() {
		matches = self.getSearchText().match(/\((.*)\)/);
		
		return matches && matches[1] > 0 ? matches[1] : false;
	}
	this.getUnreadCountIcon = function() {
		var unread = self.getUnreadCount();		
		return self.drawUnreadCount(unread).toDataURL('image/png');
	}
	this.getSearchText = function() {
		return document.title;
	}
	this.poll = function() {
		if(self.getUnreadCount()) {
			self.setIcon(self.getUnreadCountIcon());
		} else {
			self.setIcon(self.getIcon());
		}
	}
	
	this.setIcon = function(icon) {
		var links = self.head.getElementsByTagName("link");
		for (var i = 0; i < links.length; i++)
			if (links[i].type == "image/x-icon" && 
			   (links[i].rel == "shortcut icon" || links[i].rel=="icon") &&
			   links[i].href != icon)
				self.head.removeChild(links[i]);
			else if(links[i].href == icon)
				return;

		var newIcon = document.createElement("link");
		newIcon.type = "image/x-icon";
		newIcon.rel = "shortcut icon";
		newIcon.href = icon;
		return self.head.appendChild(newIcon);
	}
	
	this.toString = function() { return '[object GWaveFaviconAlerts]'; }
	
	return this.construct();
}