function callIfFunction(func) {
	if ($.isFunction(func)) {
		func();
	}
}
$(function() {
	var logDialog,
		log = function(report) {
			if (document.location.host == "dev.bowtietv.com") {
				if (!logDialog) {
					logDialog = $("<div />").dialog( {
						title: "Debug Dialog",
						position: ["left", "top"]
					});
				}
				logDialog.append($("<div>" + report + "</div>"));
			}
		},
		fxSpeed = "fast",
		$body = $("body"),
		$login = $(".top .login"),
		$loginControls = $(".controls", $login),
		$loginUsernameTextBox = $(".username input", $loginControls),
		$menu = $(".menu"),
		$menuMenus = $("ul", $menu),
		$content = $(".middle>.content"),
		loginSpeed = fxSpeed,
		showLogin = function() {
			hideMenu();
			$loginControls.fadeIn(loginSpeed, function() {
				$loginUsernameTextBox.focus();
			});
		},
		hideLogin = function(callback) {
			if ($loginControls.length > 0) {
				$loginControls.fadeOut(loginSpeed, callback);
			}
			else {
				callIfFunction(callback);
			}
		},
		showLoginAndReturnFalse = function() {
			showLogin();
			return false;
		},
		menuSpeed = 0,
		contentFadedValue = 0.1,
		contentIsHidden = function() {
			return ($content.css("opacity") == contentFadedValue);
		},
		hideContent = function(callback) {
			$content.fadeTo(menuSpeed, contentFadedValue, callback);
		},
		showContent = function(callback) {
			if (contentIsHidden()) {
				$content.fadeTo(menuSpeed, 1, function() {
					var contentStyle = $content[0].style;
					if (typeof (contentStyle.filter) != "undefined") {
						var removeContentStyleAttribute = contentStyle.removeAttribute;
						if (typeof (removeContentStyleAttribute) != "undefined") {
							removeContentStyleAttribute("filter", false);
						}
					}
					callIfFunction(callback);
				});
			}
			else {
				callIfFunction(callback);
			}
		},
		hideMenus = function(context, callback) {
			$menuMenus.stop(true, true);
			var callback2 = function() {
				if ($("ul:visible", $menu).length > 0) {
					callIfFunction(callback);
				}
				else {
					showContent(callback);
				}
			};
			var ul = $("ul:visible", context);
			if (ul.length > 0) {
				ul.fadeOut(menuSpeed, function() {
					ul.hide(); //fadeOut doesn't seem to fade out any contained elements
					callback2();
				});
			}
			else {
				callback2();
			}
		},
		hideMenu = function(callback) {
			hideMenus($menu, callback);
		},
		showMenu = function(element) {
			hideLogin();
			var li = $(element).closest("li");
			hideMenus(li.siblings(), function() {
				var ul = li.find("ul:first");
				if (ul.length > 0) {
					hideContent(function() {
						ul.fadeIn(menuSpeed);
					});
				}
				else if ($("ul:visible", $menu).length == 0) {
					showContent();
				}
			});
		},
		showMenuOnEvent = function(event) {
			showMenu(event.target);
		},
		hideLoginAndMenuOnEvent = function(event) {
			var $element = $(event.target),
				loginElement = $login[0],
				menuElement = $menu[0],
				doHideLogin = true,
				doHideMenu = true;
			while ($element.length > 0) {
				var domElement = $element[0];
				if (domElement == loginElement) {
					doHideLogin = false;
					if (!doHideMenu) {
						break;
					}
				}
				else if (domElement == menuElement) {
					doHideMenu = false;
					if (!doHideLogin) {
						break;
					}
				}
				$element = $element.parent();
			}
			if (doHideLogin) {
				hideLogin();
			}
			if (doHideMenu) {
				hideMenu();
			}
		},
		$sideBarPanels = $(".middle .rightBar ul .panel");
	$(".submit input", $login).mouseenter(showLoginAndReturnFalse).focus(showLoginAndReturnFalse);
	$(".logout").click(function() {
		return window.confirm("Are you sure you want to logout?");
	});
	if (($("body.login").length > 0) || ($(".failed", $login).length > 0)) {
		showLogin();
	}
	$("li span.expand", $menu).focus(showMenuOnEvent).mouseenter(showMenuOnEvent).click(function(event) {
		showMenuOnEvent(event);
		return false;
	});
	$("li", $menu).mouseenter(function(event) {
		hideMenus($(event.target).closest("li").siblings());
	});
	$body.click(hideLoginAndMenuOnEvent).focus(hideLoginAndMenuOnEvent);
	$("h2", $sideBarPanels).click(function(event) {
		var $element = $(event.target);
		if (!$element.is("a, a *")) {
			var $panel = $element.closest(".panel"),
				$panelHead = $panel.children("h2"),
				$panelBody = $panel.children(".body"),
				wasHidden = $panelBody.is(":hidden");
			$panelBody["slide" + (wasHidden ? "Down" : "Up")]("fast");
			$panelHead.attr("title", "Click to " + (wasHidden ? "close" : "open"));
		}
	});
	$(".body:visible", $sideBarPanels).parent().attr("title", "Click to close");
	$(".body:hidden", $sideBarPanels).parent().attr("title", "Click to open");
});