blaze.createPackage("blaze.ui");

blaze.ui.MenuSettings=function(args){
	this.orientation="horizontal";
	this.alignment="left";
	this.showDuration=50;
	this.hideDuration=500;
	this.offsetX=-5;
	this.offsetY=5;
	this.moreIcon=blaze.getBase("/lib/ui/menu/more/caret.gif");
	for(var a in args){this[a]=args[a];}
	if(this.moreIcon&&this.moreIcon.indexOf(".")<0){this.moreIcon=blaze.getBase("/lib/ui/menu/more/"+this.moreIcon+".gif");}
}

blaze.ui.MenuBar=function(el,settings){
	this.menuBar=this;
	this.element=blaze.getElement(el);
	this.items=[];
	this.selectedItem=null;
	this.isMenuBar=true;
	this.redraw=false;
	this.domNode=null;
	this.cssClass=null;
	this.settings=settings;
	if(!this.element&&el){for(var a in el){this[a]=el[a];}}
	if(!this.settings){this.settings=new blaze.ui.MenuSettings();}
	this.init();
}

blaze.ui.MenuBar.domNode=null;
blaze.ui.MenuBar.getDOMNode=function(){
	var r=blaze.ui.MenuBar.domNode;
	if(!r){r=blaze.addElement(document.body,"div",{id:"menus","class":"menus"});}
	blaze.ui.MenuBar.domNode=r;
	return r;
}

blaze.ui.MenuBar.prototype.init=function(){
	blaze.ui.MenuBar.addStylesheet();
	var el=this.element;
	if(el&&el.tagName=="UL"){
		this.acquire(el,this.redraw);
	}else{
		this.element=null;
		this.draw(el);
	}
}

blaze.ui.MenuBar.addStylesheet=function(){
	var sn="menuStyleSheet";
	var ss=document.getElementById(sn);
	if(!ss){ss=blaze.loadStyle("/lib/ui/menu/menu.css",true,sn);}
}

blaze.ui.MenuBar.prototype.getDOMNode=function(){
	var n=this.domNode;
	if(!n){
		n=blaze.addElement(blaze.ui.MenuBar.getDOMNode(),"div");
		if(this.cssClass){blaze.addClassName(n,this.cssClass);}
		if(this.id){n.id=this.id;}
		var el=this.element;
		if(el&&el.id){blaze.addClassName(n,el.id);}
	}
	return n;
}

blaze.ui.MenuBar.prototype.draw=function(p){
	if(p){this.parentNode=blaze.getElement(p);}
	var el=this.element;
	if(el){el.parentNode.removeChild(el);}
	el=blaze.addElement(p,"ul",{"class":this.getCSSClass()});
	for(var i=0;i<this.items.length;i++){this.items[i].draw(el);}
}

blaze.ui.MenuBar.prototype.addItem=function(args){
	if(!args){return;}
	var item=new blaze.ui.MenuItem(args);
	item.menuBar=this;
	item.parent=this;
	item.index=(this.items.push(item)-1);
}

blaze.ui.MenuBar.prototype.removeItem=function(key){
	var item=null;
	if(key.isMenuItem){item=key;}
	if(!item&&typeof(key)=="number"&&key<this.items.length&&key>-1){item=this.items[key];}
	if(!item&&typeof(key)=="string"){
		for(var i=0;i<this.items.length;i++){
			if(this.items[i].value.equals(key,true)){item=this.items[i];}
		}
	}
	if(!item){return false;}
	if(item.element){item.element.parentNode.removeChild(item.element);}
	if(item&&item.index){this.items.splice((item.index-1),1);}
	return true;
}

blaze.ui.MenuBar.prototype.acquire=function(el,redraw){
	el=blaze.getElement(el);
	if(!el){return false;}
	if(el.tagName!="UL"){return false;}
	if(redraw){blaze.addClassName(el,this.getCSSClass());}
	this.element=el;
	var lis=el.childNodes;
	var a=[];
	for(var i=0;i<lis.length;i++){a.push(lis[i]);}
	for(var i=0;i<a.length;i++){
		var li=a[i];
		if(li.tagName=="LI"){
			var item=new blaze.ui.MenuItem.fromDOM(li);
			if(item){
				if(redraw){el.removeChild(li);}
				this.addItem(item);
				if(!redraw){item.apply(li);}
			}
		}
	}
	if(redraw){
		for(var i=0;i<this.items.length;i++){
			this.items[i].draw(el,"li");
		}
	}
	return true;
}

blaze.ui.MenuBar.prototype.getCSSClass=function(){
	var s=this.settings;
	var o="";if(s.orientation){o="orientation-"+s.orientation;}
	var a="";if(s.alignment){a="alignment-"+s.alignment;}
	return ("menubar "+o+" "+a).trim();
}

