
//-------调用方式---------------------------
//
//menu_init(menulist_ary,menuclicklist);
//menulist_ary 为 menu类型的数组
//menuclickist_ary 为 单击菜单时对应的动作菜单，为 menu_onclicklist类型的数组
//
//
//menuselect_init(ary_name,formelement_name,selectval);
//ary_name 为 menuselect类型的数组
//formelement_name 为 该批下拉菜单所影响的表单元素
//selectval是默认选中的下拉菜单值，没有默认选项是为""
//
//页面中应该自定义一个	menuselected_func();
//----------------------------------------


//----系统内部变量------------
var menu_list=new Array();
var menu_onclick_list=new Array();
var documentclick=0;
//---------------------------

function menu(menu_id,menu_fid,menu_name,menu_url,menu_url_target,menu_statu,sub_menu_num,sub_menu_statu)
{
	this.menu_id=menu_id;					//菜单编号，或菜单所在的层编号，顶级菜单该值必须不能为空，一般设为"NULL"
	this.menu_fid=menu_fid;					//上层菜单编号，或上层菜单所在的层编号，如果是定级菜单，则以“”空字符串代替，首层的菜单设为“”
	this.menu_name=menu_name;				//菜单名称
	this.menu_url=menu_url;					//点击菜单跳转的路径
	this.menu_url_target=menu_url_target;	//点击菜单时的目标跳转框架名称
	this.menu_statu=menu_statu;				//菜单状态，显示/隐含
	this.sub_menu_num=sub_menu_num;			//子菜单数量
	this.sub_menu_statu=sub_menu_statu;		//子菜单状态，显示/隐含
	return this;
}

function menu_onclicklist(listname,listfunc)
{
//点击菜单时显示的下拉表格，每个动作对应一个函数，该函数会自动带入menum中的menu_id变量

	this.listname=listname;					//动作名称
	this.listfunc=listfunc;					//点击时对应的函数名称
	return this;
}

function menu_init(m_ary,m_click_ary)
{
//初始化显示菜单

	var begin_id="";			//开始层的ID，表示根菜单的ID
	var layernum=0;				//层数，从0开始，表示菜单的层数

	menu_list=m_ary;					//把用户定义的菜单数组导入到系统全局变量数组
	menu_onclick_list=m_click_ary;		//把用户定义的动作数组导入到系统的全局变量数组
	
	document.onclick = menutable_showhide;			//设定用户单击文档时候的相应函数

	document.write("<div id=\"menutable\" style=\"position:absolute;\"></div>");
	document.write("<table><tr><td>");
	menu_show(begin_id,layernum);			//调用菜单显示函数，循环组织并显示菜单
	document.write("</td></tr></table>");
}

function menu_show(id,lnum)
{
//菜单显示函数，递归检索菜单，逐条显示
	var i,j,k;
	var tmpid;
	var tmpfid;
	var titleclick;
	var plus="＋";
	var desc="－"
	var sub_menu_count=0;

	for (i=0;i<menu_list.length;i++)
	{
		sub_menu_count=0;

		if (menu_list[i].menu_fid==id)
		{
			//初始化首层菜单，使其设置显示状态
			if (menu_list[i].menu_fid=="")
				menu_list[i].menu_statu=true;

			//显示前面的空格，属于第几层就显示几个&nbsp;
			var blank="";
			for (j=0;j<=lnum;j++)
				blank+="&nbsp;";

			//显示标题前方的提示图标，如果该菜单的子菜单数量大于0，而且该菜单的子菜单状态是false，即不显示子菜单，则该提示为“＋”号，否则，是“－”号

			for (k=0;k<menu_list.length;k++ )
			{
				if (menu_list[k].menu_fid==menu_list[i].menu_id)
				{
					sub_menu_count=1;
					break;
				}
			}

			if (sub_menu_count==1)
				menu_list[i].sub_menu_num=1
			else
				menu_list[i].sub_menu_num=0

			if ((menu_list[i].sub_menu_num>0) && (!menu_list[i].sub_menu_statu))
				titleclick=plus;
			else
				titleclick=desc;

			//如果该菜单是要显示的，则显示菜单
			if (menu_list[i].menu_statu)
				showhide="";
			else
				showhide=" style='display:none'";

			document.write("<div id='"+menu_list[i].menu_id+"' " + showhide + ">" + blank + "<a href=\"javascript:menu_titleonclick('" + menu_list[i].menu_id + "')\">" + titleclick + "</a>" + "<a href=\"#\" onClick=\"menuonclick('" + menu_list[i].menu_id + "');return false;\">" + menu_list[i].menu_name + "</a>" + "</div>");

			//如果有子菜单，则递归检索下层菜单
			if (menu_list[i].sub_menu_num>0)
			{
				tmpid=menu_list[i].menu_id;
				menu_show(tmpid,lnum+1);
			}
		}
	}
}

