//menu
function MainMenu(){
	this.initMainMenu(this,arguments);
}
MainMenu.prototype={
	initMainMenu:function(option){
		this.option=option||{};
		this.items=[];
	},
	addItem:function(item){
		this.items.push(item);
		return item;
	},
	render:function(node){
		var elm=this.renderMe();
		var menuElm=elm.firstChild;

		var items=this.items;
		for(var i=0;i<items.length;i++){
			menuElm.appendChild(items[i].render());
		}
		
		if(node) node.appendChild(elm);
		else return elm;
	},
	renderMe:function(){
		var menuElm=document.createElement('ul');
		var elm=document.createElement('div');
		elm.className='menuTree';
		elm.appendChild(menuElm);
		return elm;
	}
}
MainMenu.instance={};
MainMenu.getMenuItemById=function(id){
	return MainMenu.instance[id];
};
MainMenu.appendStyle=function(id,file){
	var style=document.createElement('link');
	style.href=file;
	style.rel='stylesheet';
	style.type='text/css';
	style.id='styleFile'+id;
	document.getElementsByTagName('head')[0].appendChild(style);
};
function MainMenuItem(){
	this.initMainMenuItem.apply(this,arguments);
}
MainMenuItem.prototype={
	initMainMenuItem:function(data,option){
		this.data=data||{};
		var id=this.data.id;
		var name=this.data.name;
		if(id&&MainMenu.instance[id]){
			alert('菜单重复:'+id);
			return;
		}
		else{
			MainMenu.instance[id]=this;
		}
		this.id=id;
		this.name=name;
		this.option=option||{};
		if(this.option.state){
			this.state=true;
		}
	},
	setChildMenu:function(childMenu){
		this.childMenu=childMenu;
	},
	clickItem:function(evt){
		var myOption=this.option;

		if(this.state)this.setState(false);
		else this.setState(true);
		
		if(myOption.clickFun)myOption.clickFun(this);
		evt.cancelBubble=true;
	},
	setState:function(state){
		if(state){
			this.state=true;
			if(this.childMenu)this.itemAElm.className='active';
			else this.itemAElm.className='active2';
		}
		else{
			this.state=false;
			if(this.childMenu)this.itemAElm.className='unactive';
			else this.itemAElm.className='unactive2';
		}
	},
	setName:function(name){
		this.name=name;
		this.itemNameElm.innerHTML=name;
	},
	render:function(node){
		var elm=this.renderMe();

		if(node) node.appendChild(elm);
		else return elm;
	},
	renderMe:function(){
		var elm=document.createElement('li');
		if(!this.id) return elm;
		var a=document.createElement('a');
		a._instance=this.id;
		a.onmouseover=this._mouseOver;
		a.onmouseout=this._mouseOut;
		a.onclick=this._click;
		if(this.childMenu){
			a.className=this.option.state?'active':'unactive';
		}
		else{
			a.className=this.option.state?'active2':'unactive2';
		}
		a.style.width=(this.option.width||42)+'px';
		//a.href='#';
		var span=document.createElement('span');
		span.innerHTML=this.name;

		if(this.childMenu){
			var div=document.createElement('div');
			with(div.style){
				position='absolute';
				left='0px';
				top='22px';
			}
			div.appendChild(this.childMenu.render());
			span.appendChild(div);
		}

		a.appendChild(span);
		elm.appendChild(a);
		this.itemNameElm=span;
		this.itemAElm=a;
		return elm;
	},
	_click:function(evt){
		evt=evt||window.event;
		var _this=MainMenu.instance[this._instance];
		_this.clickItem(evt);
	},
	_mouseOver:function(){
		var _this=MainMenu.instance[this._instance];
		if(!_this.childMenu){
			this.className='active2';
		}
		else{
			this.className='active';
			_this.childMenu.show();
		}
	},
	_mouseOut:function(elm,evt){
		var _this=MainMenu.instance[this._instance];
		if(!_this.childMenu){
			if(!_this.state)this.className='unactive2';
		}
		else{
			this.className='unactive';
			_this.childMenu.hidden();	
		}
	}
}
function ChildMenu(option){
	this.initChildMenu.apply(this,arguments);
}
ChildMenu.prototype={
	initChildMenu:function(option){
		this.option=option||{};
		this.obj=null;
		this.items=[];
	},
	addItem:function(item){
		item.setParent(this);
		this.items.push(item);
		return item;
	},
	show:function(){
		var obj=this.obj;
		obj.style.display='block';
	},
	hidden:function(){
		this.obj.style.display='none';
	},
	render:function(node){
		var obj=this.renderMe();
		var elm=obj.firstChild;
		var items=this.items;
		var width=this.option.width||100;
		for(var i=0;i<items.length;i++){
			items[i].setWidth(width);
			elm.appendChild(items[i].render());
		}
		this.obj=obj;
		if(node)node.appendChild(obj);
		else return obj;
	},
	renderMe:function(){
		var div=document.createElement('div');
		div.className='menudiv';
		div.style.display='none';
		var ul=document.createElement('ul');
		div.appendChild(ul);
		return div;
	}
}
function MenuItem(){
	this.initMenuItem.apply(this,arguments);
}
MenuItem.prototype={
	initMenuItem:function(data,option){
		this.data=data||{};
		var id=this.data.id;
		var name=this.data.name;
		if(id&&MainMenu.instance[id]){
			alert('菜单重复:'+id);
			return;
		}
		else{
			MainMenu.instance[id]=this;
		}
		option=option||{};
		this.id=id;
		this.name=name;
		this.setOption(option);
	},
	setOption:function(option){
		var myOption=this.option=this.option||{type:'button',width:100,clickFun:null};
		for(var item in option){
			myOption[item]=option[item];
		}
	},
	setParent:function(menu){
		this.parent=menu;
	},
	getParent:function(){
		return this.parent;
	},
	setChildMenu:function(menu){
		this.childMenu=menu;
	},
	getChildMenu:function(){
		return this.childMenu;
	},
	clickItem:function(evt){
		var myOption=this.option;
		if(myOption.disabled)return;
		if(myOption.type=='check'){
			if(this.isCheck){
				this.unSelect();
			}
			else{
				this.select();
			}
		}
		else if(myOption.type=='radio'){
			var items=this.parent.items;
			if(!this.isCheck){
				for(var i=0;i<items.length;i++){
					var itemOption=items[i].option;
					if(itemOption.type=='radio'&&itemOption.group==myOption.group){
						items[i].unSelect();
					}
				}
				this.select();
			}
			else{
				this.unSelect();
			}
		}
		else{
		}
		if(myOption.clickFun)myOption.clickFun(this);
		evt.cancelBubble=true;
	},
	select:function(){
		this.chkSignElm.firstChild.style.display='';
		this.isCheck=true;
	},
	unSelect:function(){
		this.chkSignElm.firstChild.style.display='none';
		this.isCheck=false;
	},
	setWidth:function(w){
		this.option.width=w;
	},
	render:function(){
		var elm=this.renderMe();
		if(!this.id) return elm;
		var _this=this;
		if(!this.childMenu){
			elm.onclick=this._click;
		}
		elm.onmouseover=this._onmouseover;
		elm.onmouseout=this._onmouseout;
		if(this.childMenu){
			this.childElm.appendChild(this.childMenu.render());
			this.chkSignElm.firstChild.style.display='none';
			this.childSignElm.style.display='';
		}
		return elm;
	},
	renderMe:function(){
		var elm=this.obj=document.createElement('li');
		elm._instance=this.id;
		if(!this.id){
			elm.className='line';
			return elm;
		}
		//elm.className='unaction';
		if(this.option.width)elm.style.width=this.option.width+'px';
		
		this.chkSignElm=document.createElement('div');
		this.chkSignElm.className='leftimg';
		var displayStr='display:none';
		if(this.option.state){
			displayStr='';
			this.isCheck=true;
		}
		if(this.option.type=='check')this.chkSignElm.innerHTML='<IMG src="http://static.o.cn/images/menu/selec_d.gif" style="'+displayStr+'">';
		else this.chkSignElm.innerHTML='<IMG src="http://static.o.cn/images/menu/selec_dot.gif" style="'+displayStr+'">';
		
		this.childSignElm=document.createElement('div');
		this.childSignElm.className='rightimg';
		this.childSignElm.style.display='none';
		this.childSignElm.innerHTML='<IMG src="http://static.o.cn/images/menu/arr_right.gif">';
		
		this.itemNameElm=document.createElement('a');
		this.itemNameElm.innerHTML=this.name;
		
		this.childElm=document.createElement('div');
		this.childElm.className='menuChild';
		
		elm.appendChild(this.chkSignElm);
		elm.appendChild(this.childSignElm);
		elm.appendChild(this.itemNameElm);
		elm.appendChild(this.childElm);
		return elm;
	},
	_click:function(evt){
		evt=evt||window.event;
		var _this=MainMenu.instance[this._instance];
		_this.clickItem(evt);
	},
	_onmouseover:function(){
		var _this=MainMenu.instance[this._instance];
		this.style.backgroundColor='#efd';
		var child=_this.getChildMenu();
		if(child)child.show();
	},
	_onmouseout:function(elm,evt){
		var _this=MainMenu.instance[this._instance];
		this.style.backgroundColor='';
		var child=_this.getChildMenu();
		if(child)child.hidden();
	}
};