blaze.ui.MenuItem=function(args){
	if(args&&args.isMenuItem){return args;}
	this.parentNode=null;
	this.element=null;
	this.link=null;
	this.label=null;
	this.value=null;
	this.href=null;
	this.target=null;
	this.icon=null;
	this.parent=null;
	this.submenu=null;
	this.menuBar=null;
	this.index=null;
	this.isMenuItem=true;
	this.onclick=null;
	this.onmouseover=null;
	this.onmouseout=null;
	this.domNode=null;
	this.cssClass=null;
	if(args){for(var a in args){this[a]=args[a];}}
}

blaze.ui.MenuItem.prototype.getDOMNode=function(){
	var n=this.domNode;
	if(!n){
		n=blaze.addElement(this.parent.getDOMNode(),"div");
		if(this.cssClass){blaze.addClassName(n,this.cssClass);}
		var el=this.element;
		if(el&&el.id){blaze.addClassName(n,el.id);}
	}
	return n;
}

blaze.ui.MenuItem.fromDOM=function(el){
	el=blaze.getElement(el);
	if(!el){return null;}
	var a=null;var sm=null;
	var c=el.childNodes;
	for(var i=0;i<c.length;i++){
		if(c[i].tagName=="A"){a=c[i];}
		if(c[i].tagName=="UL"||c[i].tagName=="DIV"){sm=c[i];}
	}
	if(!a){return null;}
	var item=new blaze.ui.MenuItem();
	item.link=a;
	item.label=a.innerHTML;
	item.href=a.href;
	item.target=a.target;
	if(sm){
		var menu=new blaze.ui.Menu.fromDOM(sm);
		if(menu){item.addMenu(menu);}
	}
	return item;
}

blaze.ui.MenuItem.fromJSON=function(json){
	json=blaze.getJSON(json);
	if(!json){return;}
	var mi=new blaze.ui.MenuItem();
	for(var a in json){
		if(a=="items"){
			var m=mi.addMenu();
			for(var i=0;i<json[a].length;i++){
				var item=blaze.ui.MenuItem.fromJSON(json[a][i]);
				if(item!=null){m.addItem(item);}
			}
		}else{
			mi[a]=json[a];
		}
	}
	return mi;
}

blaze.ui.MenuItem.prototype.getSubMenu=function(){
	if(this.submenu&&this.submenu.isMenu){return this.submenu;}
	this.submenu=new blaze.ui.Menu({
		parentNode:this.element,
		menuBar:this.menuBar,
		settings:this.menuBar.settings,
		parent:this
	});
	return this.submenu;
}

blaze.ui.MenuItem.prototype.addMenu=function(menu){
	if(!menu.isMenu){return null;}
	menu.parent=this;
	menu.menuBar=this.menuBar;
	if(this.parent&&this.parent.isMenu){
		menu.parentMenu=this.parent;
	}
	this.submenu=menu;
	return menu;
}

blaze.ui.MenuItem.prototype.redraw=function(p){
	this.element=null;
	this.draw(p);
}

blaze.ui.MenuItem.prototype.draw=function(p,tag){
	if(this.element){return;}
	if(p){this.parentNode=blaze.getElement(p);}
	p=this.parentNode;
	if(!p&&this.parent.element){p=this.parent.element;}
	if(!p){return;}
	blaze.ui.MenuBar.addStylesheet();
	var c=this.submenu;
	var s={moreIcon:null};
	if(this.parent&&this.parent.getSettings){s=this.parent.getSettings();}
	if(!tag){tag="div";}
	if(p){
		this.element=blaze.addElement(p,tag,{"class":"item"});
		this.link=blaze.addElement(this.element,"a",{href:this.href,target:this.target},this.label);
		if(c){blaze.addClassName(this.link,"parent");}
		if(this.icon){
			var icn=blaze.createIcon(this.icon);
			icn.className="icon";
			this.link.insertBefore(icn,this.link.firstChild);
		}
		if(c&&s.moreIcon){
			var icn=blaze.createIcon(s.moreIcon);
			icn.className="moreIcon";
			this.link.insertBefore(icn,this.link.firstChild);
		}
		this.bind();
	}
	if(c){c.draw();}
}

blaze.ui.MenuItem.prototype.apply=function(el){
	this.element=blaze.getElement(el);
	el=this.element;
	if(!el){return;}
	blaze.addClassName(el,"item");
	var a=this.link;
	if(!a){a=el.getElementsByTagName("a")[0];}
	if(!a){return;}
	var c=this.submenu;
	if(c){
		blaze.addClassName(a,"parent");
		var s={moreIcon:null};
		var p=this.parent;
		if(p&&p.getSettings){s=p.getSettings();}
		if(c&&s.moreIcon){
			var icn=blaze.createIcon(s.moreIcon);
			icn.className="moreIcon";
			a.insertBefore(icn,a.firstChild);
		}
	}
	this.bind();
	if(c){c.draw();}
}

