var dropdownMenu = Class.create({

	// Properties
	showingUpDuration: 0.4,
	hidingDuration: 0.1,
	hideDelay: 1,

	initialize: function(){
		$$("a.mL0").invoke('observe','mouseenter', this.clearDelayedHides.bind(this));
		
		$$("a.mL1").invoke('observe', 'mousemove', this.linkMouseOver.bind(this));
		$$("a.mL1").invoke('observe', 'mouseout', this.linkMouseOut.bind(this));

		$$("div.mL2").invoke('observe', 'mouseenter', this.submenuMouseOver.bind(this));
		$$("div.mL2").invoke('observe', 'mouseleave', this.submenuMouseOut.bind(this));
		
		this.positionSubMenus();
	},

	// Default Effects
	// It's possible to set user's effects handlers
	// eg: mydropdownInstance.showUpEffect = function(){ * user's effect * };
	showUpEffect: function(e, effectDuration){
		if(!e.visible()){
			new Effect.BlindDown(e, {
				duration: effectDuration,
				queue: {
					position: 'end',
					scope: e.identify(),
					limit: 2
				}
			});
		}
	},

	hidingEffect: function(e, effectDuration){
		new Effect.BlindUp(e, {
			duration: effectDuration,
			queue: {
				position: 'end',
				scope: e.identify(),
				limit: 2
			}
		});
	},

	// Mouse event handlers
	linkMouseOut: function(e){
		var dropElement = e.element().next();
		if (dropElement && dropElement.hasClassName('active')){
			this.setDelayedHide(dropElement);
		}
	},

	linkMouseOver: function(e){
		var linkElement = e.element();
		if (!linkElement) {
			return;
		}

		var dropElement = e.element().next();
		// Additional check if something wrong with menu structure
		if(!dropElement){
			return;
		}

		if (!dropElement.hasClassName('hidding')){
			dropElement.removeClassName('waitingtohide');
		}

		if (!dropElement.hasClassName('active')){
			dropElement.addClassName('active');
			this.showUpEffect(dropElement, this.showingUpDuration);
		}
		this.clearDelayedHides(dropElement);
	},

	submenuMouseOut: function(e){
		var dropElement = e.findElement("div");
		if (!dropElement.hasClassName("mL2")) {
			return;
		}
		if (dropElement && dropElement.hasClassName('active')){
			this.setDelayedHide(dropElement);
		}
	},

	submenuMouseOver: function(e){
		var dropElement = e.findElement("div");
		if (!dropElement.hasClassName("mL2")) {
			return;
		}
		if (dropElement && !dropElement.hasClassName('hidding')){
			dropElement.removeClassName('waitingtohide');
		}
		this.clearDelayedHides(dropElement);
	},

	// Delayed methods, needed for smooth subMenu hiding
	setDelayedHide: function(e){
		e.addClassName('waitingtohide')
		if(!e.hasClassName('hidding')){
			if (!e.hasClassName('hiddingtimerset')){
				e.addClassName('hiddingtimerset');
				e.delaytimer = (function(obj, e){ obj.delayedHide(e); }).delay(this.hideDelay, this, e);
			}
		}
	},

	delayedHide: function(e){
		e.removeClassName('hiddingtimerset');
		if (e.hasClassName('waitingtohide')){
			this.hidingEffect(e, this.hidingDuration);
			e.addClassName('hidding');
			//Changed to Prototype's API manner
			(function(e){
				e.removeClassName('waitingtohide');
				e.removeClassName('hidding');
				e.removeClassName('active');
			}).delay(this.hidingDuration, e);

		}
	},

	clearDelayedHides: function(curElement) {
		drop = this;
		$$("div.mL2").each(function(d) {
			if (d != curElement) {
				if (d.hasClassName('waitingtohide')) {
					window.clearTimeout(d.delaytimer);
					d.addClassName('hiddingtimerset');
					(function(drop, d){ drop.delayedHide(d); }).delay(0, drop, d);
				}
			}
		});
	},
	
	
	clearDelayedHides2: function(drop, curElement) {
		curElement = (arguments.length == 2 ? curElement : "");
		//console.log(drop);
		
		$$("div.mL2").each(function(d) {
			if (d != curElement) {
				if (d.hasClassName('waitingtohide')) {
					window.clearTimeout(d.delaytimer);
					d.addClassName('hiddingtimerset');
					(function(drop, d){ drop.delayedHide(d); }).delay(0, drop, d);
				}
			}
		});
	},

	positionSubMenus: function() {
		var menucontainers = new Array;
		$$("a.mL1").each(function(e) {
			menucontainers[menucontainers.length] = e.ancestors()[0];	
		});

		menucontainers = menucontainers.uniq();
		drop = this;
		menucontainers.each(function(element) {
			if (element.hasClassName('noReposition')) {
				return;	
			}
			var menuRB = 0;
			var menuLB = 0;
			var menuC = 0;

			menuOpts = element.childElements("a");
			menuLB = menuOpts[0].cumulativeOffset().left;
	
			for (x = (menuOpts.length - 1); x >= 0; x--) {
				if (menuOpts[x].hasClassName('mL1') || menuOpts[x].hasClassName('mL0')) {
					menuRB = menuOpts[x].cumulativeOffset().left + menuOpts[x].getDimensions().width;
					x = -1;
				}
			}
			menuC = Math.round((menuRB - menuLB) / 2) + menuLB;
			
			element.select("div.mL2").each(function(d) {
				var maxLeft = menuRB - d.getWidth();
				var p = d.previous();
				
				if (typeof(p) == "undefined") {
					console.log("Error! Sub menu without parent menu found.");
					return false;
				}
				var leftpos = (p.cumulativeOffset().left - 5 > maxLeft ? maxLeft : p.cumulativeOffset().left - 5);
				if (leftpos < menuLB) {
					leftpos = menuC - Math.round(d.getWidth() / 2);
				}
				d.setStyle({
					top: (p.cumulativeOffset().top + p.getDimensions().height) + "px",
					left: leftpos  + "px"
				});
			});
		});
	}

});


document.observe('dom:loaded', function() {
	FixMenuDividers();
	new dropdownMenu();
})

function FixMenuDividers() {
	var h = $("menuSuppliers").ancestors()[0].getHeight() - 90;
	$("menuSuppliers").select("span.menuDivider").each(function(d) {
		d.setStyle({
			height: h + "px"
		});
	});
	
	if ($('menuTools') != undefined) {
		var Tools = ['Sales','Supplier','Quote','ClubTPC'];
		$('menuTools').ancestors()[1].show();
		for (x = 0; x < Tools.length; x++) {
			if ($("tbodyMenu" + Tools[x])) {
				var h = $("tbodyMenu" + Tools[x]).getHeight();
				if (x == 0) {
					/*new Effect.Morph('menuToolsContainer', {
						style: "height: " + (h + 18) + "px;"
					});*/	
				}
				$("tbodyMenu" + Tools[x]).select("span.menuDivider").each(function(d) {
					d.setStyle({
						height: h + "px",
						marginTop: "0px"
					});
				});
			}
		}
		$('menuTools').ancestors()[1].hide();
	}
}
