GoogleBoard

By Erik Goldman Last update Nov 1, 2006 — Installed 452 times.
// ==UserScript==
// @name          GoogleBoard
// @author	  Erik Goldman
// @namespace     ErikGoldman
// @description   Makes google result pages keyboard-navigable with j/k for up and down, and q/p for next and previous pages
// @include       http://www.google.com/search?*
// ==/UserScript==

var ixLink=-1;
var oOldLink=null;

var rgParagraphs = document.getElementsByTagName("p");

var rgoLinks=new Array();

var oNext;
var oPrev;
if(oNext = document.getElementById("nn"))
	oNext=oNext.parentNode;

if(oPrev = document.getElementById("np"))
	oPrev=oPrev.parentNode;

for(var i=0; i< rgParagraphs.length; ++i)
{
	var para = rgParagraphs[i];
	for(var j=0; j < para.childNodes.length; ++j)
	{
		if(para.childNodes[j].href)
		{
			rgoLinks.push(para.childNodes[j]);
		}
	}
}

function decorate(oLink)
{
	if(!oLink)
		return;

	oLink.focus();
	oLink.style.backgroundColor="#FF0000";
	if(oOldLink && oOldLink != oLink)
		oOldLink.style.backgroundColor="#FFFFFF";
	oOldLink = oLink;
}

document.addEventListener('keypress', 
	function(e){
		var keyNum;

		if(window.event) // IE
		{
			keyNum = e.keyCode;
		}
		else if(e.which)
		{
			keyNum = e.which;
		}

		var keyChar = String.fromCharCode(keyNum);

		if(keyChar == 'j')
		{
			if(ixLink < rgoLinks.length-1)
			{
				ixLink++;
			}
			decorate(rgoLinks[ixLink]);
		}
		else if(keyChar == 'k')
		{
			if(ixLink > 0)
			{
				ixLink--;
			}
			decorate(rgoLinks[ixLink]);
		}
		else if(keyChar == "p")
		{
			decorate(oNext);
		}
		else if(keyChar == "q")
		{
			decorate(oPrev);
		}

	}, true);