function SubMenu_GetOffsetLeft(src){
	var set = 0;
	if(src)
	{
		if (src.offsetParent)
			set += src.offsetLeft + SubMenu_GetOffsetLeft(src.offsetParent);
		
		if(src.tagName != "BODY")
		{
			var x = parseInt(src.scrollLeft,10);
			if(!isNaN(x))
				set -= x;
		}
	}
	return set;
}

function SubMenu_GetOffsetTop(src){
	var set = 0;
	if(src)
	{
		if (src.offsetParent)
			set += src.offsetTop + SubMenu_GetOffsetTop(src.offsetParent);
		
		if(src.tagName != "BODY")
		{
			var y = parseInt(src.scrollTop,10);
			if(!isNaN(y))
				set -= y;
		}
	}
	return set;
}

//** 隐藏指定控件
function SubMenu_HideControl(tagName, overCtrl)
{
	if(typeof(overCtrl) == 'string') overCtrl = document.getElementById(overCtrl);
	var x = SubMenu_GetOffsetLeft(overCtrl);
	var y = SubMenu_GetOffsetTop(overCtrl);
	var w = overCtrl.offsetWidth;
	var h = overCtrl.offsetHeight;
	if (!overCtrl.overlap) overCtrl.overlap = new Array ();
	var arTags = tagName.split(",");
	for(var j = 0;j < arTags.length;j++){
		var hideTags = document.getElementsByTagName(arTags[j]);
		for (var i = 0; i < hideTags.length; ++i)
		{
			var obj = hideTags[i];
			if (!obj || !obj.offsetParent)
				continue;

			var ox = SubMenu_GetOffsetLeft(obj);
			var oy = SubMenu_GetOffsetTop(obj);
			var ow = obj.offsetWidth;
			var oh = obj.offsetHeight;

			if (ox > (x + w) || (ox + ow) < x)
				continue;
			if (oy > (y + h) || (oy + oh) < y)
				continue;

			if(obj.style.visibility == "hidden")
				continue;

			overCtrl.overlap[overCtrl.overlap.length] = obj;
			obj.style.visibility = "hidden";
		}
	}
}

function SubMenu_ShowControl(overCtrl)
{
	if(typeof(overCtrl) == 'string') overCtrl = document.getElementById(overCtrl);
	if (overCtrl.overlap)
	{
		var i;
		for (i = 0; i < overCtrl.overlap.length; ++i)
			overCtrl.overlap[i].style.visibility = "";
	}
	overCtrl.overlap = null;
}

//** end of 隐藏指定控件

//重载 setTimeout
window.SubMenu_SetTimeoutEx = function(fRef, mDelay) 
{ 
	if(typeof(fRef) == 'function')
	{ 
		var argu = Array.prototype.slice.call(arguments,2);
		var f = (function(){ fRef.apply(null, argu);});
		return window.setTimeout(f, mDelay);
	}
	return window.setTimeout(fRef,mDelay);
}
// end of 重载 setTimeout

//* 为对象绑定事件
function SubMenu_AttachEventEx(eid,env,action)
{
	var object = typeof(eid) == 'object' ? eid : document.getElementById(eid);
	if (object && object.addEventListener){
		if(/^(on)/i.test(env)) env = env.substring(2);
		object.addEventListener(env,action,true);
	}else if(object){
		object.attachEvent(env,action);
	}
}

//dettachEvent
//removeEventListener

function SubMenu_CallFunction(obj,method,args){
	var f = (function(){ method.apply(obj, args);});
	return f;
}

function SubMenu_GetEvent()
{
	if(document.all) return window.event;//如果是ie
	func = SubMenu_GetEvent.caller;
	while(func != null)
	{
		var arg0 = func.arguments[0];
		if(arg0)
		{
			if((arg0.constructor == Event || arg0.constructor == MouseEvent) ||(typeof(arg0) == "object" && arg0.preventDefault && arg0.stopPropagation))
			{
				return arg0;
			}
		}
		func = func.caller;
	}
	return null;
}