blaze.ui.MenuItem.prototype.bind=function(el){
	var a
	if(el){a=el.getElementsByTagName("a")[0];}else{el=this.element;a=this.link;}
	
	if(!el||!a){return;}
	var caller=this;
	a.onclick=function(){caller.hide();caller.fire("onclick");}
	el.onmouseover=function(){caller.show();caller.fire("onmouseover");}
	el.onmouseout=function(){caller.hide();caller.fire("onmouseout");}
}

blaze.ui.MenuItem.prototype.fire=function(en){
	if(typeof(this[en])=="function"){this[en](this);}
	if(typeof(this.submenu&&this.submenu[en])=="function"){this.submenu[en](this);}
}

blaze.ui.Menu=function(args){
	if(args&&args.isMenu){return args;}
	this.id=null;
	this.isVisible=false;
	this.selectedItem=null;
	this.parentNode=null;
	this.parentMenu=null;
	this.element=null;
	this.settings=null;
	this.items=[];
	this.root=this;
	this.hideTimeout=null;
	this.showTimeout=null;
	this.isMenu=true;
	this.parent=null;
	this.menuBar=null;
	this.menuItem=null;
	this.selected=null;
	this.x=0;
	this.y=0;
	this.domNode=null;
	this.cssClass=null;
	this.onshow=null;
	this.onhide=null;
	this.onmouseover=null;
	this.onmouseout=null;
	this.onclick=null;
	this.hasFocus=false;
	if(args){for(var a in args){this[a]=args[a];}}
}

blaze.ui.Menu.current=null;

blaze.ui.Menu.prototype.getDOMNode=function(){
	var n=this.domNode;
	if(!n){
		n=blaze.addElement(this.parent.getDOMNode(),"div");
		if(this.cssClass){blaze.addClassName(n,this.cssClass);}
		var el=this.element;
		if(el&&el.id){blaze.addClassName(n,el.id);}
	}
	return n;
}

blaze.ui.Menu.fromDOM=function(el){
	el=blaze.getElement(el);
	if(!el){return null;}
	if(el.tagName!="UL"&&el.tagName!="DIV"){return null;}
	blaze.addClassName(el,"menu");
	var menu=new blaze.ui.Menu();
	var lis=el.childNodes;
	for(var i=0;i<lis.length;i++){
		var li=lis[i];
		if(li.tagName=="LI"||li.tagName=="DIV"){
			var item=new blaze.ui.MenuItem.fromDOM(li);
			if(item){menu.addItem(item);}
		}
	}
	return menu;
}

blaze.ui.Menu.fromJSON=function(json){
	json=blaze.getJSON(json);
	var m=new blaze.ui.Menu();
	for(var a in json){
		if(a=="items"){
			for(var i=0;i<json[a].length;i++){
				var item=blaze.ui.MenuItem.fromJSON(json[a][i]);
				m.addItem(item);
			}
		}else{
			m[a]=json[a];
		}
	}
	return m;
}

blaze.ui.Menu.prototype.setCurrent=function(){
	var c=blaze.ui.Menu.current;
	if(c&&c.element){blaze.removeClassName(c.element,"current");c=null;}
	if(this.element){c=this;blaze.addClassName(c.element,"current");}
}

blaze.ui.Menu.prototype.isRoot=function(){
	return (this.parent==null);
}

blaze.ui.Menu.prototype.draw=function(p){
	if(p){p=blaze.getElement(p);}
	if(!p){p=this.getDOMNode();}
	if(!p){return;}
	this.parentNode=p;
	this.element=blaze.addElement(p,"div",{"class":"menu"});
	for(var i=0;i<this.items.length;i++){this.items[i].draw();}
}

blaze.ui.Menu.prototype.addItem=function(args){
	var item=new blaze.ui.MenuItem(args);
	item.parent=this;
	item.menuBar=this.menuBar;
	item.index=(this.items.push(item)-1);
	return item;
}

blaze.ui.Menu.prototype.getMenuItem=function(){
	if(!this.menuItem){
		var mi=this.parent;
		if(mi&&mi.isMenuItem){this.menuItem=mi;}
	}
	return this.menuItem;
}

blaze.ui.Menu.prototype.getParentMenu=function(){
	if(!this.parentMenu){
		var p=this.parent;
		if(p&&p.parent){this.parentMenu=p.parent;}
	}
	return this.parentMenu;
}

blaze.ui.Menu.prototype.getSettings=function(){
	if(!this.settings){
		var mb=this.getMenuBar();
		if(mb&&mb.settings){this.settings=mb.settings;}
		if(!this.settings){this.settings=new blaze.ui.MenuSettings();}
	}
	return this.settings;
}

