///////////////////////////////////////////////////////////////////////////////
// File: menubar.js
// Desc: a menubar with a nice interface in for adding items.
//       new addition: submenus
//       new addition: item 0 is for a context menu
///////////////////////////////////////////////////////////////////////////////

document.onmouseover = HideMenu;

var mItemCaps = new Array();  // 2D array of menu item labels 
var mItemLnks = new Array();  // 2D array of links 
var mItemTgts = new Array();  // 2D array of hrefs
var mItemClrs = new Array();  // 2D array of colors for the labels
var mItemIcos = new Array();  // 2D array of images next to the label
var mItemIcSs = new Array();  // 2D array of highlight images next to the label

var mCapLnks   = new Array();  // array of links for the menu-labels
var mItemCount = new Array(); // array of item counts for each menu set
var mCapImg    = new Array(); // array of captions (images) at the menubar level
var mCapImH    = new Array(); // array of highlight captions at the menubar level
var mCapNdxs   = new Array(); // array of used indexes

var mCapCount     = 0;		  // total count of menu sets

// initialization for context menu arrays
mItemCaps[0] = new Array();
mItemLnks[0] = new Array();
mItemTgts[0] = new Array();
mItemClrs[0] = new Array();
mItemIcos[0] = new Array();
mItemIcSs[0] = new Array();
mItemCount[0] = 0;

// this is the item that was right clicked upon, which is needed in order
// to do something worthwhile with a context menu selection.
var CtxtSrcEle;

// these 2 change based on the size of the root (CAP) image
var mCapTopOff = 15;
var mCapLeftOff = 0;

var bIsIE4 = ((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4 ));



///////////////////////////////////////////////////////////////////////////////
// Function: WriteMenuStart
// Desc: start a menu item set. Initializes the arrays for this set,
//       and writes out the image with the event handlers to show the menu.
///////////////////////////////////////////////////////////////////////////////
function WriteMenuStart(nIndex, sCapImg, sCapHlImg, sCapLink) {

	mItemCaps[nIndex] = new Array();
	mItemLnks[nIndex] = new Array();
	mItemTgts[nIndex] = new Array();
	mItemClrs[nIndex] = new Array();
	mItemIcos[nIndex] = new Array();
	mItemIcSs[nIndex] = new Array();

	mCapCount++;
	mCapNdxs[mCapCount-1] = nIndex;
	mCapLnks[mCapCount-1] = sCapLink;
	
	mCapImg[nIndex] = sCapImg;
	mCapImH[nIndex] = sCapHlImg;	
	mItemCount[nIndex] = 0;
	
	document.write('<a href="' + sCapLink + '" onmouseover="ShowMenu(' + nIndex + '); window.event.cancelBubble = true;');
	if ( sCapHlImg.length > 0 ) {
		document.write('document.all(\'CAP' + nIndex + '\').src=\'' + sCapHlImg + '\';"');
		document.write(' onmouseout="document.all(\'CAP' + nIndex + '\').src=\'' + sCapImg + '\';');
	}
	document.write('">');
	
	document.write('<img align=top border=0 id="CAP' + nIndex + '" src="' + sCapImg + '">');
	document.write('</a>');
	
}

///////////////////////////////////////////////////////////////////////////////
// Function: AddMenuItem
// Desc: add one menu item to a predefined menu set. this just saves the
//       information off until AddMenuComplete is called.
///////////////////////////////////////////////////////////////////////////////
function AddMenuItem(nIndex, sCaption, sLink, sTarget, sColor) {
	var max = mItemCount[nIndex];
		
	mItemCaps[nIndex][max] = sCaption;
	mItemLnks[nIndex][max] = sLink;
	mItemTgts[nIndex][max] = sTarget;
	mItemClrs[nIndex][max] = sColor;

	// optional icon and highlight icon
	if ( arguments.length > 5 ) mItemIcos[nIndex][max] = arguments[5];
	else mItemIcos[nIndex][max] = "";

	if ( arguments.length > 6 ) mItemIcSs[nIndex][max] = arguments[6];
	else mItemIcSs[nIndex][max] = "";
	
	mItemCount[nIndex]++;
	
	
}

