/* 
	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.
	Author: Craig Waterman
*/

var g_PE = false;
var g_activeMenu = null;
var g_activeImage = null;
var obscureSelects = false;
var unObscureSelects = false;
var menuSpeed = .1;

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.
			if (tMenu.hasClassName("horizontal")) {
				tPos = Position.cumulativeOffset(tAnchor);
				tHeight = tAnchor.getHeight();
				tWidth = tAnchor.getWidth();
				tMenu.setStyle({marginLeft : (tPos[0]+tWidth)+"px", marginTop : tPos[1]+"px"});	// bottom-left alignment. Robust? No, not really.
			} else {
				tPos = Position.cumulativeOffset(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();

	}
}
