var navigation = {
	config: {
		container:'#nav',
		arrow:{style:'arrow',element:'div'},
		slideSpeed:250,
		timeoutSpeed:500
	},
	
	openIndicies: [],
	
	submenus: [],
	
	init: function(config) {
		config = $.extend({}, navigation.config, config);
		
		var container = $(navigation.config.container);
		var containerLength = container.length;
		
		if (containerLength) {
			var items = container.children('li');
			
			items.each(function(index){
				var submenu = $(this).find('ul');
				
				if (submenu.length) {
					navigation.submenus[index] = {
						element:$(this), 
						index:index, 
						timeout:{}
					};
					
					if (typeof config.arrow == "object")
						navigation.addArrows(submenu, config.arrow);
					
					$(this).bind('mouseenter', function(){
						navigation.open(index, config);
					});
					
					$(this).bind('mouseleave', function(){
						navigation.submenus[index].timeout.close = setTimeout(function(){
							navigation.close(index, config);
							navigation.submenus[index].timeout.close = null;
						}, config.timeoutSpeed);
					});
				}
				
				$(this).bind('mouseenter', function(){
					var openIndiciesLength = navigation.openIndicies.length;
					for (a = 0; a < openIndiciesLength; a++) {
						var openIndex = navigation.openIndicies[a];
						if (openIndex in navigation.submenus
							&& openIndex != index
						) {
							navigation.close(openIndex, config);
						}
					}
				});
			});
		}
	},
	
	addArrows : function(submenus, config) {
		var tag = config.element || 'div';
		var arrowAppend = '<' + tag;
		if (config.style) arrowAppend += ' class="' + config.style + '"';
		arrowAppend += '>&nbsp;<' + tag + '>';
		
		var container = submenus.prevAll('span, a').children('span');
		var newPadding = parseInt(container.css('paddingRight').replace('px','')) + 5;
		container.css('paddingRight', newPadding).append(arrowAppend);
	},
	
	open: function(index, config) {
		var e = navigation.submenus[index].element;
		
		e.addClass("active");
		
		if (navigation.submenus[index].timeout.close) {
			clearTimeout(navigation.submenus[index].timeout.close);
			navigation.submenus[index].timeout.close = null;
			return;
		}
		
		navigation.openIndicies.push(index);
		var submenu = e.children('ul');
		var submenuWidth = submenu.width();
		
		submenu.hide().width(submenuWidth).animate({height:'show',opacity:'show'}, config.slideSpeed);
	},
	
	close: function(index, config){
		if (index in navigation.submenus) {
			var el = navigation.submenus[index].element;
			var submenu = el.children('ul');
			var openIndex;
			
			try {
				var openIndex = navigation.openIndicies.indexOf(index);
			} catch (e) {
				/**
				 * @todo This causes a meaty memorey leak...
				 */
//				for (a = 0; a < navigation.openIndicies.length; a++) {
//					if (navigation.openIndicies[a] == index) {
//						var openIndex = a;
//						break;
//					}
//				}
			}
			
			if (openIndex) {
				navigation.openIndicies.splice(openIndex, 1);
			}
			
			if ('none' != submenu.css('display')) {
				submenu.animate({height:'hide',opacity:'hide'}, config.slideSpeed, function(){
					el.removeClass('active');
				});
			} else if (el.hasClass('active')) {
				el.removeClass('active');
			}
		}
	}
};

$(function(){
	navigation.init();
});