///////////////////////////////////////////////////////////////////////////////
// Function: AddSubMenu
// Desc: define a sub-menu menu set as a child group of an existing item.
//		 saves the information off until AddMenuComplete is called.
///////////////////////////////////////////////////////////////////////////////
function AddSubMenu(nIndex, sCaption, sLink, sTarget, sColor) {

	// standard menu item code (same as above)
	
	var max = mItemCount[nIndex];
		
	mItemCaps[nIndex][max] = sCaption;
	mItemLnks[nIndex][max] = sLink;
	mItemTgts[nIndex][max] = sTarget;
	mItemClrs[nIndex][max] = sColor;

	// optional icon and highlight icon
	if ( arguments.length > 5 ) mItemIcos[nIndex][max] = arguments[5];
	else mItemIcos[nIndex][max] = "";

	if ( arguments.length > 6 ) mItemIcSs[nIndex][max] = arguments[6];
	else mItemIcSs[nIndex][max] = "";
	
	mItemCount[nIndex]++;		
	
	// submenu specific code. a submenu index is the parent index * 100 + child index.
	
	nIndex = (nIndex * 100) + max;
	
	mItemCaps[nIndex] = new Array();
	mItemLnks[nIndex] = new Array();
	mItemTgts[nIndex] = new Array();
	mItemClrs[nIndex] = new Array();
	mItemIcos[nIndex] = new Array();
	mItemIcSs[nIndex] = new Array();

	mCapCount++;
	mCapNdxs[mCapCount-1] = nIndex;
	
	mCapImg[nIndex] = '';
	mCapImH[nIndex] = '';	
	mItemCount[nIndex] = 0;
	
	return nIndex;
}

///////////////////////////////////////////////////////////////////////////////
// Function: AddSubMenuItem
// Desc: define a sub-menu menu item.
///////////////////////////////////////////////////////////////////////////////
function AddSubMenuItem(nSubIndex, sCaption, sLink, sTarget, sColor) {
	var max = mItemCount[nSubIndex];

	mItemCaps[nSubIndex][max] = sCaption;
	mItemLnks[nSubIndex][max] = sLink;
	mItemTgts[nSubIndex][max] = sTarget;
	mItemClrs[nSubIndex][max] = sColor;

	// optional icon and highlight icon
	if ( arguments.length > 5 ) mItemIcos[nSubIndex][max] = arguments[5];
	else mItemIcos[nSubIndex][max] = "";

	if ( arguments.length > 6 ) mItemIcSs[nSubIndex][max] = arguments[6];
	else mItemIcSs[nSubIndex][max] = "";
	
	mItemCount[nSubIndex]++;
}

///////////////////////////////////////////////////////////////////////////////
// Function: AddCtxtMenuItem
// Desc: define a context menu item.
///////////////////////////////////////////////////////////////////////////////
function AddCtxtMenuItem(sCaption, sLink, sTarget, sColor) {
	
	var nSubIndex = 0;
	
	var max = mItemCount[nSubIndex];

	mItemCaps[nSubIndex][max] = sCaption;
	mItemLnks[nSubIndex][max] = sLink;
	mItemTgts[nSubIndex][max] = sTarget;
	mItemClrs[nSubIndex][max] = sColor;

	// optional icon and highlight icon
	if ( arguments.length > 4 ) mItemIcos[nSubIndex][max] = arguments[4];
	else mItemIcos[nSubIndex][max] = "";

	if ( arguments.length > 5 ) mItemIcSs[nSubIndex][max] = arguments[5];
	else mItemIcSs[nSubIndex][max] = "";
	
	mItemCount[nSubIndex]++;
}


