var NaviMenu = {
	menuElement: null,
	menuLayer: null,
	menuWrapper: null,
	topNavEntries: null,
	viewedElement: null,
	hiddenDropDowns: null,

	initialize: function() {
		this.menuElement = $('mainmenu');
		this.menuLayer = $('menu_layer');
		this.menuWrapper = $('menuWrapper');
		
		if (!this.menuElement || !this.menuLayer) {
			return false;
		}
		this.topNavEntries = this.menuElement.select('ul.menuItemList > li > a:first-child');
		this.topNavEntries.each(function(el) {
			var parentEl = el.up();			
			var hiddenMenu = parentEl.select('.hiddenMenu');
			if (hiddenMenu && hiddenMenu.length > 0) {
				el.hiddenMenu = hiddenMenu[0];
			}
			el.observe('mouseover', this.menuOver.bind(this));
			el.observe('mouseout', this.menuOut.bind(this));
		}.bind(this));
		this.menuLayer.observe('mouseover', this.layerOver.bind(this));
		this.menuLayer.observe('mouseout', this.layerOut.bind(this));
	},
	
	calculatePosition: function(el) {
		// TODO: <iframe src="" id="overwrite" style="position:absolute;z-index:-1"></iframe>
		a = el.viewportOffset();
		var left = a.left;
		
		wrap = (((document.body.clientWidth - 988) / 2) + 988) - (left + this.menuLayer.offsetWidth); //654
		if (wrap < 0) {
			left = left + wrap;
		}
	    this.menuLayer.style.left = (left - 10) + 'px';
	    
		var maxHeight = 0;
		var submenuBoxes = this.menuWrapper.select('.submenu_box');
	    submenuBoxes.each(function(el) {
	    	var height = el.getDimensions().height;
	    	if (height > maxHeight) {
	    		maxHeight = height;
	    	}
	    });
	    submenuBoxes.each(function(el) {
	    	el.style.height = maxHeight + 'px';
	    });
	    
		var lastEntries = this.menuWrapper.select('.last');
		if (lastEntries.length > 0) {
			var vertContainer = this.menuWrapper.select('.vertContainer');
			if (vertContainer.length > 0) {
				var vertContainerWidth = vertContainer[0].getDimensions().width;
				lastEntries.each(function(el) {
					if (el.getDimensions().width != vertContainerWidth) {
						el.style.width = vertContainerWidth + 'px';
					}
				});
			}
		}
		this.hideDropDowns();
	},
	
	show: function(el) {
		el.up().addClassName('hover');
		this.viewedElement = el;
		this.menuLayer.show();
	},
	
	hide: function(el) {
		el.up().removeClassName('hover');
		this.menuLayer.hide();
		if (this.hiddenDropDowns) {
			this.hiddenDropDowns.each(function(el) {
				el.style.visibility = 'visible';
			});
		}
		this.hiddenDropDowns = [];
	},
	
	hideDropDowns: function() {
		this.hiddenDropDowns = [];
		if (evilBrowserInformation.isEvil && evilBrowserInformation.evilVersion < 7) {
			$('main').select('select').each(function(el,i){
				if (el.overlaps(this.menuLayer)) {
					this.hiddenDropDowns.push(el);
					el.style.visibility = 'hidden';
				}
			}.bind(this));
		}
	},
	
	menuOver: function(ev) {
		var el = Event.element(ev);
		var hiddenMenu = el.hiddenMenu;
		if (hiddenMenu) {
			this.menuLayer.style.left = '10px';
			this.menuWrapper.update(hiddenMenu.innerHTML);
			this.show(el);
			this.calculatePosition(el);
			if (evilBrowserInformation.isEvil && evilBrowserInformation.evilVersion == 7) this.ie7ZoomFix();
		}
	},
	
	menuOut: function(ev) {
		this.hide(Event.element(ev));
	},
	
	layerOver: function(ev) {
		this.show(this.viewedElement);
		this.hideDropDowns();
	},
	
	layerOut: function(ev) {
		this.hide(this.viewedElement);
	},
	// fix for menu link salad in ie7 when zoom != 1 (Bug #246)
	ie7ZoomFix: function() {
		var els = this.menuWrapper.select('.listing > li > a');
		var cont;
		for (var i=0; i<els.length; i++) {
			cont = els[i].innerHTML
			els[i].innerHTML = '';
			els[i].innerHTML = cont;
		}
	}
};

document.observe('dom:loaded', function() {
	NaviMenu.initialize();
});