function menu_getindex(m_id)
{
//以menu的menu_id为变量，得到其在menu数组中的索引值
	var i;
	var idx;

	idx=null;
	for (i=0;i<menu_list.length;i++)
	{
		if (menu_list[i].menu_id==m_id)
		{
			idx=i;
			break;
		}
	}

	return idx;
}

function menu_titleonclick(m_id)
{
//点击菜单前方的小图标，则改变菜单的实现方式，列出或隐含其子菜单
	var idx,i;
	var tmptext;
	var layerobject;
	idx=menu_getindex(m_id);

	menu_list[idx].sub_menu_statu=!menu_list[idx].sub_menu_statu;			//点击菜单，首先转换其“子菜单”显示状态，即sub_menu_statu的状态

	layerobject=document.getElementById(menu_list[idx].menu_id);
	tmptext=layerobject.innerHTML;

	if ((!menu_list[idx].sub_menu_statu) && (menu_list[idx].sub_menu_num>0))
		tmptext=tmptext.replace('－','＋');					//如果当前菜单的子菜单状态是隐含的，而且子菜单数量大于0，则显示“＋”号
	else
		tmptext=tmptext.replace('＋','－');					//如果当前菜单的子菜单状态是显示的，或者子菜单数量等于0，则显示“－”号
	layerobject.innerHTML=tmptext;

	menu_contral(idx,m_id,menu_list[idx].sub_menu_statu);	//进入递归显示其子菜单的状态
}

function menu_contral(m_idx,m_id,statu)
{
//递归处理m_id下的子菜单的显示情况，只有其上一级父菜单的“子菜单”状态是显示的，而且其上级父菜单的信号（statu）是显示的，该菜单才显示

	var sub_statu;
	var ctl_statu;
	var i;
	var layerobject;
	var tmptext;
	sub_statu=menu_list[m_idx].sub_menu_statu;

	if ((statu) && (sub_statu))
		ctl_statu=true;
	else
		ctl_statu=false;
	
	for(i=0;i<menu_list.length;i++)
	{
		if (menu_list[i].menu_fid==m_id)
		{
			menu_list[i].menu_statu=ctl_statu;

			layerobject=document.getElementById(menu_list[i].menu_id);
			tmptext=layerobject.innerHTML;

			if (ctl_statu)
			{
				if ((!menu_list[i].sub_menu_statu) && (menu_list[i].sub_menu_num>0))
				{
					tmptext=tmptext.replace('－','＋');
					layerobject.innerHTML=tmptext;
				}
				else
				{
					tmptext=tmptext.replace('＋','－');
					layerobject.innerHTML=tmptext;				
				}

				layerobject.style.display="";
			}
			else
			{
				layerobject.style.display="none";
			}

			menu_contral(i,menu_list[i].menu_id,statu);
		}
	}
}

function menuonclick(m_id)
{
//点击菜单，将显示该菜单的动作表格，动作名称与动作函数一一对应
	var textstring="";
	var i;
	var idx;
	idx=menu_getindex(m_id);

	if (menu_list[idx].menu_url=="")
	{
		if (menu_onclick_list.length>0)
		{
			textstring="<table border=1 cellspacing=0 cellpadding=2 bordercolorlight=#999999 bordercolordark=#FFFFFF>";
			for (i=0;i<menu_onclick_list.length;i++)
			{
				textstring+="<tr><td bgcolor=\"#FFFFCC\"><a href=\"javascript:"+menu_onclick_list[i].listfunc+"('"+m_id+"')\">"+menu_onclick_list[i].listname+"</a></td></tr>";
			}
			textstring+="</table>";
	
			settextoflayer("menutable",textstring);

			var obj=findobj(m_id);
			var xy=getlayerleft_top(obj);		//获得当前层的坐标
			var mousexy=getmouseposition();		//获得当前鼠标的坐标
			setlayerposition("menutable",mousexy[0],xy[1]);		//设置动作菜单层的坐标

			if (documentclick==2)
				documentclick=0;

			if (documentclick==0)					//如果动作文档中没有要显示的动作菜单层，则显示动作菜单
			{
				showhidelayer("menutable","show");
				documentclick=1;					//设定已经显示了动作菜单
			}
		}
	}
	else
	{
		if (menu_list[idx].menu_url_target=="")
			location.href=menu_list[idx].menu_url;
		else
		{
			if (menu_list[idx].menu_url_target=="top")
				top.location.href=menu_list[idx].menu_url;
			else if (menu_list[idx].menu_url_target=="parent")
				parent.location.href=menu_list[idx].menu_url;
			else if (menu_list[idx].menu_url_target=="opener")
				opener.location.href=menu_list[idx].menu_url;
			else if ((menu_list[idx].menu_url_target=="self") || (menu_list[idx].menu_url_target==""))
				self.location.href=menu_list[idx].menu_url;
			else if (menu_list[idx].menu_url_target=="blank")
				window.open(menu_list[idx].menu_url)
			else if (menu_list[idx].menu_url_target=="newwin")
				newwin(menu_list[idx].menu_url,400,300)
			else
			{
				var fobj=get_frameobj(parent,menu_list[idx].menu_url_target)
				fobj.location.href=menu_list[idx].menu_url;
			}
		}
	}
}

