Gmail Smiley Extender : Plurk

By artyfarty Last update Jan 24, 2012 — Installed 286 times.
// ==UserScript==
// @name           Gmail Smiley Extender : Plurk
// @description    Add extra emojii to your Gmail chat!
// @author         1nfected & artyfarty
// @version        1.4.1
// @namespace      1nfected
// @license        CC by-nc-sa http://creativecommons.org/licenses/by-nc-sa/3.0/

// @include        http://mail.google.com/*
// @include        https://mail.google.com/*
// ==/UserScript==


(function() {

// -------- USER CONFIGURABLE OPTIONS ------- //

// User defined CUSTOM SMILEYS
/* Declare your custom smileys here in the following format:

	var customSmileys = [
		[<REGEXP>, <FULL_PATH_TO_SMILEY>],
		[<REGEXP>, <FULL_PATH_TO_SMILEY>]
	];
	 
	EXAMPLE:
	var customSmileys = [
		[/:lol:/      ,'http://www.example.com/lol.gif'],
		[/:roflmao:/  ,'http://example.com/smileys/roflmao.png'],
		[/lmao/		  ,'https://ex.ample.org/laugingmyassoff.jpg']
	];
*/

var customSmileys;

// ------ END USER CONFIGURABLE OPTIONS ------ //

// -------- DONT EDIT BELOW THIS LINE -------- //

try { if(self != window.top) { return; } }
catch(e) { return; }

testGM();

var smileys, smileyURL;

var version = '0.5';
var scriptid = 77439;

// Test for Greasemonkey API & adapt accordingly
function testGM() {
	const LOG_PREFIX = 'Gmail Smiley Extender: ';
	const LOG = true;
	const DEBUG = false;
	isGM = typeof GM_getValue != 'undefined' && typeof GM_getValue('a', 'b') != 'undefined';
	log = isGM ? function(msg) { if(LOG) GM_log(msg) } : window.opera ? function(msg) { if(LOG) opera.postError(LOG_PREFIX+msg); } : function(msg) { try { if(LOG) console.info(LOG_PREFIX+msg); } catch(e) {} }
	debug = function(msg) { if(LOG && DEBUG) log('** Debug: '+msg+' **') }
}


// All in one function to get elements
function $(q,root,single,context) {
	root = root || document;
	context = context || root;
	if(q[0] == '#') return root.getElementById(q.substr(1));
	if(q.match(/^[\/*]|^\.[\/\.]/)) {
		if(single) return root.evaluate(q,context,null,9,null).singleNodeValue;
		var arr = []; var xpr = root.evaluate(q,context,null,7,null);
		for(var i = 0, len = xpr.snapshotLength; i < len; i++) arr.push(xpr.snapshotItem(i));
		return arr;
	}
	if(q[0] == '.') {
		if(single) return root.getElementsByClassName(q.substr(1))[0];
		return root.getElementsByClassName(q.substr(1));
	}
	if(single) return root.getElementsByTagName(q)[0];
	return root.getElementsByTagName(q);
}

function addStyle(css) {
	var head = $('head')[0];
	if(!head) return;
	var style = document.createElement('style');
	style.type = 'text/css';
	style.appendChild(document.createTextNode(css));
	head.appendChild(style);
}

// Waits for a given set of Elements to load. Takes a callback as argument which is called if all the elements are found.
// mode == 0 : callback only if all the elements are found. (DEFAULT)
// mode == 1 : callback even if none of the elements are found.
// mode == 2 : callback immed if any single element is found.
function $W(Q,callback,mode,t) {
	t = t || 1; mode = mode || 0;
	var arr = Q instanceof Array;
	var l = arr ? Q.length : 1;
	var matches = [];
	for(var i = 0; i < l; i++) {
		var O = arr ? Q[i] : Q;
		var q = O.q || O, r = O.r, s = O.s, c = O.c;
		var T = O.t || 10, I = O.i || 250, N = O.n, F = O.f;
		var match = $(q,r,s,c);
		if(match && match.length == 0) match = null;
		if(match) { matches.push(match); if(mode == 2) { break; } }
		else {
			if(i !== (l-1) && mode == 2) { continue; }
			if(t >= T) {
				if(F) log(F);
				if(mode !== 1)
					return;
			}
			else {
				if(N) debug(t+' - '+N+' in '+t*I+'ms...');
				window.setTimeout(function(){$W(Q,callback,mode,++t)},t*I);
				return;
			}
		}
	}
	if(typeof callback == 'function') {
		if(matches.length == 1) matches = matches[0];
		if(matches.length == 0) matches = null;
		callback(matches);
	}
}

window.addEventListener('load', init, false);

function init() {
	$W({q:'.no',t:20,i:150,r:document,s:true,n:'Finding root element...',f:'Failed to find root element!'},chatHook,2);

	smileys = [
		[':-[','ah.gif'],
		[']:->','aq.gif'],
		['[:-}','ar.gif'],
		[':-!','at.gif'],
		['@}->--','ax.gif'],
		['*DRINK*','az.gif'],
		['*IN LOVE*','ba.gif'],
		['@=','bb.gif'],
		['*HELP*','bc.gif'],
		['\m/','bd.gif'],
		['%)','be.gif'],
		['*LOL*','dy.gif'],
		['(русский)','gf.gif'],
		['(onfire)','onfire.gif'],
		['(pufface)','hh.gif'],
		['(pufface_dad)','dad.gif'],
		['(rboy)','rboy.gif'],
		['(doh)','ge.gif'],
		['(dapanic)','id.gif'],
		['(fuu)','ff.gif'],
		['(gfuu)','fg.gif'],
		['(raeg)','raeg.gif'],
		['(rage)','hj.gif'],
		['(redeyes)','ix.gif'],
		['(yay)','fh.gif'],
		['(gyay)','fi.gif'],
		['(yaay)','hn.gif'],
		['(yee)','ho.gif'],
		['(whoa)','ih.gif'],
		['(sheep)','sheep.gif'],
		['(aha)','fl.gif'],
		['(gaha)','fm.gif'],
		['(iaha)','he.gif'],
		['(ahatroll)','ii.gif'],
		['(troll)','ft.gif'],
		['(gtroll)','fs.gif'],
		['(troll_dance)','troll_dance.gif'],
		['(troll_wave)','troll_wave.gif'],
		['(no_troll)','hg.gif'],
		['(vtroll)','gj.gif'],
		['(trolldad_jump)','iy.gif'],
		['(badum)','badum.gif'],
		['(yea)','yea.gif'],
		['(gyea)','fo.gif'],
		['(chrome_yea)','chrome_yea.gif'],
		['(pokerface)','pokerface.gif'],
		['(gpokerface)','fq.gif'],
		['(derp)','hc.gif'],
		['(ie_derp)','ie_derp.gif'],
		['(uderp)','ij.gif'],
		['(jumper)','jumper.gif'],
		['(ynou)','hp.gif'],
		['(ynou_orig)','ynou_orig.gif'],
		['(jackie)','it.gif'],
		['(pony_ynou)','pony_ynou.gif'],
		['(seriously)','seriously.gif'],
		['(haa)','ig.gif'],
		['(eww)','eww.gif'],
		['(bah)','fj.gif'],
		['(gbah)','fk.gif'],
		['(whatever)','fu.gif'],
		['(gwhatever)','fw.gif'],
		['(me_gusta)','me_gusta.gif'],
		['(alone)','ha.gif'],
		['(NO)','NO.gif'],
		['(huh)','hd.gif'],
		['(okay)','hq.gif'],
		['(cry)','ik.gif'],
		['(biggrin)','il.gif'],
		['(ca)','im.gif'],
		['(concentrated)','in.gif'],
		['(determined)','io.gif'],
		['(ewbte)','ip.gif'],
		['(gasp)','iq.gif'],
		['(gasp_r)','gasp_r.gif'],
		['(gman)','ir.gif'],
		['(gtfo)','is.gif'],
		['(pfftch)','iv.gif'],
		['(prrr)','iw.gif'],
		['(all)','all.gif'],
		['(point)','point.gif'],
		['(sing)','hk.gif'],
		['(dance)','ga.gif'],
		['(banana_cool)','gb.gif'],
		['(banana_rock)','gc.gif'],
		['(no_dance)','hf.gif'],
		['(dance_okok)','hb.gif'],
		['(droid_dance)','gd.gif'],
		['(cryblood)','if.gif'],
		['(jazzhands)','fr.gif'],
		['(rushface)','gk.gif'],
		['(puffy)','hi.gif'],
		['(taser_okok)','hl.gif'],
		['(vawesome)','hm.gif'],
		['(knife)','hr.gif'],
		['(bunny_dance)','hs.gif'],
		['(bunny_pose)','ia.gif'],
		['(cat)','ib.gif'],
		['(catface)','ic.gif'],
		['(wobbly)','ie.gif'],
		['(pcface)','iu.gif'],
		['(awesome)','awesome.gif'],
		['(boyan)','boyan.gif'],
		['(creeper)','creeper.gif'],
		['(kill)','kill.gif'],
		['(omsk)','omsk.gif'],
		['(rainbow)','rainbow.gif'],
		['(wall)','wall.gif']
	];
	smileyURL = 'http://artyfarty.ru/emo/';
	
	for(var i = smileys.length-1; i >= 0; i--) {
		smileys[i][0] = new RegExp(addslashes(smileys[i][0]), "gim");
		smileys[i][1] = smileyURL+smileys[i][1];
	}
	
	addStyle(".smileyext{margin-top:-2px;vertical-align:middle}");
}

function chatHook(match) {
	match.addEventListener('DOMNodeInserted',function(event) {
		var source = event.target;
		if(source.className == 'km' || source.className == 'kl' || source.className == 'Z8Dgfe') {
			insertSmiley(source);
		}
	},false);
	
	log('Smiley Extender started.');
}

function insertSmiley(node) {
	for(var i = smileys.length-1; i >= 0; i--) {
		var smileyRegex = smileys[i][0];
		var smileyImg = smileys[i][1];
		if (node.innerHTML.match(smileyRegex)) {
			node.innerHTML = node.innerHTML.replace(smileyRegex,' <img class="smileyext" src="'+smileyImg+'"> ');
			
			node.addEventListener('DOMSubtreeModified',function(event) {
				insertSmiley(node);
			},false);
		}
	}
}

function addslashes( str ) {    // Quote string with slashes
    //return str.replace('/(["\'\])/g', "\\$1").replace('/\0/g', "\\0");
	return str.replace(/([\\\(\)\[\]\+\-\*])/g, "\\$1");
}


})();