/* 
	Prototype-based unobtrusive CSS menus (menus themselves are CSS rendered, behaviors for attaching to objects is handled here.
	Will reset rollover.js rollover states on menu close.
	Must attach to IMG tags only at this time.
	Author: Craig Waterman
*/

var g_PE = false;
var g_activeMenu = null;
var g_activeImage = null;
var obscureSelects = false;
var unObscureSelects = false;
var menuSpeed = .01;

if (Element) {

	Event.observe(window, "resize", function() {	
		positionMenus();
	});

	Event.observe(window, "load", function() {
		
		positionMenus();
	
		var subs = document.getElementsByClassName("sub");
		for (var idx=0; idx < subs.length; idx++) {
			tSub = $(subs[idx]);
			if (tSub.tagName == 'LI') {
				tDescs = tSub.immediateDescendants();
				for (var idxi = 0; idxi < tDescs.length; idxi++) {
					tDesc = $(tDescs[idxi]);
					if (tDesc.tagName == 'UL') {
						tDesc.observe("mouseover", function() { g_PE.stop(); });
						tDesc.observe("mouseout", hideMenu.bindAsEventListener(hideMenu));
					}
				}
			}
		}

	});
} else {
	alert("You must have prototype loaded before calling this script.");
}

function positionMenus() {
	var anchors = document.getElementsByClassName("menuanchor");
		
	for (var idx=0; idx < anchors.length; idx++) {
		tAnchor = $(anchors[idx]);
		tMenu = $(tAnchor.id + '_items');
		
		// only bother setting events if the menu actually exists.
		if (tMenu) {
	
			// Move menus to the appropriate locations.
			tPos = Position.positionedOffset(tAnchor);
			tHeight = tAnchor.getHeight();
			tMenu.setStyle({marginLeft : tPos[0]+"px", marginTop : tPos[1]+tHeight+"px"});	// bottom-left alignment. Robust? No, not really.
			tMenu.observe("mouseover", hoverMenu.bindAsEventListener(hoverMenu));
			tMenu.observe("mouseout", hideMenu.bindAsEventListener(hideMenu));

			// Anchor events.
			tAnchor.observe("mouseover", showMenu.bindAsEventListener(showMenu));
			tAnchor.observe("mouseout", hideMenu.bindAsEventListener(hideMenu));
	
		}
	}
	
}

function hoverMenu(e) {
	if (Element) {
		if (g_PE) {
			g_PE.stop();
		}
	}
}

function showMenu(e) {
	if (Element) {
		var oe = $(Event.element(e));
		
		if (obscureSelects) { obscureSelects(); }
		
		// reset PEs here.
		if (g_PE) {
			g_PE.stop();
		}
	
		if (g_activeMenu) {
			if (g_activeMenu.id != oe.id + '_items') {
				resetMenu();
			}
		}
	
		g_activeImage = oe;
		g_activeMenu = $(oe.id + '_items');
	
		g_activeMenu.removeClassName('hide');
		oe.src = oe.getAttribute("srcOver");
		oe.setAttribute("menuOpen", "open");
	}
}

function hideMenu(e) {
	if (Element) {

		if (g_PE) {
			g_PE.stop();
			g_PE = null;
		}
	
		g_PE = new PeriodicalExecuter(function(pe) { resetMenu();pe.stop(); }, menuSpeed);

	}
}

function resetMenu() {
	if (Element) {

		if (g_activeMenu) {
			g_activeMenu.addClassName('hide');
			g_activeMenu = null;
	
			g_activeImage.src = g_activeImage.getAttribute("srcNorm");
			g_activeImage.setAttribute("menuOpen", "closed");
			g_activeImage = null;
	
		}
	
		if (unObscureSelects) { unObscureSelects(); }
	
	
		g_PE.stop();

	}
}