// menu.js
// A basic menu script
// Requires:
//	utils.js
//  timer.js
// by Greg Poole | greg@webengine.com.au | www.webengine.com.au

var ANIM_NONE = 0;
var ANIM_ENTER = 1;
var ANIM_EXIT = 2;

var ANIM_TIMER_SPEED = 7;

var MENU_VISIBLE = 1;
var MENU_HIDDEN = 2;

var menus = new Array();

// Initialise menus here
function menus_init() {
	// menu_create("MENU NAME", "DIV ID", "BUTTON ID", OFFSET X, OFFSET Y, [animator extension]);
}
addEventHandler(window,"onload",menus_init);

function Menu(obj) {
	
	obj.style.visibility = "hidden";
	
	this.menuobj = obj;
	this.showing = false;
	this.timer = new Timer(this);
	this.hideTimeout = -1;
	this.menubtn;
	this.topOffset = 0;
	this.leftOffset = 0;
	this.animTimer = -1;
	this.state = MENU_HIDDEN;
	
	this.show = function(finish) {
		this.timer.clearTimeout(this.hideTimeout);
		
		if(!finish && this.menuobj.style.visibility != "visible") {
			this.animator.start(ANIM_ENTER);
		} else {
			this.hideTimeout = -1;
			this.menuobj.style.visibility = "visible";
			this.menubtn.className += " selected";
		}
	}
	
	this.hide = function(finish) {		
		if(!finish) {
			this.animator.start(ANIM_EXIT);
		} else {
			this.menubtn.className = this.menubtn.oldClassName;
			this.menuobj.style.visibility = "hidden";
			this.menubtn.className = this.menubtn.className.replace(" selected", "");
			this.hideTimeout = -1;
		}
	}
	
	this.bindTo = function(button, id) {
		this.menubtn = button;
		var top = getAbsOffsetTop(button) + button.offsetHeight;
		var left = getAbsOffsetLeft(button);
		this.menuobj.style.position = "absolute";
		this.menuobj.style.top = top + this.topOffset + "px";
		this.menuobj.style.left = left + this.leftOffset + "px";
		this.menubtn.oldClassName = this.menubtn.className;
		addEventHandler(button, "onmouseover", function() { eval("menu_show('" + id + "')") });
		addEventHandler(button, "onmouseout", function() { eval("menu_hide('" + id + "')") });
	}
	
	this.checkState = function() {
		if(this.state == MENU_VISIBLE && this.menuobj.style.visibility != "visible") {
			this.show();
		} else if(this.state == MENU_HIDDEN && this.menuobj.style.visibility != "hidden") {
			this.hide();
		}
		this.timer.setTimeout("checkState", 300);
	}
	
	this.setAnimator = function(animator) {
		this.animator = animator;
		this.animator.setMenu(this);
	}
	this.setAnimator(new MenuNoAnimation());
	
	this.clearAnimator = function() {
		this.setAnimator(new MenuNoAnimation());
	}
	
	this.checkState();
}

function menu_show(id) {
	menus[id].state = MENU_VISIBLE;
}

function menu_hide(id) {
	menus[id].state = MENU_HIDDEN;
}

function menu_create(id, div_id, button_id, offset_top, offset_left, animator) {
	var div = document.getElementById(div_id);
	var button = document.getElementById(button_id);
	
	if(!div || !button)
		return false;
	
	menus[id] = new Menu(div);
	menus[id].topOffset = offset_top;
	menus[id].leftOffset = offset_left;
	menus[id].bindTo(button, id);
	if(animator)
		menus[id].setAnimator(animator);
	addEventHandler(div, "onmouseover", function() { eval("menu_show('" + id + "')") });
	addEventHandler(div, "onmouseout", function() { eval("menu_hide('" + id + "')") });
}