function menutable_showhide()
{
//用户点击文档时，运行该函数
	if (documentclick==1)			//如果已经有一动作被点击而且菜单显示
	{
		documentclick=2;			//则设定为“显示确认”
		return;
	}

	if (documentclick==2)			//如果“显示确认”，则表明已经有一工作菜单在显示，而且现在接受的是重复点击，将隐含该动作菜单
	{
		showhidelayer('menutable','hide');
		documentclick=0;			//设为没有动作菜单在显示
		return;
	}
}


//--------------------------------------------SELECT选项-----------------------------------------


//--系统变量----------------------
var menuselect_ary=new Array();
var menuselect_selectedvalname;

var menuselect_sysary=new Array();
var menuselect_selectedvalname_sysary=new Array();
//--------------------------------

function menuselect(menu_id,menu_fid,menu_name)
{
	//下拉菜单对象
	this.menu_id=menu_id;			//下拉菜单的ID，顶级菜单为""
	this.menu_fid=menu_fid;			//下拉菜单的上级菜单ID
	this.menu_name=menu_name;		//菜单名称
	return this;
}


function menuselect_sysary_changeidx(idx)
{
	if (menuselect_ary!=menuselect_sysary[idx])
	{
		menuselect_ary=menuselect_sysary[idx];			//把用户定义的菜单数组变量复制到系统菜单变量中
		menuselect_selectedvalname=menuselect_selectedvalname_sysary[idx];		//设定该菜单在FORM中所影响的变量名	
	}
}


function menuselect_init(ms_ary,form_sel_name,selected_m_id,showtype)
{
//初始化菜单列表
	var i;
	var sysidx;

	menuselect_sysary.push(ms_ary);			//把用户定义的菜单数组变量复制到系统菜单变量中
	menuselect_selectedvalname_sysary.push(form_sel_name);	//设定该菜单在FORM中所影响的变量名
	sysidx=menuselect_sysary.length-1;

	document.write("<input type='hidden' name='"+form_sel_name+"'>");		//设定FORM中的变量
	document.write("<div id='menuselect_layer"+sysidx+"'></div>");

	var init_m_id;			//初始选定的菜单编号

	if (selected_m_id!="")
	{
		var findselected=false;
		for (i=0;i<ms_ary.length;i++)
		{
			if (ms_ary[i].menu_id==selected_m_id)
			{
				findselected=true;
				break;
			}
		}

		if (!findselected)
			selected_m_id="";
	}

	if (selected_m_id=="")		//如果系统没有设定开始选定的菜单变量，则选择第一个主菜单为选定值
	{
		for (i=0;i<ms_ary.length;i++)
		{
			if (ms_ary[i].menu_fid=="")
			{
				init_m_id=ms_ary[i].menu_id;
				break;
			}
		}
	}
	else
	{
		init_m_id=selected_m_id;
	}

	form=menuselect_getform(form_sel_name);			//得到该菜单影响的变量所在的FORM对象

	menuselect_change(form,init_m_id,sysidx,showtype);				//设定菜单的显示内容
}

function menuselect_getform(form_sel_name)
{
	//得到名为form_sel_name的变量所在的FORM对象
	var i,j;
	var formobj;

	for (i=0;i<document.forms.length;i++)
	{
		formobj=document.forms[i];

		for (j=0;j<formobj.elements.length;j++)
		{
			if (formobj.elements[j].name==form_sel_name)
			{
				return formobj;
			}
		}
	}
}

