var openOverlayId = null;
var overlayInit = false;
var isShift = false;
var inFocus = null;

// window.onload is redefined later, so handle init differently
function ensureInit() {
	if( ! overlayInit && (document && document.body)) {
		// Auto-hide open overlay
		document.body.onmousedown = autoHide;
		// For tabbing over links logic
		document.onkeyup = handleTab;
		document.onkeypress = noteShift;
		// Init complete
		overlayInit = true;
	}
}

function showOverlay(divId) {
	ensureInit();
	if (openOverlayId != null) {	// Close open overlay
		hideOverlay(openOverlayId);
		openOverlayId = null;
	}
	var d = document.getElementById(divId);
	d.style.display = 'block';
	openOverlayId = divId;
}

function hideOverlay(divId) {
	ensureInit();
	var d = document.getElementById(divId);
	d.style.display = 'none';
	openOverlayId = null;	
}

function toggleOverlay(divId) {
	ensureInit();

	var d = document.getElementById(divId);
	var s = d.style.display;
	d.style.display = (!s || s=='none') ? 'block' : 'none';
	openOverlayId = divId;
	return false;
}


function autoHide(e) {
	ensureInit();
	
	if (openOverlayId == null) {
		return;	// Nothing to do
	}
	
	if (!e) {
		e = window.event;
	}
	
	var trg;
	if (e.target) {
		trg = e.target;
	} else if (e.srcElement) {
		trg = e.srcElement;
	}

	if (trg.nodeType == 3) {// defeat Safari bug
		trg = trg.parentNode;
	}
	
	var inOpenOverlay = false;
	var n = trg;
	while (n) {
		if (n.id && n.id == openOverlayId) {
			inOpenOverlay = true;
			break;
		}
		if (n.id && n.id == 'tab'+openOverlayId) {
			return;	// Nothing to do
		}
		n = n.parentNode;
	}

	if ( ! inOpenOverlay) {
		hideOverlay(openOverlayId);
	}
}

// Capture the focused element
function foc(oid) {
	ensureInit();
	inFocus = oid;
}

function blr() {
	inFocus = null;
}

	
function tabIn(ovrlyId) {
	// Is the shift key being held?
	var shft = (window.event) ? window.event.shiftKey : isShift;

	if (shft && openOverlayId != null) {
		// We're tab+shifting backwards, do nothing
		return;
	}
	
	// Reveal the overlay
	openOverlayId = ovrlyId;
	showOverlay(ovrlyId);
	
	if (shft) // Move the focus to last link
		moveFocus(ovrlyId, shft);
}

function moveFocus(oid, lastLink) {
	var e = document.getElementById(oid);
	var obj = find_link(e.childNodes, lastLink);
	if (obj) {
		obj.focus();
	}
}
	
function find_link(nList, useLast) {
	for (var i = 0; i < nList.length; i++) {
		var n = nList[i];
		
		// Looking for LI then A
		if (n.tagName && n.tagName.toLowerCase()=='li') {
			if (useLast) {
				// Move to last LI element
				for (var j = i+1; j < nList.length; j++) {
					var n2 = nList[j];
					if (n2.tagName && n2.tagName.toLowerCase()=='li') {
						n = n2;
					}
				}
			}
			return n.childNodes[0];	// Should be a <A>
		}
		
		if (n.childNodes) {
			var e = find_link(n.childNodes, useLast);
			if (e) {
				return e;
			}
		}
	}
	return null;
}

// Handles the keyboard tab event
function handleTab(evt) {
	if (! evt)	// IE
		evt = window.event;
	evt.returnValue = true;
	
	// 9 = TAB; all we care about
	if (evt.keyCode != 9)
		return;
	
	if (openOverlayId == null) {
		if (inFocus)
			tabIn(inFocus);
	}
	else {
		var t;
		if (evt.target)
			t = evt.target;
		else if (evt.srcElement)
			t = evt.srcElement;
		
		// Defeat Safari bug
		if (t.nodeType == 3)
			t = t.parentNode;
			
		var doClose = true;
		while (t) {
			if (t.id == 'tab'+openOverlayId) {
				doClose = false;
				break;
			}
			t = t.parentNode;
		}
		
		if (doClose) {
			hideOverlay(openOverlayId);
		}
	}
}
	
function noteShift(evt) {
	if (! evt)
		evt = window.event;
	
	if (evt.modifiers)	// Firefox
		isShift = evt.modifiers & Event.SHIFT_MASK;
	else if (evt.shiftKey)	// IE
		isShift = evt.shiftKey;
	else
		isShift = false;
}