//util
var menuUtil={
	getMenu:function(menu,option){
		var mainMenu=new MainMenu(option);
		for(var i=0;i<menu.length;i++){
			var m=menu[i];
			var mainMenuItem=mainMenu.addItem(new MainMenuItem(m,m.option));
			if(m.menu)mainMenuItem.setChildMenu(this.getChildMenu(m.menu));
		}
		return mainMenu;
	},
	getChildMenu:function(data,option){
		var menu=new ChildMenu(option);
		for(var i=0;i<data.length;i++){
			var o=data[i];
			var menuItem=menu.addItem(new MenuItem(o,o.option));
			if(o.menu){
				menuItem.setChildMenu(this.getChildMenu(o.menu));
			}
		}
		return menu;
	},
	getMenuDataFromDb:function(database){
		var menu=[];
		var dbMap={};
		for(var i=0;i<database.length;i++){
			var elm=database[i];
			//elm.option={type:'radio',group:1,clickFun:loadSign};
			dbMap[elm.id]=elm;
		}

		for(var i=0;i<database.length;i++){
			var elm=database[i];
			if(!elm.parent){
				menu.push(elm);
			}
			else{
				if(!dbMap[elm.parent]['menu']){
					dbMap[elm.parent]['menu']=[];
				}
				dbMap[elm.parent]['menu'].push(elm);
			}
		}
		return menu;
	}
};
MainMenu.appendStyle('menuCss','http://static.o.cn/css/menu.css');