﻿/**
 *<p>Title:生成下拉菜单</p>
 *<p>Description: 调用XML文档，生成下拉菜单</p>
 *<p>Copyright:Copyright(c)2008</p>
 *<p>Company:Null</p>
 *@author：宋雷鸣 QQ:10522779
 *@version：0.1
 */
 
//主方法
//参数xmlFilePath:要读取的XML文档的路径；
//参数TagId:菜单所处的HTML节点的Id;
function Drop(xmlFilePath,TagId)
{
	Menu.apply(this,new Array(xmlFilePath,TagId));	
}
Drop.prototype=new Menu();
//全局变量
//子菜单项的默认宽度
Drop.prototype.ItemWidth=100;
//第一级子菜单左侧位移，默认是靠上级菜单最左点
Drop.prototype.Left=-10;
//鼠标是否离开下拉菜单
Drop.prototype.MenuRelease=false;
//定时执行的对象
Drop.prototype.intervalProcess=null;

//返回主菜单,参数依次为：节点名称，层深，序号
Drop.prototype.BuilderHTML=function(nodeName,level)
{	
	level=level==null ? 0 : level;
	//菜单项的父节点，即菜单面板
	var divBox=document.createElement("div");
	this.BuildItemPanel(divBox,level);
	//
	var nodes=nodeName.childNodes;
	for(var i=0;i<nodes.length;i++)
	{	
		var node=new Node(nodes[i]);
		var subBox=document.createElement("div");		
		//如果节点返回为空，则跳过；否则，生成菜单项
		var newNode=this.BuildItem(node,subBox,level);
		if(newNode==null)continue;
		divBox.appendChild(newNode);		
		//如果没有事件，则跳过，否则添加事件
		var eventNode=this.BuildItemEvent(node,newNode,level);
		if(eventNode!=null)
		{
			divBox.replaceChild(eventNode,newNode);
		}
		if(level==0&&i!=nodes.length-1)
		{
			var img=document.createElement("img");
			img.setAttribute("src",this.imgPath+"line.gif");
			divBox.appendChild(img);
		}
		//如果还有子菜单，递归调用
		if(nodes[i].childNodes.length>0)
			divBox.appendChild(this.BuilderHTML(nodes[i],level+1));				
	}
	return divBox;
};
//生成菜单面板的样式
//divBox:菜单面板
//level:菜单深度，用于判断是第几级菜单
Drop.prototype.BuildItemPanel=function(divBox,level)
{
	divBox.setAttribute("type","ItemPanel");
	divBox.setAttribute("level",level);
	if(level==0)
	{
		divBox.className="main";			
	}else
	{
		divBox.className="sub";	
		divBox.style.position="absolute";
		divBox.style.display="none";
		divBox.style.zIndex=level+1;
	}
	//鼠标滑入滑出事件
	divBox.attachEvent("onmouseout", this.Out(this));
	divBox.attachEvent("onmouseover", this.Over(this));
};
//生成主菜单项目
//obj,xml节点
//element,HTML元素节点
//level,深度，用于判断是否为主菜单
Drop.prototype.BuildItem=function(obj,element,level)
{
	//如果菜单项为空，则跳过
	if(obj.Name==null||obj.Name=="")return null;
	//如果为主菜单
	if(level==0)
	{
		if(obj.Type=="line")return null;
		//该菜单项不显示
		if(!obj.Visible)element.style.display="none";
		element.innerHTML=this.BuildMainBox(obj);
		//给HTML元素赋属性值
		element.setAttribute("name",obj.Name);
		element.setAttribute("url",obj.Url);
		element.setAttribute("enable",obj.Enable);
		element.className="mainItem";		
		element.setAttribute("type","Item");
	}
	//如果为子菜单
	if(level>0)
	{
		//如果为分隔符
		if(obj.Type=="line")
		{
			var hr=document.createElement("hr");
			hr.className="line";	
			//hr.innerHTML="&nbsp;";		
			return hr;
		}
		//菜单项的值
		element.innerHTML=this.BuildSubBox(obj);		
		//给HTML元素赋属性值
		element.setAttribute("name",obj.Name);
		element.setAttribute("url",obj.Url);
		element.setAttribute("enable",obj.Enable);
		element.className= "subItem";		
		element.setAttribute("type","Item");
	}
	if(!obj.Enable)element.style.color="#999999";
	return element;
};
//菜单项的宽度,当菜单项的字数增长时，菜单项也相应变宽，该方法求出其最大宽度；
Drop.prototype.setItemWidth=function(element)
{
	var maxWidth=0;
	//遍历当前节点下的节点，即菜单项；
	var childsItem=element.childNodes;
	for(var i=0;i<childsItem.length;i++)
	{
		if(childsItem[i].getAttribute("type")!="Item")continue;
		var wh=0;
		var valueWh=0;
		//遍历菜单下的各项，求其总宽
		var childs=childsItem[i].childNodes;		
		for(var j=0;j<childs.length;j++)
		{			
			wh+=childs[j].offsetWidth;
		}		
		if(wh>maxWidth)maxWidth=wh;
		if(maxWidth<this.ItemWidth)maxWidth=this.ItemWidth;
		wh=0;
	}	
	for(var i=0;i<childsItem.length;i++)
	{
		childsItem[i].style.width=maxWidth;
	}
	element.style.width=maxWidth;
};
//菜单面板的实际高度
Drop.prototype.setItemHeight=function(element)
{
	var wh=0;
	//遍历当前节点下的节点，即菜单项；
	var childsItem=element.childNodes;
	for(var i=0;i<childsItem.length;i++)
	{		
		wh+=childsItem[i].offsetHeight;
	}
	element.style.height=wh;
};
//生成主菜单项
Drop.prototype.BuildMainBox=function(obj)
{
	var name=obj.Name;
	if(obj.Type=="link")
	{
		if(obj.Enable)
			name="<a href='"+obj.Url+"' target='"+obj.Target+"'>"+obj.Name+"</a>";
	}
	return name;
};
//生成子菜单项
Drop.prototype.BuildSubBox=function(obj)
{
	var isChilds="";
	var name=obj.Name+"&nbsp;&nbsp;&nbsp;&nbsp;";
	if(obj.IsChilds)
	{
		isChilds=this.imgPath+"isChilds_1.gif";		
	}	
	if(obj.Type=="link")
	{
		if(obj.Enable)
		{
		    if(!obj.IsChilds)
	        {
			    name="<a href='"+obj.Url+"' target='"+obj.Target+"'>"+obj.Name+"</a>";
			 }else
			 {
			    name=obj.Name;
			 }
		}		
	}
	name=Drop.prototype.subBoxTable(obj.Ico,name,isChilds);
	//alert(name);
	return name;
};
//生成菜单的完整结构；
Drop.prototype.subBoxTable=function(ico,name,gif)
{
	if(ico!="")
	{
		ico="";
		//ico="<img width='16px' src='"+this.imgPath+ico+"'/>";
	}else
	{
		ico="";
	}	
	if(gif!="")
	{
		gif="<img class='gif' src='"+gif+"'/>";
	}
	ico="<div class='ico'>"+ico+"</div>";
	name="<div class='value'>"+name+"</div>";
	gif="<div class='isChilds'>"+gif+"</div>";	
	return ico+name+gif;
	//return name+gif;
};
//菜单项的事件
Drop.prototype.BuildItemEvent=function(obj,element,level)
{	
	if(obj.Type=="item")
	{
		if(obj.Enable)
			element.attachEvent("onclick", this.Click(this,obj,element));	
	}	
	element.onmouseover=function()
	{				
		if(this.getAttribute("type")=="Item")
		{			
			//清理当前节点的兄弟节点样式
			Drop.prototype.itemStyleOut(this);
			//具体的鼠标事件
			Drop.prototype.Level_over(this);
			//设定自身为选中状态
			Drop.prototype.itemStyleOver(this);			
		}
	};
	return element;
};
//当鼠标点击菜单项时,
//obj:当前菜单对象，即drop的实例，如this
//node:当前菜单项的xml节点，Node的实例
//element:已经生成的菜单项HTML
Drop.prototype.Click=function(obj,node,element)
{

	return function()
	{
		try
		{
			obj.MenuRelease=false;
			obj.allHidden();
			//将事件当成方法赋给菜单
			element.mouseOnclick=eval(node.Target);
			element.mouseOnclick();
		}catch(e){}
	}	
};
//当鼠标离开菜单项时
Drop.prototype.Out=function(obj)
{
	return function()
	{
		obj.MenuRelease=false;
		obj.intervalProcess = setTimeout(obj.innerRevert(obj), 1000);
	}
};
//当鼠标处于菜单项上时
Drop.prototype.Over=function(obj)
{
	return function()
	{
		obj.MenuRelease=true;
		if(obj.intervalProcess!=null)
		{
			clearTimeout(obj.intervalProcess);			
		}		
	}
};
//主菜单鼠标事件,当鼠标移到主菜单时，显示下拉菜单
Drop.prototype.Level_over=function(obj)
{
	//隐藏所有的菜单面板
	Drop.prototype.heddenPanel(obj.parentNode);
	//该菜单是否启用
	var enable=obj.getAttribute("enable");
	enable=enable!=null ? enable : true;
	if(!enable)
	{
		return;
	}
	//当前节点的下一节点；
	var Sibling=obj.nextSibling;
	if(Sibling==null)return;
	//如果下一个是图片，则跳到更下一个
	if(Sibling.nodeName=="IMG")
	{
		Sibling=Sibling.nextSibling;
	}
	//下个节点如果不是菜单面板，则退出
	if(Sibling.getAttribute("type")!="ItemPanel")return;	
	//显示子级菜单的面板
	Sibling.style.display="block";
	//****以下为计算，并确立显示子级菜单面板的位置
	//当前节点的在页面上的绝对位置
	var left=getLeft(obj);
	var top=getTop(obj)+obj.offsetHeight;
	//浏览器窗口宽度
	var winWidth=document.documentElement.clientWidth-20;
	var bool=false;
	//如果弹出菜单大于窗口宽度
	if((left+obj.offsetWidth+Sibling.offsetWidth)>winWidth)bool=true;
	//如果不是第一级的下拉
	if(Number(Sibling.getAttribute("Level"))>1)
	{		
		var top=obj.offsetTop+10;
		//如果子菜单面板太靠右了，则左侧显示
		if(bool)
			left=obj.offsetLeft-obj.offsetWidth+2;
		else
			left=obj.offsetLeft+obj.offsetWidth-2;
	}//
	Sibling.style.left=left+this.Left;
	Sibling.style.top=top;
	Sibling.className="sub";
	//设定宽度、高度
	this.setItemWidth(Sibling);
	//this.setItemHeight(Sibling);
};
//隐藏当前菜单的子菜单
Drop.prototype.heddenPanel=function(obj)
{
	//当前节点父级的所有子节点
	var Childs=obj.childNodes;
	for(var i=0;i<Childs.length;i++)
	{
		//必须是菜单面板
		if(Childs[i].getAttribute("type")=="ItemPanel")
		{	
			//如果还有下级菜单
			if(Childs[i].childNodes.length>0)
			{
				Drop.prototype.heddenPanel(Childs[i]);
			}
			//不能是主菜单面板
			if(Childs[i].getAttribute("level")!="0")
			{
				Childs[i].style.display="none";
				Childs[i].className="";				
			}
			Drop.prototype.substyleout(Childs[i]);					
		}
	}
};
Drop.prototype.itemStyleOut=function(obj)
{
	var parent=obj.parentNode;
	Drop.prototype.substyleout(parent);
};
//将某个节点下的子节样式还原
Drop.prototype.substyleout=function(obj)
{
	//当前节点不是菜单面板，则退出
	if(obj.getAttribute("type")!="ItemPanel")return;
	//菜单面板层深
	var level=Number(obj.getAttribute("level"));
	var items=obj.childNodes;
	for(var i=0;i<items.length;i++)
	{
		var type=items[i].getAttribute("type");
		if(type=="Item")
		{
			var css=level==0 ? "mainItem" : "subItem";			
			items[i].className=css;
		}
	}
};
//将自己设为选中状态
Drop.prototype.itemStyleOver=function(obj)
{
	//当前html标签的上级节点，如果不是菜单面板则退出
	var parent=obj.parentNode;
	if(parent.getAttribute("type")!="ItemPanel")return;
	//菜单项层深
	var level=Number(parent.getAttribute("level"));
	var type=obj.getAttribute("type");
	if(type=="Item")
	{
		var css="";
		css= level==0 ? "mainItem over" : "subItem over";	
		obj.className=css;
	}
};
//菜单滑出效果
Drop.prototype.panelGlide=function(obj)
{
};
//子菜单全部隐藏
Drop.prototype.allHidden=function()
{
	if(this.Container!=null&&this.XmlFilePath!=null)
	{		
		this.heddenPanel(this.Container);
	}
};
//内部还原菜单方法
Drop.prototype.innerRevert=function(obj)
{	
	return function()
	{
		obj.Revert();
	}	
};
//还原菜单
Drop.prototype.Revert=function()
{		
	if(this.MenuRelease==false)
		this.allHidden();
};