/*
 * PullDownMenu Class
 *
 * $Id: menu.js,v 1.3 2000/11/14 01:58:07 hirose31 Exp $
 *
 */

/**
 * PullDownMenu Class
 */
function PullDownMenu(x, y) {
	this.menuId = PullDownMenu._menus.length;
	this.opened = false;
	this.pulled = 0;
	this.pullTimeId = null;
	this.closeTimeId = null;
	this.pullInterval = 5;		// null なら 0 と同じ
	this.closeTimeout = 20000;  // null なら close のタイムアウトはしない
	this.initX = x;
	this.initY = y;
	this.pullPixel = 4;         // 0 以下なら 4
	this.available = false;

	PullDownMenu._menus[this.menuId] = this;
	PullDownMenu._items[this.menuId] = new Array();
	PullDownMenu._base[this.menuId]  = {};

	this.items = PullDownMenu._items[this.menuId];
	this.base = {};
}

PullDownMenu._menus = new Array();
PullDownMenu._items = new Array();
PullDownMenu._base  = new Array();

PullDownMenu.prototype.getPullPixel = function() {
	return this.pullPixel;
}
PullDownMenu.prototype.setPullPixel = function(px) {
	this.pullPixel = px > 0 ? px : 4;
}

PullDownMenu.prototype.getPullInterval = function() {
	return this.pullInterval;
}
PullDownMenu.prototype.setPullInterval = function(s) {
	this.pullInterval = s != null ? s : 0;
}

PullDownMenu.prototype.getCloseTimeout = function() {
	return this.closeTimeout;
}
PullDownMenu.prototype.setCloseTimeout = function(s) {
	this.closeTimeout = s;
}

PullDownMenu.prototype.getItemCount = function() {
	return this.items.length;
}

PullDownMenu.prototype.isOpened = function() {
	return this.opened;
}

PullDownMenu.prototype.addItem = function() {
	var j = this.getItemCount();
	for (var i = 0; i < arguments.length; i++) {
		this.items[i+j] = arguments[i];
	}
}

//PullDownMenu.prototype.removeItem = function() {
//}

PullDownMenu.prototype.setBase = function(lyr) {
	PullDownMenu._base[this.menuId] = lyr;
	this.base = lyr;
}

PullDownMenu.prototype.startPullDown = function() {
	var z = 9999;
	// set ZIndex of base layer
	for (var i = 0; i < this.items.length; i++) {
		var iz = this.items[i].getZIndex();
		if (z > iz) {
			z = iz;
		}
	}
	this.base.setZIndex(z - 1);

	if (ua.isNS) {
		document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
	}
	document.onmouseover = this.menuMouseOver;
	document.onmouseout  = this.menuMouseOut;

	this.available = true;
}

PullDownMenu.prototype.menuMouseOver = function(e) {
	var px = PullDownMenu.getPointerX(e);
	var py = PullDownMenu.getPointerY(e);
	var i;

	for (i = PullDownMenu._base.length - 1; i >= 0; i--) {
		var l = PullDownMenu._base[i].getX();
		var t = PullDownMenu._base[i].getY();
		var r = l + PullDownMenu._base[i].getWidth();
		var b = t + PullDownMenu._base[i].getHeight();
		if (PullDownMenu._base[i].checkWithinBox(px, py, l, t, r, b)) {
			PullDownMenu._menus[i].opened = true;
			break;
		}
	}

	//window.status = 'Over: ' + i;

	if (ua.isNS) {
		routeEvent(e);
	}
	return true;
}

PullDownMenu.prototype.menuMouseOut = function(e) {
	var px = PullDownMenu.getPointerX(e);
	var py = PullDownMenu.getPointerY(e);
	var i;

	for (i = PullDownMenu._base.length - 1; i >= 0; i--) {
		var l = PullDownMenu._base[i].getX();
		var t = PullDownMenu._base[i].getY();
		var r = l + PullDownMenu._base[i].getWidth();
		var b = t + PullDownMenu._base[i].getHeight();
		if (PullDownMenu._menus[i].isOpened() &&
			!PullDownMenu._base[i].checkWithinBox(px, py, l, t, r, b)) {
			PullDownMenu._menus[i].closeMenu();
			PullDownMenu._menus[i].opened = false;
			break;
		}
	}

	//window.status = 'Over: ' + i;

	if (ua.isNS) {
		routeEvent(e);
	}
	return true;
}

PullDownMenu.prototype.openMenu = function() {
	if (! this.available) {
		return false;
	}

	for (var i = 0; i < this.items.length; i++) {
		this.items[i].setVisible(true);
	}
	this.pullTimeId  = setInterval('PullDownMenu._pull('+this.menuId+')', this.pullInterval);
	if (this.closeTimeout != null) {
		this.closeTimeId = setTimeout('PullDownMenu._closeMenu('+this.menuId+')', this.closeTimeout);
	}
}

PullDownMenu._closeMenu = function(id) {
	PullDownMenu._menus[id].closeMenu();
}

PullDownMenu.prototype.closeMenu = function() {
	for (var i = 0; i < this.items.length; i++) {
		this.items[i].setVisible(false);
		this.items[i].moveTo(this.initX, this.initY);
	}
	if (this.pullTimeId != null) {
		clearInterval(this.pullTimeId);
		this.pullTimeId = null;
	}
	if (this.closeTimeId != null) {
		clearTimeout(this.closeTimeId);
		this.closeTimeId = null;
	}
}

PullDownMenu._pull = function(id) {
	PullDownMenu._menus[id].pull();
}

PullDownMenu.prototype.pull = function() {
	if (this.pulled >= this.getItemCount()) {
		this.pulled = 0;
		if (this.pullTimeId != null) {
			clearInterval(this.pullTimeId);
			this.pullTimeId = null;
		}
		return true;
	}
	for (var i = this.pulled; i < this.getItemCount(); i++) {
		var maxY = this.initY + this.items[0].getHeight() * i;
		var curY = this.items[i].getY()
		if (maxY - curY > this.pullPixel + this.pullPixel * i) {
			this.items[i].moveBy(null, this.pullPixel + this.pullPixel * i);
		} else {
			this.items[i].moveTo(null, maxY);
			this.pulled++;
		}
	}
}

PullDownMenu.getPointerX = function(e) {
	return ua.isNS ? e.pageX : window.event.x + document.body.scrollLeft;
}
PullDownMenu.getPointerY = function(e) {
	return ua.isNS ? e.pageY : window.event.y + document.body.scrollTop;
}