function SubMenu_FindChildrens(parentObject,checkObject)
{
	var arr = new Array();
	for(var i = 0;i < parentObject.childNodes.length;i++){
		if(parentObject.childNodes[i].tagName && parentObject.childNodes[i] != checkObject){
			arr.push(parentObject.childNodes[i]);
			var arrsub = SubMenu_FindChildrens(parentObject.childNodes[i],checkObject);
			if(arrsub.length > 0){
				for(var k = 0;k < arrsub.length;k++) arr.push(arrsub[k]);
			}
		}
	}
	return arr;
}

//direct 为显示的方向，有 top bottom left right 等，默认为 bottom
function ShowSubMenu()
{
	var SubMenu = arguments[0];
	var direct = arguments[1];
	if(!direct) direct = 'bottom';
	var handleElement = arguments[2];

	if(typeof(SubMenu) == 'string') SubMenu = document.getElementById(SubMenu);
	if(!SubMenu) return;
	if(SubMenu.style.display == '') return;
	var HideTags = 'SELECT';//'SELECT,OBJECT';
	
	if(!handleElement){
		var evt = SubMenu_GetEvent();
		handleElement = evt.srcElement || evt.target;
	}else{
		if(typeof(handleElement) == 'string') handleElement = document.getElementById(handleElement);
	}

	SubMenu_AttachEventEx(handleElement,"onmouseover",function(){SubMenu_HideControl(HideTags,SubMenu);});
	SubMenu_AttachEventEx(handleElement,"onmouseout",function(){SubMenu_ShowControl(SubMenu);});

	SubMenu_AttachEventEx(SubMenu,"onmouseover",function(){clearTimeout(SubMenu_delay.SubMenu);SubMenu.style.display = '';SubMenu_HideControl(HideTags,SubMenu);});
	SubMenu_AttachEventEx(SubMenu,"onmouseout",function(){SubMenu.style.display = 'none';SubMenu_ShowControl(SubMenu);});
	
	/*
	var subObjects = SubMenu_FindChildrens(handleElement,SubMenu);
	for(var x = 0; x < subObjects.length;x++){
		//alert(subObjects[x].tagName);
		SubMenu_AttachEventEx(subObjects[x],"onmouseover",function(){clearTimeout(SubMenu_delay[SubMenu]);ShowSubMenu(SubMenu,direct,handleElement);});
	}*/

	SubMenu.style.position = 'absolute';
	SubMenu.style.display = ''; //要先设置这个，否则后的 SubMenu.offsetWidth 等会取不到值

	if(direct == 'top'){
		SubMenu.style.left = SubMenu_GetOffsetLeft(handleElement);
		SubMenu.style.top = SubMenu_GetOffsetTop(handleElement) - SubMenu.offsetHeight + 2;
	}

	else if(direct == 'left'){
		SubMenu.style.left = SubMenu_GetOffsetLeft(handleElement) - SubMenu.offsetWidth + 2;
		SubMenu.style.top = SubMenu_GetOffsetTop(handleElement);
	}

	else if(direct == 'right'){
		SubMenu.style.left = SubMenu_GetOffsetLeft(handleElement) + handleElement.offsetWidth - 2;
		SubMenu.style.top = SubMenu_GetOffsetTop(handleElement);
	}

	else{
		SubMenu.style.left = SubMenu_GetOffsetLeft(handleElement);
		SubMenu.style.top = SubMenu_GetOffsetTop(handleElement) + handleElement.offsetHeight - 2;
	}
}

var SubMenu_delay = new Object();
function HideSubMenu(SubMenu)
{
	SubMenu_delay.SubMenu = SubMenu_SetTimeoutEx(HideSubMenuAct,100,SubMenu);
}

function HideSubMenuAct(SubMenu)
{
	if(typeof(SubMenu) == 'string') SubMenu = document.getElementById(SubMenu);
	if(!SubMenu) return;
	if(SubMenu.style.display == 'none') return;
	SubMenu.style.position = 'absolute';
	SubMenu.style.display = 'none';
}
