(function($) {
	$.fn.extend({
		osinav:function(arg) {
			var defaltOption = {
				vertical:false,
				menuItemSelector: 'li',
				menuGroupSelector: 'ul',
				firstClass:'osinav',
				menuItemClass:'osinav-item',
				menuGroupClass:'osinav-group',
				topLevelMenuItemClass: 'osinav-item-toplevel',
				topLevelActiveMenuItemClass: 'osinav-item-toplevel-active',
				childMenuItemClass: 'osinav-item-child',
				childMenuItemActive: 'osinav-item-child-active',
				firstChildMenuItemClass: 'osinav-item-child-first',
				verticalClass:'osinav-vertical',
				holizontalClass:'osinav-holizontal',
				hasVerticalClass:'osinav-has-vertical',
				hasHolizontalClass:'osinav-has-holizontal',
				showDuration: 400,
				hideDuration: 200
			}
			
			var option = (typeof(arg)!='string') ? $.extend(defaltOption,arg) : $.extend(defaltOption,{});
			var $menu = $(this).addClass(option.firstClass).addClass((option.vertical) ? option.verticalClass : option.holizontalClass);
					
			var $menuItems = $menu.find(option.menuItemSelector).addClass(option.menuItemClass);
			var $menuGroups = $menu.find(option.menuGroupSelector).addClass(option.menuGroupClass);
			
			$menu.children('li').each(function(index){$(this).children('a').addClass(option.topLevelMenuItemClass);});			
			$menu.children('li').each(function(index){$(this).find('ul').find('a').addClass(option.childMenuItemClass);});
			
			$menuGroups.parent().each(function(index){
				var bottom = $(this).parent(option.menuGroupSelector+'.'+option.firstClass).length == 1 && !option.vertical;

				$(this).find('li > ul').each(function(index){
					$(this).find('li:first > a').addClass(option.firstChildMenuItemClass);
				});


				var $menuGroup = $(this).addClass((bottom) ? option.hasVerticalClass : option.hasHolizontalClass)
					.children(option.menuGroupSelector+':first').addClass(option.verticalClass)
				$(this)
					.hoverIntent(
						function(e) {
							var offset = (bottom) ? {left:'0',top:''} : {left:$(this).width()+'px',top:'0'};
							$menuGroup.css({left:offset.left,top:offset.top}).slideDown({duration:option.showDuration});
							$menuGroup.children(option.menuItemSelector).children(option.menuGroupSelector).hide();
							if($(this).children('a').hasClass(option.topLevelMenuItemClass)){
								$(this).children('a').addClass(option.topLevelActiveMenuItemClass);
							}else{
								$(this).children('a').addClass(option.childMenuItemActive);
							}
						},
						function(e) {
							$menuGroup.fadeOut(option.hideDuration);
							if($(this).hasClass(option.topLevelItemHover)){$(this).removeClass('osinav-toplevel-active');}
							if($(this).children('a').hasClass(option.topLevelMenuItemClass)){
								$(this).children('a').removeClass(option.topLevelActiveMenuItemClass)
							}else{
								$(this).children('a').removeClass(option.childMenuItemActive);
							}
						}
					)
				;
			});
			$menu.find('a[href^="#"]').click(function() {
				$menuGroups.fadeOut(option.hideDuration);
				return ($(this).attr('href')=='#') ? false : true;
			})
			;
			return this;
		}
	})
})(jQuery);