// Base256Menus
// Copyright (c) 2007 Ralph C. Henderson, All Rights Reserved
//
// A perpetual, non-exclusive, and non-transferrable license is hereby
// granted to Primate Rescue Center for use solely on the primaterescue.org
// domain. Modification, reproduction, or any other use in whole or in part
// is forbidden. 
//
// Excluded is the absXY(node) function, which is released into 
// public domain; the code employed in absXY(node) may be freely copied,
// modified, and used elsewhere.
//
// 26-Sep-2007
//
// Contact URL: www.base256.com/contact.php

// Public Domain Code Begins Here.
function absXY(node) {
	if (node.x || node.y) return [node.x, node.y];
	var left = node.offsetLeft;
	var top = node.offsetTop;
	while (node = node.offsetParent) {
		if (node.clientLeft || node.clientTop) {
			left += node.offsetLeft + node.clientLeft;
			top += node.offsetTop + node.clientTop;
		} else {
			left += node.offsetLeft;
			top += node.offsetTop;
		}
	}
	return [left, top];
}
// Public Domain Code Ends Here.

function b256MouseOverTrap(trap, enclosureID, triggerID, triggerTRBLInsets, overlayURL, overlayX, isCurrentSupersection) {
	document.b256RetainerID = trap.id;
	if (document.b256ActiveMenuID && document.b256ActiveMenuID==trap.b256MenuID) return;
	var tNode = document.getElementById(triggerID);
	if (tNode.b256TrapID == trap.id) {
		tNode.style.visibility = 'visible';
		return;
	}
	tNode.b256TrapID = trap.id;
	if (!trap.b256OverlayURL) {
		trap.b256OverlayURL = overlayURL;
		trap.b256OverlayX = overlayX;
		trap.b256IsCurrentSupersection = isCurrentSupersection;
		var idStem = trap.id.substr(0, trap.id.lastIndexOf('-'));
		trap.b256MenuID = idStem + '-menu';
		trap.b256TriggerID = triggerID;
		trap.b256EnclosureID = enclosureID;
	}
	var trapXY = absXY(trap);
	tNode.style.visibility = "hidden";
	tNode.style.width = (trap.offsetWidth - triggerTRBLInsets[1] - triggerTRBLInsets[3]) + 'px';
	tNode.style.height = (trap.offsetHeight - triggerTRBLInsets[0] - triggerTRBLInsets[2]) + 'px';
	tNode.style.left = (trapXY[0] + triggerTRBLInsets[1]) + 'px';
	tNode.style.top = (trapXY[1] + triggerTRBLInsets[0]) + 'px';
	tNode.style.visibility = "visible";
}
function b256MouseOverTrigger(tNode) {
	var hNode = document.getElementById(tNode.b256TrapID);
	document.b256RetainerID = tNode.id;
	if (document.b256ActiveMenuID == hNode.b256MenuID) {
		return;
	}
	var mNode  = document.getElementById(hNode.b256MenuID);
	if (!mNode) return;
	document.b256TriggeredMenuID = mNode.id;
	mNode.b256TrapID = hNode.id;
	
	var enclosure = document.getElementById(hNode.b256EnclosureID);
	var absXYHNode = absXY(hNode);
	var absXYENode = absXY(enclosure);
	var xMNode = absXYHNode[0] + ((hNode.offsetWidth - mNode.offsetWidth) / 2);
	if (xMNode+mNode.offsetWidth > absXYENode[0]+enclosure.offsetWidth)
		xMNode = absXYENode[0] + enclosure.offsetWidth - mNode.offsetWidth;
	if (xMNode < absXYENode[0]) xMNode = absXYENode[0];
	mNode.style.left = xMNode + "px";
	mNode.style.top = (absXYHNode[1] + enclosure.offsetHeight) + "px";
	b256MenuUpdateRequest();
}
function b256MouseOverMenu(mNode) {
	document.b256RetainerID = mNode.id;
}
function b256MouseOut(tNode) {
	if (document.b256TriggeredMenuID==tNode.b256MenuID)
		document.b256TriggeredMenuID = "";
	if (document.b256RetainerID==tNode.id)
		document.b256RetainerID = "";
	b256MenuUpdateRequest();
}
// Must be triggered by body onUnload
function b256AbortMenu() {
	document.b256RetainerID = "";
	document.b256TriggeredMenuID = "";
	b256MenuUpdate();
}
function b256MenuUpdateRequest() {
	setTimeout("b256MenuUpdate()", 125);
}
function b256MenuUpdate() {
	var activeMenuID = document.b256ActiveMenuID;
	var trap;
	var retainer;
	var menu;
	if (activeMenuID && !document.b256TriggeredMenuID && document.b256RetainerID)
		return;
	if (activeMenuID && (document.b256TriggeredMenuID || !document.b256RetainerID)) {
		menu = document.getElementById(activeMenuID);
		menu.style.visibility = "hidden";
		document.b256ActiveMenuID = "";
		trap = document.getElementById(menu.b256TrapID);
		if (!trap.b256IsCurrentSupersection) trap.style.backgroundImage = '';
		document.b256ActiveMenuID = '';
	}
	if (document.b256TriggeredMenuID && (document.b256TriggeredMenuID != activeMenuID)) {
		menu = document.getElementById(document.b256TriggeredMenuID);
		menu.style.visibility = "visible";
		trap = document.getElementById(menu.b256TrapID);
		if (!trap.b256IsCurrentSupersection) {
			trap.style.backgroundPosition = -(trap.b256OverlayX) + 'px ' + -(trap.offsetHeight) + 'px';
			trap.style.backgroundImage = 'url('+trap.b256OverlayURL+')';
		}
		document.b256ActiveMenuID = document.b256TriggeredMenuID;
		document.b256TriggeredMenuID = "";
		(document.getElementById(trap.b256TriggerID)).style.visibility = 'hidden';
	}
}
