SquirrelMail-ShortCuts

By phantomcircuit Last update May 9, 2007 — Installed 373 times.
// ==UserScript==
// @name         SquirrelMail-ShortCuts
// @description  Provides shortcuts in pair webmail.
// @include      http*://webmail*.pair.com/*
// @homepage     http://CovertInferno.Org
// ==/UserScript==

(function(){

// CONFIGURATION

  var alllinks = false;				//whether to add shotcuts to all links

//reserveKey(shortcut key,link text);
reserveKey('c',"Compose");
reserveKey('a',"Reply All");
reserveKey('c',"Camp");

// END CONFIGURATION


  var doc = document;
  var links = doc.getElementsByTagName('a');	//List all anchor elements (links)
  var n = links.length;				//Number of anchor elements (count links)
  var reserved = new Array();			//accesskeys reserved for use in user defined matches
  var used = '';				//accesskeys already in use
  var i = 0,z = 0;
  var e;
  var c;

for (i=0; i<reserved.length; i++)
{
	if(used.toUpperCase().indexOf(reserved[i][0].toUpperCase()) != -1)
	{
		continue;
	}

	re = new RegExp("^"+reserved[i][1]+"$");//Generate regular expression to match link text

	for(z=0;z<n;z++)
	{
		e = links[z];
		if(re.test(e.innerHTML))
		{
			setKey(e,reserved[i][0],reserved[i][1]);//Set accesskey and change link text to circled letter
			break;
		}
	}
}

if(alllinks)
{
	for(i=0;i<n;i++)
	{
		e = links[i];
		c = String(e.innerHTML).substr(0,1);
		if ((used.toUpperCase().indexOf(c.toUpperCase()) == -1)&&(reserveKey(c,e.innerHTML)))//Make sure its not in use or reserved (reserveKey fails if the key is already reserved)
		{
			setKey(e, String(e.innerHTML).substr(0,1),e.innerHTML);
		}
	}
}

/* @name setKey
 * @description sets accesskey attribute for anchors and changes first letter of link text to a circled letter
 */

function setKey(elm, key, txt)
{
	var c ='';
	var offset = 0;

	if(used.toUpperCase().indexOf(key.toUpperCase())!=-1)//Make sure accesskeys don't get used twice
	{
		alert("ERROR: Script misconfigured, accesskey used more than once.");
	}
	else
	{
		elm.accessKey = key;// Sets the accesskey

		used += key;//Add to list of used keywords

		if((offset = txt.toUpperCase().indexOf(key)) == -1)//Finds the accesskey
		{
			c1 = txt[0];//If the accesskey is not found use the first letter
		}
		else
		{
			c1 = txt[offset];//Pull out the accesskey
		}

//parseInt('HEX',16) converts hexidecimal to base 10

		if (c1.match(/[0-9]/))//Check to see if the first character is a number
		{
			decval = parseInt('2460', 16) + parseInt(c1) - 1;// Offsets to circled numbers
		}
		else if (c1.match(/[A-Z]/))//Check to see if the first character is a letter
		{
			decval = parseInt('24B6', 16) + c1.charCodeAt(0) - 65;// Offsets to uppercase circled letters
		}
		else if (c1.match(/[a-z]/))//Check to see if the first character is a letter
		{
			decval = parseInt('24B6', 16) + c1.charCodeAt(0) - 97 + 26;// Offsets to lowercase circled letters
		}
		c2 = '&#x' + decval.toString(16) + ';';//Convert from base 10 to hexidecimal

		if(offset == -1)
		{
			elm.innerHTML = c2 + txt.substring(1);
		}
		else
		{
			txt = txt.substr(0,offset) + txt.substr(offset,1).replace(c1,c2) + txt.substr(offset+1,txt.length);//reconstruct string
			elm.innerHTML = txt;// Set the link text to the modified text
		}
		
	}
}

/* @name reserverKey
 * @description reserves an accesskey for a specific link based on link text
 */

function reserveKey(key,txt)
{
	/*
	for(i=0;i<reserved.length;i++)//check if accesskeyhas already been reserved
	{
		if(reserved[i][1] == key.toUpperCase())
		{
			return false;
		}
	}
	*/
	reserved.push(Array(key.toUpperCase(),txt));//add key and link text to the reserved list
	return true;
}

})();