Event.DOMReady(prepareRolloverMenus);

function prepareRolloverMenus(){
	var menus = Document.getElementsByClassMatch("JS:RolloverMenu");	
	menus.each(RollOverMenu);
}

function RollOverMenu(element){
	if(! element.init){
		element.state = "normal";
		element.original_title = (element.original_title) ? element.original_title : element.title;
		// remove title
		var tag = element;
		while(tag.tagName.toLowerCase() != "body"){
			if(tag.tagName.toLowerCase() == "a"){
				tag.setAttribute("title", ""); // fixes firefox alt breaker bug
				break;
			}
			tag = tag.parentNode;
		}
	}
	var parameters = Document.getArguments(element, "JS:RolloverMenu");
	var rolloverId = parameters[0];
	var type = (parameters[1] != "vertical" ) ? "horizontal" : "vertical";
	var align = parameters[2];
	var extraX = (parameters[3]) ? parameters[3] : 0;
	var extraY = (parameters[4]) ? parameters[4] : 0;
	var rollover = document.getElementById(rolloverId);
	if(! rollover){
		return;
	}
	if(type == "horizontal"){
		RollOverMenu.setHorizontalMenu(rollover, element, align, extraX, extraY);
	}
	else{
		RollOverMenu.setVerticalMenu(rollover, element, align, extraX, extraY);
	}
	if(! element.init){
		RollOverMenu.setChildren(rollover);
		rollover.trigger = element;
		var totalHeightPadding = Number( Document.getStyle(rollover, "padding-top").replace("px", "") ) + Number( Document.getStyle(rollover, "padding-bottom").replace("px", "") );
		rollover.originalHeight = rollover.offsetHeight - totalHeightPadding;
		Event.addEvent(element, "mouseover", RollOverMenu.show);
		Event.addEvent(window, "resize", RollOverMenu.resetTimer);
		element.init = true;
	}
}


var RollOverMenuResizeTimer = 0;
RollOverMenu.resetTimer = function(evt){
	if(RollOverMenuResizeTimer){
		clearTimeout(RollOverMenuResizeTimer);
	}
	RollOverMenuResizeTimer = setTimeout(RollOverMenu.resetCoords, 500);
}
RollOverMenu.resetCoords = function(evt){
	prepareRolloverMenus();
}
RollOverMenu.setHorizontalMenu = function(rollover, caller, align, extraX, extraY){
	var callerX = Document.getX(caller);
	var callerWidth = caller.offsetWidth;
	var callerFarX = callerX + callerWidth;
	var rolloverWidth = rollover.offsetWidth;
	switch(align){
		case "left":
			rollover.style.left = (callerX + extraX) + "px";
			break;
		case "right":
			rollover.style.left = (callerFarX - rolloverWidth + extraX) + "px";
			break;
		default :
			var diff = (rolloverWidth - callerWidth) /2;
			rollover.style.left = (callerX - diff + extraX) + "px";
			break;
	}
	rollover.style.top = (Document.getY(caller) + caller.offsetHeight + extraY) + "px";
}
RollOverMenu.setVerticalMenu = function(rollover, caller, align, extraX, extraY){
	var callerY = Document.getY(caller);
	var callerHeight = caller.offsetHeight;
	var callerFarY = callerY + callerHeight;
	var rolloverHeight = rollover.offsetHeight;
	switch(align){
		case "top":
			rollover.style.top = (callerY + extraY) + "px";
			break;
		case "bottom":
			rollover.style.top = (callerFarY - rolloverHeight + extraY) + "px";
			break;
		default :
			var diff = (rolloverHeight - callerHeight) /2;
			rollover.style.top = (callerY - diff + extraY) + "px";
			break;
	}
	rollover.style.left = (Document.getX(caller) + caller.offsetWidth + extraX) + "px";
}
RollOverMenu.show = function(evt){
	Event.preventDefault(evt);
	var callee = Event.getTarget(evt);
	var rolloverId = Document.getArguments(callee, "JS:RolloverMenu")[0];
	var rollover = document.getElementById(rolloverId);
	RollOverMenu.animateIn(rollover);
}
RollOverMenu.cancel = function(evt){
	var callee = Event.getTarget(evt);
	var elementTo = Event.getElementTo(evt);
	var rolloverId = Document.getArguments(callee, "JS:RolloverMenu")[0];
	var rollover = document.getElementById(rolloverId);
	var isChild = Document.isChildOf(elementTo, rollover);
	if(! isChild){
		RollOverMenu.animateOut(rollover);
	}
}
RollOverMenu.setChildren = function(element){
	var children = element.getElementsByTagName("*");
	element.rolloverId = element.id;
	for(var i = 0 ; i < children.length; i ++){
		children[i].rolloverId = element.id;
	}
}
RollOverMenu.hide = function(evt){
	var callee = Event.getTarget(evt);
	var elementTo = Event.getElementTo(evt);
	var rollover = document.getElementById(callee.rolloverId);
	var trigger = rollover.trigger;
	if(! trigger.animating){
		var isChild = Document.isChildOf(elementTo, rollover);
		if(! isChild){
			RollOverMenu.animateOut(rollover);
		}
	}
}
RollOverMenu.animateIn = function(element){
	var trigger = element.trigger;
	var currentVisible = Document.getStyle(element, "visibility");
	if(currentVisible == "visible"){
		return;
	}
	if(trigger.animating){
		return;	
	}
	trigger.animating = true;
	element.style.visibility = "visible";
	element.style.opacity = 0;
	element.style.filter = "alpha(opacity=0)"; 
	var ani = new Tween(element, "alpha", None.easeNone, 0, 100, 0.1);
	ani.onMotionFinished = function(){
		// finished animating
		RollOverMenu.failSafe(trigger, element);
		trigger.animating = false;
	}
}
RollOverMenu.failSafe = function(trigger, element){
	// get trigger coords
	trigger.startX = Document.getX(trigger);
	trigger.endX = trigger.startX + trigger.offsetWidth;
	trigger.startY = Document.getY(trigger);
	trigger.endY = trigger.startY + trigger.offsetHeight;
	// get rollover coords
	element.startX = Document.getX(element);
	element.endX = element.startX + element.offsetWidth;
	element.startY = Document.getY(element);
	element.endY = element.startY + element.offsetHeight;
	Event.addEvent(document, "mousemove", failSafe);
	var moveActivated = false;
	function failSafe(evt){
		if(moveActivated){
			return;
		}
		var mouseX = Document.getMouseX(evt);
		var mouseY = Document.getMouseY(evt);
		// is within trigger
		if( (mouseX >= trigger.startX && mouseX <= trigger.endX) && (mouseY >= trigger.startY && mouseY <= trigger.endY) ){
			return;
		}
		// is within rollover
		if(mouseX < element.startX || mouseX > element.endX){
			Event.removeEvent(document, "mousemove", failSafe);
			RollOverMenu.animateOut(element);
		moveActivated = true;
		}
		else if(mouseY < element.startY || mouseY > element.endY){
			Event.removeEvent(document, "mousemove", failSafe);
			RollOverMenu.animateOut(element);
		moveActivated = true;
		}
	}
}
RollOverMenu.animateOut = function(element){
	var trigger = element.trigger;
	if(trigger.animating){
		return;	
	}
	trigger.animating = true;
	
	var fadeOut = new Tween(element, "alpha", None.easeNone, 100, 0, 0.1);
	fadeOut.onMotionFinished = function(){
		element.style.visibility = "hidden";
		trigger.animating = false;
	}
}

