/*中文UTF*/

var _Menu = new Class();
var a = 0;

_Menu.prototype = {
	menus: Array(),
	layer: 0,
	maxLayer: -1,
	ctrlKey: Array(),
	menuKey: Array(),
	iframe: {},
	
	/*
	*	构造函数
	*/
	initialize: function (config){
		this.config = common.extend({
			isClick:		false,	//是否为点击方式
			duration:		2,		//菜单持续方式：0，按时间显示、1，鼠标离开标题时关闭、2，离开标题及菜单时关闭、3，不关闭
			timeOut:		1000,	//菜单显示时间
			delayTime:		200,	//延迟时间
			layer:			0,
			onlyInit:		1,		//此值为假时，适合于右键菜单类型，显示后也重新定位
			left:			0,
			top:			0,
			align:			3,		//对齐方式：0：中、1：上、2：右、3：下、4：左、5：按left及top的座标显示
			hoverClass:		'hover',//显示菜单时，标题的样式
			hideFunc:		null
		},
		config||{});
		document.attachEvent('onmousedown', this.containHide.bindEvent(this));
	},
	
	/*
	*	初始化标题
	*/
	initCtrl: function () {
		var ctrlObj = this.menus[this.layer].ctrlObj;
		var config = this.menus[this.layer].config;
		if(ctrlObj && !ctrlObj.initialized) {
			ctrlObj.initialized = true;
			ctrlObj._savedClass = ctrlObj.className;
			if (config.isClick && config.duration) {
				ctrlObj.on({
					click: function (e) {
						common.stop(e);
						
					}
				});
			}
			if(!config.isClick && config.duration < 3) {
				ctrlObj.on({mouseout: this.mouseout.bindEvent(this, 'ctrlKey', ctrlObj)});
			}
			ctrlObj.on({mouseover: this.mouseover.bindEvent(this, 'ctrlKey', ctrlObj)});
		}
		//this.menus[this.layer].ctrlObjClassName = ctrlObj.className;
	},
	
	initMenu: function () {
		var menuObj = this.menus[this.layer].menuObj;
		var config = this.menus[this.layer].config;
		if(menuObj && !menuObj.initialized) {
			menuObj.style.position = 'absolute';
			menuObj.initialized = true;
			if(config.duration == 2) {
				menuObj.on({mouseout: this.mouseout.bindEvent(this, 'menuKey', menuObj)});
			}
			if(config.duration > 1) {
				menuObj.on({mouseover: this.mouseover.bindEvent(this, 'menuKey', menuObj)});
			}
			if(is_ie) {
				menuObj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#666666,strength=3)";
			}
		}
	},
	
	mouseover: function (event, argu) {
//		$('r').value = (a++) + ' ' + argu[0] + '\t\t' + argu[1].id + '\t\t' + 'over' + '\n' + $('r').value;
		this.layer = this[argu[0]][argu[1].id];
		clearTimeout(this.menus[this.layer].delayTimer);
		for(layer in this.menus) {
			if(layer.toString(10) <= this.layer && this.menus[layer].hideTimer) {
				clearTimeout(this.menus[layer].hideTimer);
			}
		}
		if (is_ie && this.menus[this.layer].config.duration == 2) {
			this.containHide(event);
		}
	},
	
	mouseout: function (event, argu) {
		var X = common.pointerX(event);
		var Y = common.pointerY(event);
		this.layer = this[argu[0]][argu[1].id];
		clearTimeout(this.menus[this.layer].delayTimer);
		this.menus[this.layer].delayTimer = null;
		if (this.contain(argu[1], X, Y)) {
			return;
		}
//		$('r').value = (a++) + ' ' + argu[0] + '\t\t' + argu[1].id + '\t\t' + 'out' + '\t\t' + this.menus[this.layer].delayTimer + '\n' + $('r').value;
		for (layer in this.menus) {
			clearTimeout(this.menus[layer].hideTimer);
			this.menus[layer].hideTimer = this.hideLayer.defer(this, this.menus[layer].config.timeOut, layer);
		}

	},
	
	/*
	*	位于X，Y上的点是否在obj对象范围内
	*/
	contain: function (obj, X, Y) {
		if (!obj) {
			return false;
		}
		var pos = obj.getPos();
		
		if (X > pos.left && X < pos.left + pos.width && Y > pos.top && Y < pos.top + pos.height) {
			return true;
		} else {
			return false;
		}
	},
	

	/*
	*	触发显示
	*/
	show: function(config) {
		if (typeof config.menuid != 'string') {
			if (typeof config.menuid == 'object') {
				config.menuid = $(config.menuid);
				config.menuid = config.menuid.id;
			} else if (typeof config.ctrlid == 'string') {
				config.menuid = config.ctrlid + '_menu';
			} else if (typeof config.ctrlid == 'object') {
				config.ctrlid = $(config.ctrlid);
				config.menuid = config.ctrlid.id + '_menu';
			}
		}
		
		if (!$(config.menuid)) return false;
		
		this.layer = config.layer || this.config.layer;
		var onlyInit = common.isUndefined(config.onlyInit) ? this.config.onlyInit : config.onlyInit;
		var align = config.align || this.config.align;
		if ((onlyInit && $(config.menuid).style.display != 'none') || (align < 5 && !$(config.ctrlid))) {
			return false;
		}
//		alert(onlyInit);
	//	$('r').value = '\t' + (a++) + '\t' + $(config.menuid).state + '\n' + $('r').value;

		if (this.menus[this.layer] && this.menus[this.layer].menuKey != config.menuid) {
			this.hide();
		}
		
		this.menus[this.layer] = {
			config: {},
			menuKey: config.menuid,
			menuObj: $(config.menuid),
			ctrlObj: $(config.ctrlid)
		}
		this.menuKey[config.menuid] = this.layer;
		if (this.layer > this.maxLayer) {
			this.maxLayer = this.layer;
		}
		
		if (this.menus[this.layer].ctrlObj) {
			this.ctrlKey[this.menus[this.layer].ctrlObj.id] = this.layer;
		}
		
		common.extend(this.menus[this.layer].config, this.config);
		common.extend(this.menus[this.layer].config, config || {});
		
		if (this.menus[this.layer].ctrlObj) {
			this.initCtrl();
		}
		
		this.initMenu();
//		alert(this.menus[this.layer].config.delayTime);

	//	this.display();
		this.menus[this.layer].delayTimer = this.display.defer(this, this.menus[this.layer].config.delayTime);
	}, 
	
	/*
	*	显示菜单
	*/
	display: function() {
//		alert(this.menus[this.layer].menuObj);
		var config = this.menus[this.layer].config;
		var align = config.align;
		var ctrlObj = this.menus[this.layer].ctrlObj;
		var menuObj = this.menus[this.layer].menuObj;
		var oLeft, oTop;
		
		menuObj.style.display = '';
//		menuObj.style.visibility = 'visible';
		if (align == 5) {
			oLeft = config.left;
			oTop = config.top;
		} else {
			ctrlObj.className += ' '+ config.hoverClass;
			var pos = ctrlObj.getPos();
			oLeft = pos.left;
			oTop = pos.top;
			if (align == 0) {
				oLeft = pos.left + (ctrlObj.offsetWidth - menuObj.offsetWidth) / 2;
				oTop = pos.top + (ctrlObj.offsetHeight - menuObj.offsetHeight) / 2;
			}
			else if (align == 1) {
				oTop = pos.top - menuObj.offsetHeight;
			}
			else if (align == 2) {
				oLeft = pos.left + ctrlObj.offsetWidth;
			}
			else if (align == 3) {
				//alert(ctrlObj.offsetTop);
				oTop = pos.top + ctrlObj.offsetHeight;
			}
			else if (align == 4) {
				oLeft = pos.left - menuObj.offsetWidth;
			}
		
			if ((oLeft + menuObj.offsetWidth > body.clientWidth) && (pos.left + ctrlObj.offsetWidth - menuObj.offsetWidth >= 0)) {
				oLeft = pos.left + ctrlObj.offsetWidth - menuObj.offsetWidth;
				if (align == 2) {
					oLeft -= ctrlObj.offsetWidth;
				}
			}
			
			if (oTop + menuObj.offsetHeight > body.scrollTop + body.clientHeight) {
				oTop = pos.top + ctrlObj.offsetHeight - menuObj.offsetHeight;
				if (align == 3) {
					oTop -= ctrlObj.offsetHeight;
				}
			}
		}
		
		menuObj.style.zIndex = ++common.maxZIndex;
		menuObj.style.left = oLeft + 'px';
		menuObj.style.top = oTop + 'px';
		if(is_ie && is_ie < 7) {
			var iframe = this.iframe[this.layer];
			if(!iframe) {
				var iframe = document.createElement('iframe');
				iframe.style.display = 'none';
				iframe.style.position = 'absolute';
				iframe.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
				menuObj.parentNode.appendChild(iframe);
				this.iframe[this.layer] = iframe;
			}
			with (iframe.style) {
				top = menuObj.offsetTop;
				left = menuObj.offsetLeft;
				width = menuObj.offsetWidth;
				height = menuObj.offsetHeight;
				display = 'block';
			}
		}
	},
	
	containHide: function(event) {
		if (!this.menus.length) {
			return;
		}
		var X = common.pointerX(event);
		var Y = common.pointerY(event);
	//	$('r').value += '\n'+ X + ' ' + Y +' ';
		for (i = this.maxLayer; i >= 0; i--) {
			var layer = this.menus[i];
			if (layer) {
				if (!this.contain(layer.ctrlObj, X, Y) && !this.contain(layer.menuObj, X, Y)) {
					this.hideLayer(i);
				} else {
					break;
				}
			}
		}
		
	},
	
	/*
	*	关闭所有菜单
	*/
	hideAll: function () {
		for (layer in this.menus) {
			if(parseInt(layer) > -1) {
				this.hideLayer(layer);
			}
		}
	},

	/*
	*	关闭当前及下级菜单
	*/
	hide: function () {
		for (layer in this.menus) {
			if(parseInt(layer) >= this.layer) {
				this.hideLayer(layer);
			}
		}
	},

	/*
	*	关闭菜单
	*/
	hideLayer: function (layer) {
		window.status = a++;
		if (this.menus[layer] && this.menus[layer].menuObj) {
			try {
				this.menus[layer].ctrlObj.className = this.menus[layer].ctrlObj._savedClass;
			} catch(e) {}
			clearTimeout(this.menus[layer].timer);
	
			this.menus[layer].menuObj.style.display = 'none';
	//		this.menus[layer].menuObj.style.visibility = 'hidden';
			
			//*
			if(is_ie && is_ie < 7 && this.iframe[layer]) {
				this.iframe[layer].style.display = 'none';
			}
			//*/
			if (this.menus[layer].config.hideFunc) {
				this.menus[layer].config.hideFunc();
			}
		}
	}
}

var menu = new _Menu();

function showMenu(ctrlid, align, layer, duration, timeout) {
	var config = {};
	if(!common.isUndefined(ctrlid)) config.ctrlid = ctrlid;
	if(!common.isUndefined(align)) config.align = align;
	if(!common.isUndefined(duration)) config.duration = duration;
	if(!common.isUndefined(timeout)) config.timeout = timeout;
	if(!common.isUndefined(layer)) config.layer = layer;
	menu.show(config);
}
