function addEvent(elm, evType, fn, useCapture) {
// cross-browser event handling for IE5+, NS6+ and Mozilla/Gecko
// By Scott Andrew
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType] = fn;
	}
}

function ascendDOM(e, target) {
// climb up the tree to the supplied tag.
	while (e.nodeName.toLowerCase() != target && e.nodeName.toLowerCase() != 'html')
		e = e.parentNode;
	return (e.nodeName.toLowerCase() == 'html') ? null : e;
}

function hi_cell(e) {
// turn on highlighting
	var el;
	if (window.event && window.event.srcElement)
		el = window.event.srcElement;
	if (e && e.target)
		el = e.target;
	if (!el) return;
	var parent_row = ascendDOM(el, 'tr');
	if (parent_row == null) return;
	var parent_body = ascendDOM(parent_row, 'tbody');
	if (parent_body == null) return;
	parent_row.className = parent_body.className.replace(/hi/, 'lo');
}

function lo_cell(e) {
// turn off highlighting
	var el;
	if (window.event && window.event.srcElement)
		el = window.event.srcElement;
	if (e && e.target)
		el = e.target;
	if (!el) return;
	var parent_row = ascendDOM(el, 'tr');
	if (parent_row == null) return;
	parent_row.className = "";
}

function addListeners() {
	if (!document.getElementsByTagName) return;
	var all_cells = document.getElementsByTagName('tr');
	for (var i = 0; i < all_cells.length; i++) {
		addEvent(all_cells[i], 'mouseover', hi_cell, false);
		addEvent(all_cells[i], 'mouseout', lo_cell, false);
	}
}

addEvent(window, 'load', addListeners, false);