function menuselect_change(form,m_id,sysidx,showtype)
{
	//当菜单选择发生变化时，调用该函数，整理下拉菜单，m_id是用户所选中的菜单ID
	var m_fid_ary=new Array();
	var tmp_fid;
	var i=1;

	menuselect_sysary_changeidx(sysidx);

	//从菜单ID为m_id的菜单开始，从下向上搜索，检索出m_id的链条，存放于m_fid_ary数组中
	m_fid_ary[0]=m_id;

	tmp_fid=menuselect_find_menu_fid(m_id);

	for(;;)
	{
		if (tmp_fid=="")
			break;
		else
		{
			m_fid_ary[i]=tmp_fid;
			i++;
			tmp_fid=menuselect_find_menu_fid(tmp_fid);
		}		
	}
	m_fid_ary[i]="";
	m_fid_ary.reverse();		//翻转数组，使得m_fid_ary从顶级菜单""开始，一层层直到m_id

	//如果m_id下面还有子菜单，则继续记录其子菜单中的第一个菜单ID，一直到没有子菜单为止，存放于m_fid_ary中
	var next_m_id;
	for(;;)
	{
		next_m_id=menuselect_next(m_fid_ary[m_fid_ary.length-1]);
		if (next_m_id==null)
			break;
		else
		{
			m_fid_ary.push(next_m_id);
		}
	}

	//设定菜单动作所对应的变量的值，为最后一个菜单的ID
	for (i=0;i<form.elements.length;i++)
	{
		if (form.elements[i].name==menuselect_selectedvalname)
		{
			form.elements[i].value=m_fid_ary[m_fid_ary.length-1];
			break;
		}
	}

	menuselected_func(form.elements[i].name);

	menuselect_showselected(m_fid_ary,sysidx,showtype);		//根据m_fid_ary所形成的链条路径，一层层显示下拉菜单
}

function menuselect_next(m_id)
{
	//判断ID为m_id的菜单是否还有下层菜单，如果有，返回首个子菜单的ID，没有，返回NULL
	var i;
	var tmp_m_id;

	tmp_m_id=null;

	for (i=0;i<menuselect_ary.length;i++)
	{
		if (menuselect_ary[i].menu_fid==m_id)
		{
			tmp_m_id=menuselect_ary[i].menu_id;
			break;
		}
	}

	return tmp_m_id;
}

function menuselect_showselected(mf_ary,sysidx,showtype)
{
//根据数组中的值，逐层显示下拉菜单
	var i,j;
	var seltext="";
	var submenu;
	var seled;

	if (showtype==1)
	{
		seltext="<table border=0 cellpadding=0 cellspacing=0><tr>";

		for (i=0;i<mf_ary.length;i++)
		{
			submenu=menuselect_havesubmenu(mf_ary[i]);	//判断是否有子菜单，有，返回TRUE，否则，返回FALSE

			if (submenu)
			{
				seltext+="<td><select name='ms_lay"+i+"' onChange='menuselect_change(this.form,this.options[this.selectedIndex].value,"+sysidx+","+showtype+");menuselect_onchange(menuselect_selectedvalname)'>";
	
				for (j=0;j<menuselect_ary.length;j++)
				{
					if (menuselect_ary[j].menu_fid==mf_ary[i])
					{
						//如果下拉菜单中的ID与对应数组中的值相等，则该菜单为选定
						if (menuselect_ary[j].menu_id==mf_ary[i+1])
							seled="selected";
						else
							seled="";
					
						seltext+="<option value='"+menuselect_ary[j].menu_id+"' "+seled+">"+menuselect_ary[j].menu_name+"</option>";
					}
				}
				seltext+="</select></td>";
			}
		}

		seltext+="</tr></table>";
	}
	else if (showtype==2)
	{
		seltext="<table>";

		for (i=0;i<mf_ary.length;i++)
		{
			submenu=menuselect_havesubmenu(mf_ary[i]);	//判断是否有子菜单，有，返回TRUE，否则，返回FALSE

			if (submenu)
			{
				seltext+="<tr><td><select name='ms_lay"+i+"' onChange='menuselect_change(this.form,this.options[this.selectedIndex].value,"+sysidx+","+showtype+");menuselect_onchange(menuselect_selectedvalname)'>";
	
				for (j=0;j<menuselect_ary.length;j++)
				{
					if (menuselect_ary[j].menu_fid==mf_ary[i])
					{
						//如果下拉菜单中的ID与对应数组中的值相等，则该菜单为选定
						if (menuselect_ary[j].menu_id==mf_ary[i+1])
							seled="selected";
						else
							seled="";
					
						seltext+="<option value='"+menuselect_ary[j].menu_id+"' "+seled+">"+menuselect_ary[j].menu_name+"</option>";
					}
				}
				seltext+="</select></td></tr>";
			}
		}

		seltext+="</table>";
	}

	settextoflayer("menuselect_layer"+sysidx,seltext);
}

function menuselect_find_menu_fid(m_id)
{
	//查找m_id的上级ID
	var i;
	for(i=0;i<menuselect_ary.length;i++)
		if (menuselect_ary[i].menu_id==m_id)
			return menuselect_ary[i].menu_fid;
	
//	return "";
}

function menuselect_havesubmenu(m_id)
{
	//判断是否有子菜单
	var i;
	var find=false;
	for (i=0;i<menuselect_ary.length;i++)
	{
		if (menuselect_ary[i].menu_fid==m_id)
		{
			find=true;
			break;
		}
	}

	return find;
}
