var MainMenu = new Class({
	initialize: function(menu, active_class, cat_class) {
		this.menu = $(menu);
		this.active_class = active_class;
		this.cat_class = cat_class;
		
		this.timeout = 5000;
		
		this.setActionHandlers();
	}
});

MainMenu.implement({
	
	setActionHandlers: function() {
		
		var obj = this;
		obj.active = null;
		
		this.initHover();
		this.initSubLi();
		this.initCat();
		
	},
	
	initHover: function() {
		
		var obj = this;
		var timer = null;
		var li = obj.menu.getFirst('ul').getChildren('li');
		var active = li.filter('.' + obj.active_class)[0];
		
		li.each(function(el) {
			
			el.addEvent('mouseenter', function() {
				
				timer = $clear(timer);
				
				li.each(function(els) {
					els.removeClass(obj.active_class);
				});
				el.addClass(obj.active_class);
			});
		});
		
		obj.menu.addEvent('mouseleave', function() {
			
			active = active ? active : obj.active;
			
			var f = function() {
				
				li.each(function(els) {
					els.removeClass(obj.active_class);
				});
				
				if (active) {
					
					active.addClass(obj.active_class);
				};
			};
			
			var switcher = f.create();
			
			timer = switcher.delay(obj.timeout);
		});
	},
	
	initSubLi: function() {
		
		var obj = this;
		var li = obj.menu.getFirst('ul').getChildren('li');
		var active = li.filter('.' + obj.active_class)[0];
		var left_edge = li[0].getCoordinates().left;
		var right_edge = li[li.length - 1].getCoordinates().right;
		
		li.each(function(el) {
			
			var sub_ul = el.getFirst('ul');
			var sub_li = el.getElements('li');
			var sub_width = 0;
			
			if (sub_ul) {
				
				sub_ul.addClass('visible');
				
				sub_li.each(function(el) {
					
					sub_width += el.getCoordinates().width;
				});
				
				var coords = el.getCoordinates();
				var left_pos = coords.width/2 - sub_width/2;
				
				sub_ul.setStyles({
					width: sub_width,
					left: left_pos
				});
				
				if (sub_ul.getCoordinates().left < left_edge) sub_ul.setStyle('left', left_pos + left_edge - sub_ul.getCoordinates().left);
				if (sub_ul.getCoordinates().right > right_edge) sub_ul.setStyle('left', left_pos + right_edge - sub_ul.getCoordinates().left - sub_width);
				
				sub_ul.removeClass('visible');
			};
			
		});
	},
	
	initCat: function() {
		
		var obj = this;
		
		$$('.' + obj.cat_class).addEvent('click', function(e) {
			new Event(e).stop();
			e.target.getParent().addClass(obj.active_class);
			obj.active = e.target.getParent();
		})
	}
});