///////////////////////////////////////////////////////////////////////////////
// Function: AddMenuComplete
// Desc: end of definitions. write out the actual HTML for our menus
///////////////////////////////////////////////////////////////////////////////
function AddMenuComplete() {
	var s;
	var nIndex;
	
	// add the submenu menubox span
	document.write('<span class="menubox" ID="menubox0" style="z-index: 10" onmouseover="window.event.cancelBubble = true;"></span>');
	
		
	for ( var j = 0; j < mCapCount; j++ ) {
		nIndex = mCapNdxs[j];
				
		// add the menubox span
		document.write('<span class="menubox" ID="menubox' + nIndex + '" onmouseover="window.event.cancelBubble = true;"></span>');

		// create the table that is the menu dropdown
		s = '<table class="menutable" cellpadding=0 cellspacing=0>'
		for ( var i = 0; i < mItemCount[nIndex]; i++ ) {
			var nSubmenuNdx = (nIndex*100)+i;
			if ( mItemCount[nSubmenuNdx] > 0 )  { // ( nIndex < 100 ) && 
								
				// one of our submenu items
				s = s + '<tr><td id="MTD' + nIndex + '_' + i + '" class="min">';
				s = s + '<a href="' + mItemLnks[nIndex][i] + '"';
				
				// add target if exists
				if ( mItemTgts[nIndex][i].length > 0 ) {
					s = s + ' target="' + mItemTgts[nIndex][i] + '"';
				}				
				s = s + '">'
				
				
				s = s + '<div class=MDIV onmouseover=\'MISwap(' + nIndex + ', true, ' + i + '); ShowSubmenu(' + nSubmenuNdx + ');\' onmouseout=\'MISwap(' + nIndex + ', false, ' + i + ');\'>';

				if ( mItemIcos[nIndex][i].length > 0 ) {
					s = s + '<img id="MIMG' + nIndex + '_' + i + '" border=0 src="' + mItemIcos[nIndex][i] + '"> ';
				}

				s = s + '<font color="' + mItemClrs[nIndex][i] + '">' + mItemCaps[nIndex][i] + '</font>';
				s = s + '</div></a></td></tr>';
			}
			else {
				// standard menu item
				s = s + '<tr><td id="MTD' + nIndex + '_' + i + '" class="min">';
				s = s + '<a href="' + mItemLnks[nIndex][i] + '"';
				
				// add target if exists
				if ( mItemTgts[nIndex][i].length > 0 ) {
					s = s + ' target="' + mItemTgts[nIndex][i] + '"';
				}				
				s = s + '">'
				
				
				
				s = s + '<div class=MDIV onmouseover=\'MISwap(' + nIndex + ', true, ' + i + ');';
				
				if ( nIndex < 100 ) {
					s = s + ' HideSubMenu();';
				}
				
				s = s + '\' onmouseout=\'MISwap(' + nIndex + ', false, ' + i + ');\'>';

				if ( mItemIcos[nIndex][i].length > 0 ) {
					s = s + '<img id="MIMG' + nIndex + '_' + i + '" border=0 src="' + mItemIcos[nIndex][i] + '"> ';
				}

				s = s + '<font color="' + mItemClrs[nIndex][i] + '">' + mItemCaps[nIndex][i] + '</font>';
				s = s + '</div></a></td></tr>';
			}
		}
		s = s + '</table>';
		document.all("menubox" + nIndex).innerHTML = s;

		var hgt = mItemCount[nIndex] * 18;
		if ( hgt < 300 ) {
			document.all("menubox" + nIndex).style.height = hgt;
		}
		else {
			document.all("menubox" + nIndex).style.height = 300;
			document.all("menubox" + nIndex).style.overflowY = "scroll";
		}
	}
	
	// ugly. now we have to do the same thing for the context item (if it exists)
	if ( mItemCount[0] > 0 ) {
		
		nIndex = 0; // default value for context menu
		
		// set up the handlers that will show the context menu
		// this works but sets the contect menu over the entire page.
		//document.oncontextmenu = ShowCtxtMenu;
				
		// create the table that is the context menu dropdown
		s = '<table class="menutable" cellpadding=0 cellspacing=0>'
		for ( var i = 0; i < mItemCount[nIndex]; i++ ) {
			// standard menu item
			s = s + '<tr><td id="MTD' + nIndex + '_' + i + '" class="min">';
			s = s + '<a href="' + mItemLnks[nIndex][i] + '"';

			// add target if exists
			if ( mItemTgts[nIndex][i].length > 0 ) {
				s = s + ' target="' + mItemTgts[nIndex][i] + '"';
			}				
			s = s + '">'

			
			s = s + '<div class=MDIV onmouseover=\'MISwap(' + nIndex + ', true, ' + i + ');\' onmouseout=\'MISwap(' + nIndex + ', false, ' + i + ');\'>';

			if ( mItemIcos[nIndex][i].length > 0 ) {
				s = s + '<img id="MIMG' + nIndex + '_' + i + '" border=0 src="' + mItemIcos[nIndex][i] + '"> ';
			}

			s = s + '<font color="' + mItemClrs[nIndex][i] + '">' + mItemCaps[nIndex][i] + '</font>';
			s = s + '</div></a></td></tr>';
		}
		s = s + '</table>';
		document.all("menubox" + nIndex).innerHTML = s;

		var hgt = mItemCount[nIndex] * 18;
		if ( hgt < 300 ) {
			document.all("menubox" + nIndex).style.height = hgt;
		}
		else {
			document.all("menubox" + nIndex).style.height = 300;
			document.all("menubox" + nIndex).style.overflowY = "scroll";
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// Function: MISwap
// Desc: highlight/unhighlight the moused over row
///////////////////////////////////////////////////////////////////////////////
function MISwap(nIndex, bOn, i) {
	if ( bOn ) {
		document.all("MTD" + nIndex + "_" + i).className = "mis";

		if ( mItemIcSs[nIndex][i].length > 0 ) {
			document.all("MIMG" + nIndex + "_" + i).src = mItemIcSs[nIndex][i];
		}
	}
	else {
		document.all("MTD" + nIndex + "_" + i).className = "min";

		if ( mItemIcos[nIndex][i].length > 0 ) {
			document.all("MIMG" + nIndex + "_" + i).src = mItemIcos[nIndex][i];
		}
	}
}


///////////////////////////////////////////////////////////////////////////////
// Function: ShowCtxtMenu
// Desc: show the context menu
///////////////////////////////////////////////////////////////////////////////
function ShowCtxtMenu() {

	HideMenu();

	var nTop  = event.y + document.body.scrollTop;
	var nLeft = event.x + document.body.scrollLeft;
	
	// save off the source element that was right-clicked on
	CtxtSrcEle = event.srcElement;

	var mnu = document.all("menubox0");
	try {
		mnu.style.top = nTop;
		mnu.style.left = nLeft;
		mnu.style.display = "block";
	} catch (err) {}

	return false;
}

///////////////////////////////////////////////////////////////////////////////
// Function: ShowSubmenu
// Desc: show a particular submenu
///////////////////////////////////////////////////////////////////////////////
function ShowSubmenu(nIndex) {

	// hide any existing ones first
	HideSubMenu(nIndex);
	
	//alert(nIndex);
	
	// get the position of the div we are over to set the menu position
	var obj = document.all("MTD" + nIndex);
	
	var nParent = parseInt(nIndex/100);
	var nParentItem = nIndex - (nParent*100);
		
	var nTop  = parseInt(document.all("menubox" + nParent).style.top) + (nParentItem * 18);
	var nLeft = parseInt(document.all("menubox" + nParent).style.left) + 160;

	//alert(nParent + "," + nParentItem + "," + nTop + "," + nLeft);

	var mnu = document.all("menubox" + nIndex);
	try {
		mnu.style.top = nTop;
		mnu.style.left = nLeft;
		mnu.style.display = "block";
	} catch (err) {}
}

///////////////////////////////////////////////////////////////////////////////
// Function: ShowMenu
// Desc: show the given menu set
///////////////////////////////////////////////////////////////////////////////
function ShowMenu(nIndex) {
		
	HideMenu();
	
	// get the position of the image we are over to set the menu position
	
	var obj = document.all("CAP" + nIndex);
	var nTop  = mCapTopOff;
	var nLeft = mCapLeftOff;
	
	for (;;) {
		nTop  += parseInt(obj.offsetTop);
		nLeft += parseInt(obj.offsetLeft);

		//alert(obj.tagName + ": " + parseInt(obj.offsetTop) + "," + parseInt(obj.offsetLeft));

		obj = obj.offsetParent;
		if ( obj.tagName == "BODY" ) break;		
	}	
	
	// now set the position and show
	//alert(nTop + "," + nLeft);

	var mnu = document.all("menubox" + nIndex);
	try {
		mnu.style.top = nTop;
		mnu.style.left = nLeft;
		mnu.style.display = "block";
	} catch (err) {}
}


///////////////////////////////////////////////////////////////////////////////
// Function: HideMenu
// Desc: hide all menus
///////////////////////////////////////////////////////////////////////////////
function HideMenu() {
	var nIndex;
	for ( var j = 0; j < mCapCount; j++ ) {
		nIndex = mCapNdxs[j];

		var mnu = document.all("menubox" + nIndex);
		try {
			mnu.style.display = "none";
		} catch (err) {}
	}
	//HideSubMenu();
	try {
	menubox0.style.display = "none";	
	} catch(err) {}
}

///////////////////////////////////////////////////////////////////////////////
// Function: HideSubMenu
// Desc: hide all menus within a certain range
///////////////////////////////////////////////////////////////////////////////
function HideSubMenu() {
	
	// context menu
	try {
	menubox0.style.display = "none";
	} catch(err) {}

	
	var nWhichMax = 100;
	if ( arguments.length > 0 ) {
		
		// note. this could be done better. if you want even more levels
		// then you will need to add another check here with 2 more zeros.
		// much depper than that and the values will probably start overflowing.
		
		if ( arguments[0] > 1000000 ) {
			nWhichMax = 1000000;
		}
		else {
			if ( arguments[0] > 10000 ) {
				nWhichMax = 10000;
			}
		}
	}
	
	// submenus
	try {
	for ( var j = 0; j < mCapCount; j++ ) {
		var nIndex = mCapNdxs[j];		
		if ( nIndex > nWhichMax ) {
			document.all("menubox" + nIndex).style.display = "none";
		}
	}
	} catch(err) {}
	
}


