// testado em IE5,IE6 e Firefox
function EDMenu(id_prefix,cls_prefix,top,left,width,height,items)
{
	this.id_prefix=id_prefix;
	this.cls_prefix=cls_prefix;
	this.top=top;
	this.pos_rel=(this.top<0);
	this.txt_visible=(this.pos_rel?'block':'inline');
	this.left=left;
	this.width=width;
	this.height=height;
	this.items=items;
};
EDMenu.prototype.id_prefix=null;
EDMenu.prototype.cls_prefix=null;
EDMenu.prototype.top=null;
EDMenu.prototype.left=null;
EDMenu.prototype.width=null;
EDMenu.prototype.height=null;
EDMenu.prototype.items=[];
EDMenu.prototype.func_expand=null;
EDMenu.prototype.func_collapse=null;

function EDMenuItem(id,html,items)
{
	this.id=id;
	this.html=html;
	this.items=items;
};
EDMenuItem.prototype.id=null;
EDMenuItem.prototype.html=null;
EDMenuItem.prototype.link=null;
EDMenuItem.prototype.items=[];

// #### nota: não invocar directamente ####
function edmenu_click(edmenu,seq,id)
{
	var _m_=eval(edmenu);
	if (_m_)
	{
		if (_m_.visible[seq])
		{
			var i,ctop=document.getElementById(_m_.id_prefix+'ItemN'+seq).offsetTop+_m_.height;
			if (_m_.expanded[seq])
			{
				if (_m_.func_collapse!=null)
				{
					var r=eval(_m_.func_collapse+'(\''+id+'\')');
					if (typeof(r)=='boolean')
						if (!r)
							return;
				}
				for (i=seq+1;i<_m_.lastindexes[seq];i++)
				{
					_m_.visible[i]=false;
					_m_.expanded[i]=false;
					document.getElementById(_m_.id_prefix+'ItemN'+i).style.display='none';
				};
			}
			else
			{
				if (_m_.func_expand!=null)
				{
					var r=eval(_m_.func_expand+'(\''+id+'\')');
					if (typeof(r)=='boolean')
						if (!r)
							return;
				}
				for (i=seq+1;i<_m_.lastindexes[seq];i++)
				{
					if (_m_.levels[i]==_m_.levels[seq]+1)
					{
						_m_.visible[i]=true;
						document.getElementById(_m_.id_prefix+'ItemN'+i).style.display=_m_.txt_visible;
						if(!_m_.pos_rel)
							document.getElementById(_m_.id_prefix+'ItemN'+i).style.top=ctop+'px';
						ctop+=_m_.height
					}
				}
			}
			for (i=_m_.lastindexes[seq];i<_m_.lastindex;i++)
				if (_m_.visible[i])
				{
					if(!_m_.pos_rel)
						document.getElementById(_m_.id_prefix+'ItemN'+i).style.top=ctop+'px';
					ctop+=_m_.height
				};
			_m_.expanded[seq]=!_m_.expanded[seq];
		}
	}
}

// #### nota: não invocar directamente ####
function edmenu_writeitem(doc,edmenu,item,ctx,level){
	var _m_=eval(edmenu);
	if (_m_)
	{
		_m_.ids[ctx.seq]=item.id;

		doc.write('<div id="'+_m_.id_prefix+'ItemN'+ctx.seq+'" class="'+_m_.cls_prefix+'CDIV" style="position:'+(_m_.pos_rel?'relative':'absolute')+';left:'+_m_.left+';width:'+_m_.width+';height:'+_m_.height+';'+(_m_.pos_rel?'':'top:'+ctx.top+';')+'display:'+(level==1?_m_.txt_visible:'none')+'" onclick="edmenu_click(\''+edmenu+'\','+ctx.seq+',\''+item.id+'\');">'+item.html+'</div>');
		if (level==1)
			ctx.top+=_m_.height;

		var seq=ctx.seq++;
		_m_.levels[seq]=level;
		_m_.visible[seq]=(level==1);
		_m_.expanded[seq]=false;

		var i;
		for (i=0;i<item.items.length;i++)
			if (item.items[i])
				edmenu_writeitem(doc,edmenu,item.items[i],ctx,level+1);
		_m_.lastindexes[seq]=ctx.seq;
	}
}

function EDMenu_Collapse(edmenu,id)
{
	if (typeof(edmenu)!='string') return false;
	var _m_=eval(edmenu);
	if (_m_)
	{
		var seq;
		for (seq=0;seq<_m_.ids.length;seq++)
			if (_m_.ids[seq]==id)
			{
				if (_m_.expanded[seq])
				{
					edmenu_click(edmenu,seq,id);
					return true;
				}
				break;
			}
	}
	return false;
}

function EDMenu_Expand(edmenu,id)
{
	if (typeof(edmenu)!='string') return false;
	var _m_=eval(edmenu);
	if (_m_)
	{
		var seq;
		for (seq=0;seq<_m_.ids.length;seq++)
			if (_m_.ids[seq]==id)
			{
				if (!(_m_.expanded[seq]))
				{
					edmenu_click(edmenu,seq,id);
					return true;
				}
				break;
			}
	}
	return false;
}

function EDMenu_WriteDoc(doc,edmenu){
	if (typeof(edmenu)!='string') return false;
	var _m_=eval(edmenu);
	if (_m_)
	{
		if (_m_.id_prefix==null||_m_.cls_prefix==null||_m_.top==null||_m_.left==null||_m_.width==null||_m_.height==null||!_m_.items.length)
			return false;

		_m_.visible=new Array();
		_m_.expanded=new Array();
		_m_.lastindexes=new Array();
		_m_.levels=new Array();
		_m_.ids=new Array();
		
		ctx=new Object();
		ctx.seq=0;
		ctx.top=top;
		
		var i;
		for (i=0;i<_m_.items.length;i++)
			if (_m_.items[i])
				edmenu_writeitem(doc,edmenu,_m_.items[i],ctx,1);

		_m_.lastindex=ctx.seq;
		return true;
	}
}

function EDMenu_Write(edmenu)
{
	return EDMenu_WriteDoc(document,edmenu);
}

