// #PLib::PLoad('PLib.Dom.Client.prototype');
// #PLib::PLoad('PLib.Dom.Client.Scriptaculous.scriptaculous');
// #PLib::PLoad('PLib.Dom.Client.Scriptaculous.effects');

var GregorichMasterTemplate = Class.create();

GregorichMasterTemplate.prototype = {
	initialize: function() {
		Event.observe(window, 'load', this.bindToDocument.bindAsEventListener(this));
	},
	
	bindToDocument: function(event) {
		var ctrls = document.getElementsByClassName('sub_menu_closed');

		var listener = this.menuOver.bindAsEventListener(this);
		var outListener = this.menuOut.bindAsEventListener(this);
		ctrls.each(function(ctrl)
		{
			ctrl.hide();
			var par = ctrl.up('li.menu_item');
			Event.observe(par, 'mouseover', listener);
			Event.observe(par, 'mouseout', outListener);
		});
	},
		
	menuOver: function(event)
	{
	//	alert('do not disturb');
		if(!this.dnd)
		{
			var el = Event.element(event);
			if(el)
			{
				var el = $(el);
				if(!el.hasClassName('menu_item'))
				{
					el = el.up('li.menu_item');
				}
			//	alert(el);
				this.openMenuItem(el, 1);
			}
		}
	},
	
	menuOut: function(event)
	{
		var el = Event.element(event);
		if(!el.hasClassName('menu_item'))
		{
			el = el.up('li.menu_item');
		}

	//	alert(event.relatedTarget);
	//	alert(event.fromElement);
		var rel = $(event.relatedTarget || event.toElement);
		if(rel)
		{
			if(!rel.hasClassName('menu_item'))
			{
				rel = rel.up('li.menu_item');
			}
		}
		
		if(!rel)
		{
		//	alert(el.menuOpenLevel);
			this.closeMenuItemDeep(el);
			return;
		}
		
	//	var lvl = this.getMenuItemLvl(rel);
		if(rel.menuOpenLevel > 0)
		{// alert('aha' + rel.menuOpenLevel);
		//	alert(el.menuOpenLevel);
	//	alert(el.inspect());
	//	alert(rel.inspect());
		//	alert(el.innerHtml);
		//	alert('path.' + rel.innerHtml);
		//	alert(rel.menuOpenLevel);
		//	alert(el.menuOpenLevel);
		//	alert(this.getMenuItemLevel(el));
	//	alert(rel.menuOpenLevel);
			var lvl = this.getMenuItemLevel(rel);
			
	//		alert(lvl);
			
	//		alert(this.getRealLevel(rel));
			
			while(lvl < this.getMenuItemLevel(el))
			{
	//		alert(el.inspect());
				this.closeMenuItem(el);
				el = el.up('li.menu_item');
			}
			if(el.down('a').innerHtml != rel.down('a').innerHtml)
			{//alert('interesting');
				this.closeMenuItem(el);
			}
		//	alert('doh');
			return;

		}
		else
		{
		//	alert(rel.menuOpenLevel);
			
			var rel_up = rel.up('li.menu_item');
			var lvl;
			if((rel_up) && (lvl = this.getMenuItemLevel(rel_up)))
			{
		//
		//	alert(el.inspect());
	//
	
	//	alert('path..' + rel_up.menuOpenLevel);
	//	alert('path..' + el.menuOpenLevel);
	//	alert(el.inspect());
				while(lvl < this.getMenuItemLevel(el))
				{
					this.closeMenuItem(el);
					el = el.up('li.menu_item');
				}
				this.openMenuItem(rel, lvl + 1);
			}
			else
			{
			//	alert('häh');		
				this.closeMenuItemDeep(el);
			}
		}
	},
	
	openMenuItem: function(ctrl, level)
	{
	//	alert(ctrl);
		if(!ctrl)
		{
			return;
		}
		if(level == 1)
		{
			this.dnd = true;
		}
	//	alert('open' + ctrl.inspect());
		ctrl.menuOpenLevel = level;
		var sub = ctrl.down('ul.sub_menu_closed');
		
		if(!sub)
		{
			this.openMenuItem(ctrl.up('li.menu_item'), level - 1);
			return;
		}
	/*	if(sub.visible)
		{
			return;
		}*/
		sub.setStyle({
		  position: 'absolute',
		  left: ctrl.getWidth().toString() + 'px',
		  top: '0px' 
		});
		if(!sub.visible())
		{
	  new Effect.Opacity(sub,
	    { duration: 0.4, 
	      transition: Effect.Transitions.linear, 
	      from: 0.5, to: 1.0 });	
	    }	
		sub.show();
		sub.makePositioned();
	//	alert(sub);
	},
	
	closeMenuItem: function(ctrl)
	{//alert('closer' + ctrl.menuOpenLevel);
		if(!ctrl)
		{
			return false;
		}
		if(ctrl.menuOpenLevel == 1)
		{
			this.dnd = false;
		} 
		ctrl.menuOpenLevel = 0;
		var sub = ctrl.down('ul.sub_menu_closed');
		
		if(!sub)
		{
			return true;
		}
	/*	if(!sub.visible)
		{
			return true;
		}*/
		sub.hide();
	//	alert(sub.inspect());
		return true;
	},
	
	closeMenuItemDeep: function(el)
	{
			while(true)
			{
				if(!this.closeMenuItem(el))
				{
					break;
				}
				el = el.up('li.menu_item');
			}
	},
	
	getMenuItemLevel: function(el)
	{
		if(el.menuOpenLevel)
		{
			return el.menuOpenLevel;
		}
		return this.getRealLevel(el);
	},
	
	getRealLevel: function(el)
	{
		var ret = 1;
		var tmp = el;
		while(tmp = tmp.up('li.menu_item'))
		{
			ret++;
		}
		return ret;
	}
}

var gregorichMasterTemplate = new GregorichMasterTemplate();

