(function(){
	var NAV = function(obj) {
		var elem = obj;
		var menuItems = [];
		var idxHover = undefined;
		var hideTimeout = 0;
		var ieFix = (jQuery.browser.msie && jQuery.browser.version < 8);
		
		var clearHideTimeout = function(){
			if (hideTimeout > 0) {
				window.clearTimeout(hideTimeout);
				hideTimeout = 0;
			}
		};
		
		var hideCurrentMenu = function(){
			if (idxHover != undefined) {
				menuItems[idxHover].current = false;
				$(menuItems[idxHover].trigger).removeClass("hover");
				$(menuItems[idxHover].submenu).hide();
				idxHover = undefined;
			}
		};
		
		var onMenuOver = function(e) {
			clearHideTimeout();
			var idx = $.data(this, "idx.mainmenu");
			if (idxHover!= undefined && idxHover == idx) return;
			
			if (idxHover != undefined) {
				hideCurrentMenu();
			}
			
			idxHover = idx;
			menuItems[idx].current = true;
			$(menuItems[idx].trigger).addClass("hover");
			$(menuItems[idx].submenu).show();
		};
		
		var onMenuOut = function(e) {
			clearHideTimeout();
			hideTimeout = window.setTimeout(function(){
				if (idxHover != undefined) {
					hideCurrentMenu();
				}
			},200);
		};
		
		var onSubMenuOver = function(e) {
			var li = $(this).parents("li");
			if (li.length){
				$(li).triggerHandler("mouseover");
			}
		};
		
		var onSubMenuOut = function(e) {
			var li = $(this).parents("li");
			if (li.length){
				$(li).triggerHandler("mouseout");
			}
		};
		
		var menuItem = function(menu) {
			var item = {};
			var trigger = $(">a",menu);
			var submenu = $(">ul", menu);
			
			if (trigger.length && submenu.length) {
				trigger = $(trigger[0]);
				submenu = $(submenu[0]);
				$(menu).unbind("mouseover.mainmenu").bind("mouseover.mainmenu", onMenuOver);
				$(menu).unbind("mouseout.mainmenu").bind("mouseout.mainmenu", onMenuOut);
				
				$(submenu).unbind("mouseover.mainmenu").bind("mouseover.mainmenu", onSubMenuOver);
				$(submenu).unbind("mouseout.mainmenu").bind("mouseout.mainmenu", onSubMenuOut);
				
				
				item = {
					trigger: trigger,
					submenu: submenu,
					selected: $(">a", menu).is(".selected"),
					current: false,
					idx: menuItems.length
				};
				
				$.data(menu, "idx.mainmenu", menuItems.length);
				
				menuItems.push(item);
				
				if (ieFix) {
					var arrs = $(">li>a", submenu);
					var maxw = 0, w = 0;
					maxw = $(submenu).innerWidth();
					
					$(">li>a", submenu).each(function(){
						w = parseInt($(this).css("paddingLeft")) || 0;
						w += parseInt($(this).css("paddingRight")) || 0;
						$(this).css("width", (maxw-w)+"px");
					});
				}
				
				//prevent dropdown to not exceed page right boundries
				if (true) {
					var borderOffset = $(menu).parents(".mainmenu").offset();
					var subMenuOffset = $(menu).offset();
					
					borderOffset.right = borderOffset.left + $(menu).parents(".mainmenu").innerWidth();
					subMenuOffset.right = subMenuOffset.left + $(submenu).innerWidth();
					
					if (subMenuOffset.right > borderOffset.right) {
						$(submenu).addClass("flushRight");
					}
				}
			} else {
				$(menu).unbind("mouseover.mainmenu").bind("mouseover.mainmenu", function(){
					hideCurrentMenu();
				});
			}
		}
		
		$(">ul>li", elem).each(function(){
			new menuItem(this);
		});
	};
	
	
	var TAB = function(obj) {
		var elem = obj;
		
		var stretchTabMenu = function(){
			var totalW = 0, availW;
			var items = [];
			
			availW = $(".tabs_menu", elem).innerWidth();
			availW -= parseInt($(".tabs_menu", elem).css("paddingLeft")) || 0;
			availW -= parseInt($(".tabs_menu", elem).css("paddingRight")) || 0;
			
			$(".tabs_menu li", elem).each(function(){
				tmp = {};
				tmp.w = $(this).outerWidth(true);
				tmp.iw = $(this).innerWidth();
				tmp.iw -= parseInt($(this).css("paddingLeft")) || 0;
				tmp.iw -= parseInt($(this).css("paddingRight")) || 0;
				
				tmp.e = this;
				totalW += tmp.w;
				
				items.push(tmp);
			});
			
			var space = availW - totalW;
			var used = 0;
			
			$(items).each(function(){
				this.s = this.w / totalW;
				var d = Math.floor(this.s * space);
				this.iw += d;
				used += this.w + d;
			});
			
			space = availW - used;
			
			while (space != 0) {
				$(items).each(function(){
					if (space > 0) {
						this.iw ++;
						space --;
					} else if (space < 0) {
						this.iw --;
						space ++;
					} else {
						return false;
					}
				});
			};
			
			$(items).each(function(){
				$(this.e).css({
					width:this.iw+"px"
				});
			});
		};
		
		var disableTab = function(li, a) {
			$(li).addClass("disabled");
			$(a).unbind("click.tabMenu").bind("click.tabMenu", function(){
				return false;
			});
		};
		
		var initTabMenu = function(){
			var current_li = null;
			
			$(".tabs_menu li", elem).each(function(){
				var li = this;
				var trigger = $("a", li);
				var h = trigger.attr("href").replace(/#/g, '');
				if (h == "") disableTab(li, trigger);
				
				var content = $("#" + h);
				if (!content.length) disableTab(li, trigger);
				
				$(li).data("content.tabMenu", content);
				
				$(trigger).bind("click.tabMenu", function(){
					if (!$(li).is(".tab_selected")) {
						if (current_li) {
							$($(current_li).data("content.tabMenu")).hide();
							$(current_li).removeClass("tab_selected");
						}
						$(li).addClass("tab_selected");
						$(content).show();
						current_li = li;
					}
					
					this.blur();
					return false;
				});
				
				if (current_li || !$(li).is(".tab_selected")) {
					$(li).removeClass("tab_selected");
					$(content).hide();
				} else if ($(li).is(".tab_selected")) {
					current_li = li;
				}
			});
			
			if (!current_li) {
				$(".tabs_menu li", elem).each(function(){
					if ($(this).data("content.tabMenu")) {
						current_li = this;
						$(this).addClass("tab_selected");
						$($(this).data("content.tabMenu")).show();
						return false;
					}
				});
			}
		};
		
		//var tabMenu = $(".tabs_menu", elem);
		stretchTabMenu();
		initTabMenu();
	};
	
	$(document).ready(function(){
		//site nav
		$(".siteNav").each(function(){
			new NAV(this);
		});
		
		//tabs
		$(".tabs").each(function(){
			new TAB(this);
		});
	});
})(jQuery);