// ==UserScript==
// @name Mark my links
// @version 1.4
// @namespace http://www.lysator.liu.se/~jhs/userscript
// @description Finds and marks links to you visually with a tiny favicon of yours. Install and customize what sites should get which icons, and browse the web, getting visual cues for what links go back to you wherever you roam. As a bonus, the first ten links to you on any page (except your own) can be focused by way of access key 1..9 (and 0) -- i e Alt+1 will scroll the first link into view. Visit the script homepage to set it up or reconfigure it.
// @include http://*
// ==/UserScript==
var revision = '1.4.20060228';
var homepage = 'http://ecmanaut.blogspot.com/2006/02/mark-my-links-configuration-updates.html';
var test_url = document.referrer || '';
var gave_fav = is_abs_url( location.hash ) ? location.hash.substring( 1 ) : '';
var base_url = 'http://hem.bredband.net/ecmanaut/2006/02/25/';
var del_link = base_url + 'link_delete.png';
var add_link = base_url + 'link_add.png';
var help_url = 'http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:RegExp#Special_characters_in_regular_expressions';
var debug_it = function( msg ){ /*alert( msg );*/ };
// Link love for the masses
var def_icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMxSURBVHjabJFfaBxVFMa/e+fO7Mzszuxmk7bbVEhCaGKsabJtVErBYkAbWyoipSKCPuijoFBfVETQB19966OgDwUpNKI1NFSwJlas1Cc1UI2LtrYhMcnuJrOz8+fe65kpFf9dOMNw7/l+5zvnsF8XF3Ht6tc7/1hceKWYyGnH9/tlq7kpff/ciddefXfpyrfp1Yvzp6tx/Kzll/tUN1xpxdGXQ48fe2//yOhNwS2rJ7gwd36qXj8wcOy4aRQKPGk29zQ+/WTv8sI3UAzb+6rVt8eeeLJg9fZxGUX9ty7NjzdmZ6f5G28eN05U/Ne96z89s3v/hNW88hVfm5tj4Y0brHdy0izvG5/yav1HyqbpbVz+gq99NseCX5Z5accukfy4VGu3Nmx2bmpqaXcQ3MsrFQSNBnQUgbsO/MlJeOMTAAeC739A67trkME2eMGBMzAIub2FjmUts7O1WrumlCe1hgpDwCAF45RowSh5YABSEqpuBEY5WqZgjgvBOQLO2sJ23dQkIZMSsG0Sk8QwAK2gNzehCCCEAWY70HRHH+JTAUJbrpOKysje39ybv/ekZB30oLvkQiOHMKkIQIIMqOgvF4vMIITrwuyvrYu+memP2PkLE35PFamSYORGJylBGLTB8xbyo2V+z0wTnNyoboDqo4/MCnt44P10dPhFjxeGZEwugvCOfaoITi7IARWmzvQdgOPAKBbR5eq2OzR4hheL/u3KzNG3FNORZwg4JLRpHg4J3DSBkwURbLp3hYkSWaeOZHnmsXfMcqUh+u4ZBAbFh+urqw+wnxsvlRyXZStCNm2VDYM8cJZvh6pB2RbU2PAHpfqBM0hTCEkVQOE99ODp1lZ7z85O/FTBLgDtFrWRAXS+VngeVKmIZFd53j768MuqHeaj4XdnpLrdJBodeWHTL15KXVvCK+fryiIT66KrOr69oA8dfF53wq27ur8A2WFJ0lT1+tOrlnExKbkxqr3Q1SqUV0rbjrgsD9ZPIYpX/q75ByA/SbLRuW/s5C1LfZy4hRiOk2zt8D4PDx86SW8r/07/LyBzImWoJu5/bq0ozq67xmx85PAplqYb/5f7pwADAP7iXrLWFIO2AAAAAElFTkSuQmCC';
// And our favourite monkey
var g_monkey = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIDSURBVHjahFM9aBRBFP42rDgHB86Cwi6kyEqaCaTYdAlYmJDmhICcHLiKjcHmSiWFiJ1XWVrGK0KIjWkstrtLERIL4VYwuOVaBHYhwqwkcCMExpm5uJe7cPpgd+bNe++b+d6PVZwKjMv2EyZxkg6UawChPh5sJda4343qdVjjAB/XiKzYQ51c7MU5wGmAx+3P1kSAg5ehZPNLEGcC6bddiDwGdQN483WQKkGaHCI+J1hvta0rAJ2NUC7fb4LecoyeJwm+77/H3J2ncBkzZ8UJR/ThDXDTxb3XbUsDTB20QtlpEEmpVwZr0UGOXyuDtWi76yr9aAebjRmpz2xSpCAEuMz7r7DFpStnlYoC0r4iN7pd2I7iDPiCl05WsGBWGfdG9iapfY5Cse4T1+hTK63I4n0C/iNC8qWHf4m2i+NokA9VWvMC/fM9ojL9CE61MnLb+F7bxXQdDLvIhLgEsPgK7O4y/ic6ofpL9hk8VWZDQf+8WYY0ywzf7gQasSqrtuvVm2HgeT58Qfq1i2C1jubDECvP1ie+QNsD30e8p26nbAjQS7oQpymer9bwbuPFRIBU5SP+9Ba9oxiFO6BcduJmyGRQ5XBma6DeApzpYQPx4wQiUxVQlTr8SdCMsnIeRmZBt+ZO47aEai5KLoZJl0z1v7CpGqY5NLc6JvjX2W/j/0eAAQBq9sR9siLAwwAAAABJRU5ErkJggg==';
// Array of { i:'favicon URL', h:'host regexp', u:'URL regexp' } objects.
var matchers = eval( GM_getValue( 'matchers', '[{u:"\\\\.user\\\\.js(\\\\?.*)?$",i:"'+g_monkey+'"},{h:"ecmanaut.blogspot.com",i:"http://hem.bredband.net/ecmanaut/gfx/sites/ecmanaut.png"}]' ) );
EventMgr = // avoid leaking event handlers
{
_registry:null,
initialize:function() {
if(this._registry == null) {
this._registry = [];
EventMgr.add(window, "_unload", this.cleanup);
}
},
add:function(obj, type, fn, useCapture) {
this.initialize();
if(typeof obj == "string")
obj = document.getElementById(obj);
if(obj == null || fn == null)
return false;
if(type=="unload") {
// call later when cleanup is called. don't hook up
this._registry.push({obj:obj, type:type, fn:fn, useCapture:useCapture});
return true;
}
var realType = type=="_unload"?"unload":type;
obj.addEventListener(realType, fn, useCapture);
this._registry.push({obj:obj, type:type, fn:fn, useCapture:useCapture});
return true;
},
cleanup:function() {
for(var i = 0; i < EventMgr._registry.length; i++) {
with(EventMgr._registry[i]) {
if(type=="unload")
fn();
else {
if(type=="_unload") type = "unload";
obj.removeEventListener(type,fn,useCapture);
}
}
}
EventMgr._registry = null;
}
};
if( homepage == location.href.replace(/[?#].*/, '') )
configure( matchers );
process_links( matchers );
function configure( matchers )
{
try{
var form = $( 'config' ), table, i, m, a, icon;
if( form )
{
if( gave_fav )
icon = gave_fav;
else if( !(icon = test_link( test_url, matchers )) )
icon = def_icon;
table =