blaze.ui.Menu.prototype.getMenuBar=function(){
	var mb=this.menuBar;
	if(mb){return mb;}
	var p=this.parent;
	while(!p.isMenuBar){
		if(p.menuBar){return p.menuBar;break;}
		p=p.parent;
		if(!p){return null;}
	}
}

blaze.ui.Menu.prototype.getCoords=function(){
	var x=this.x;
	var y=this.y;
	var mi=this.getMenuItem();
	var s=this.getSettings();
	var isTop=true;	
	if(mi){
		var c=blaze.getCoords(mi.element);
		x=c.x;y=c.y;
		if(mi.parent.isMenu){isTop=false;}
		if(isTop){
			if(s.orientation=="horizontal"){
				y+=mi.element.offsetHeight;
			}
		}else{
			if(s.alignment=="left"){
				x+=mi.element.offsetWidth;
			}
			x=x+s.offsetX;
			y=y+s.offsetY;
		}
	}
	return {x:x,y:y};
}

blaze.ui.MenuItem.prototype.show=function(force){
	var p=this.parent;
	p.hasFocus=true;
	if(!force&&p.isMenuBar){
		window.clearTimeout(p.showTimeout);
		p.showTimeout=blaze.setTimeout(this,"show",true,p.settings.showDuration);
		return;
	}
	var s=this.submenu;
	p.selectedItem=this;
	window.clearTimeout(p.hideTimeout);
	if(p&&p.selected&&p.selected!=s){p.selected.hide();}
	if(s){s.show();}
}

blaze.ui.Menu.prototype.show=function(x,y){
	if(this.items.length<1){return;}
	var el=this.element;
	if(!el){return;}
	if(x||y){
		var c={x:x,y:y};
	}else{
		var c=this.getCoords();
	}
	var s=el.style;
	s.top=c.y+"px";
	s.left=c.x+"px";
 	s.display="block";
	s.visibility="visible";
	this.isVisible=true;
	var p=this.getParentMenu();
	if(p){p.selected=this;}
	this.setCurrent();
	menuManager.add(this);
	menuManager.toggleSelects();
	this.fire("onshow");
}

blaze.ui.MenuItem.prototype.hide=function(){
	var p=this.parent;
	p.hasFocus=false;
	window.clearTimeout(p.showTimeout);
	if(p.selectedItem==this){p.selectedItem=null;}
	if(p.selected&&!p.isMenuBar){return;}
	if(p.isMenuBar){p=p.selected;}
	if(!p){return;}
	window.clearTimeout(p.hideTimeout);
	p.hideTimeout=blaze.setTimeout(p,"hide",null,p.settings.hideDuration);
}

blaze.ui.Menu.prototype.hide=function(){
	if(this.hasFocus){return;}
	menuManager.remove(this);
	var el=this.element;
	if(!el){return;}
	el.style.display="none";
	this.isVisible=false;
	var p=this.getParentMenu();
	if(p.selected==this){p.selected=null;}
	if(this.selected){this.selected.hide();}
	if(p&&p.hide&&p!=this&&p.hasFocus==false){p.hide();}
	menuManager.toggleSelects();
	this.fire("onhide");
}

blaze.ui.Menu.prototype.fire=function(en){
	if(typeof(this[en])=="function"){this[en](this);}
}

blaze.ui.MenuManager=function(){
	this.selected=[];
	this.onclick=null;
	this.window=null;
}
blaze.ui.MenuManager.prototype.hideAll=function(){
	this.selected.reverse();
	for(var i=0;i<this.selected.length;i++){
		this.selected[i].hide();
	}
	this.selected=[];
}
blaze.ui.MenuManager.prototype.add=function(menu){
	this.selected.push(menu);
}
blaze.ui.MenuManager.prototype.remove=function(menu){
	for(var i=0;i<this.selected.length;i++){
		if(this.selected[i]==menu){
			this.selected.splice(i,1);
			return;
		}
	}
}
blaze.ui.MenuManager.prototype.update=function(){
	for(var i=0;i<this.selected.length;i++){
		if(this.selected[i].isVisible==false){this.selected.splice(i,1);}
	}
}
blaze.ui.MenuManager.prototype.toggleSelects=function(){
	this.update();
	blaze.toggleSelects((this.selected.length<1));
}
blaze.ui.MenuManager.prototype.documentClick=function(){
	if(typeof(this.onclick)=="function"){this.onclick();}
	this.hideAll();
}
blaze.ui.MenuManager.prototype.bindWindow=function(){
	var win=window;
	if(document.all){win=document;}
	this.onclick=win.onclick;
	var caller=this;
	win.onclick=function(){caller.documentClick();}
}

if(!window.menuManager){window.menuManager=new blaze.ui.MenuManager();}
menuManager.bindWindow();