
var A_TOP = 0;
var A_BOTTOM = A_TOP + 1;
var A_LEFT = A_TOP + 2;
var A_RIGHT = A_TOP + 3;

var JSPMENU_SHOWED = new Array();
var JSPMENU_HIDE = new Array();

function JsPMenu (owner, vparent, align) {
	var _this = this;

	this.timer = null;

	this.showAlign = align;

	this.submenu = false;

	var parent = document.getElementById(vparent);
	{
		parent.menu = this;
	}

	var autoWidth = null; // Sem valor inicial

	var htmlObject = this.htmlObject = document.createElement('div');
	htmlObject.className = 'popmenu';

	//
	this.eMouseOut = function (e) {
		var idx = JSPMENU_HIDE.push(_this)-1;
		document.timerJsPMenu = setTimeout('JSPMENU_HIDE['+idx+'].hide();', 1000);
	}
	this.eMouseOver = function (e) {
		clearTimeout(document.timerJsPMenu);
	}
	attachEvent(htmlObject, 'mouseout', this.eMouseOut);
	attachEvent(htmlObject, 'mouseover', this.eMouseOver);
	//

	this.c = document.createElement('div');
	with (this.c) {
		className = 'c';
	}
	htmlObject.appendChild(this.c);

	this.b = document.createElement('div');
	with (this.b) {
		className = 'b';
	}
	htmlObject.appendChild(this.b);

	this.d = document.createElement('div');
	with (this.d) {
		className = 'd';
	}
	htmlObject.appendChild(this.d);

	this.e = document.createElement('div');
	with (this.e) {
		className = 'e';
	}
	htmlObject.appendChild(this.e);

	this.ce = document.createElement('div');
	with (this.ce) {
		className = 'ce';
	}
	htmlObject.appendChild(this.ce);

	this.cd = document.createElement('div');
	with (this.cd) {
		className = 'cd';
	}
	htmlObject.appendChild(this.cd);

	this.be = document.createElement('div');
	with (this.be) {
		className = 'be';
	}
	htmlObject.appendChild(this.be);

	this.bd = document.createElement('div');
	with (this.bd) {
		className = 'bd';
	}
	htmlObject.appendChild(this.bd);

	this.body = document.createElement('div');
	with (this.body) {
		className = 'body';
	}
	htmlObject.appendChild(this.body);

	this.addMenu = function (text, link) {
		var m = document.createElement('a');
		m.menu = this;
		m.className = 'link';
		m.innerHTML = text;
		if (link instanceof JsPMenu) { // Se o link for um submenu
			m.href = 'javascript:;';
			m.submenu = link;
			link.submenu = true;
			link.parent(m);
		} else {
			m.href = link;
		}
		attachEvent(m, 'mouseover', this.eLinkMouseOver);
		this.body.appendChild(m);
		//
		return m;
	}

	this.hide = function () {
		for (var i = 0; i < JSPMENU_SHOWED.length; i++) {
			if (JSPMENU_SHOWED[i] == _this) {
				JSPMENU_SHOWED.splice(i, 1);
			}
		}
		var n;
		for (i = 0; i < this.body.childNodes.length; i++) {
			n = this.body.childNodes[i];
			if (n.submenu) {
				n.submenu.hide();
			}
		}
		htmlObject.style.visibility = 'hidden';
	}

	this.eDocumentClick = function (e) {
		_this.hide();
	}

	this.show = function (align) {
		if (!this.submenu) {
			for (var i = 0; JSPMENU_SHOWED.length; i++) {
				JSPMENU_SHOWED[i].hide();
			}
			JSPMENU_SHOWED = new Array();
		}
		//
		JSPMENU_SHOWED.push(this);
		attachEvent(document, 'click', this.eDocumentClick);
		//
		if (typeof align == 'undefined') {
			align = this.showAlign;
		}
		switch (align) {
			case A_LEFT:
			{
				this.htmlObject.style.top = (realTop(parent) + 5) + 'px';
				this.htmlObject.style.left = (realLeft(parent) + parent.offsetWidth) + 'px';
			}
			break;
			case A_TOP:
			{
				this.htmlObject.style.top = (realTop(parent) + parent.offsetHeight) + 'px';
				this.htmlObject.style.left = realLeft(parent) + 'px';
			}
			break;
			case A_BOTTOM:
			{
				this.htmlObject.style.top = (realTop(parent) + this.htmlObject.offsetHeight) + 'px';
				this.htmlObject.style.left = realLeft(parent) + 'px';
			}
			break;
		}
		this.d.style.height = this.e.style.height = htmlObject.offsetHeight + 'px';
		htmlObject.style.visibility = 'visible';
	}

	this.width = function (value) {
		if (typeof value != 'undefined') {
			if (typeof value == 'object') {
				value = value.offsetWidth;
			}

			if (!isNaN(value)) {
				htmlObject.style.width = value+'px';
			}
			return autoWidth;
		}
	}

	this.eLinkMouseOver = function (e) {
		clearTimeout(document.timerJsPMenu);
		var _o = e.srcElement || e.target;
		var n;
		for (var i = 0; i < _this.body.childNodes.length; i++) {
			n = _this.body.childNodes[i];
			if (n.submenu && (n != _o)) {
				n.submenu.hide();
			}
		}
	}

	this.eParentMouseOver = function (e) {
		_this.show();
	}

	this.parent = function (value) {
		if (typeof value != 'undefined') {
			detachEvent(parent, 'mouseover', this.eParentMouseOver);
			parent = value;
			attachEvent(parent, 'mouseover', this.eParentMouseOver);
			//attachEvent(parent, 'mouseout', this.eMouseOut);
			attachEvent(parent, 'mouseover', this.eMouseOver);
		}
		return parent;
	}

	this.indexHide = function () {
		for (var i = 0; i < JSPMENU_HIDE.length; i++) {
			if (JSPMENU_HIDE[i] == this) {
				return i;
			}
		}
	}

	this.toString = function () {
		return 'JsPMenu () {\n\tItems('+this.body.childNodes.length+');\n}';
	}

	owner.appendChild(this.htmlObject);
	this.parent(parent);
}