// shorten localStorage
var stor = window.localStorage;

// sidebar menus and state
var menus = [];
var menuLocation = [];
var menushown;

// default states
var menuDefaultState = [true, true, true, true];
var menuDefaultLocation = [0,1,2,3];

function setMenuState(number, state) {
	menushown[number] = state;
	if (stor) stor.setItem("menuState", JSON.stringify(menushown));
}

function toggleMenu(number, fast) {
	if (menushown[number]) {
		hideMenu(number, fast);
	} else {
		showMenu(number, fast);
	}
}

function showMenu(number) {
	var menu = $(menus[number]);
	var items = menu.find(".items");
	items.slideDown();
	menu.removeClass("closed", "normal");
	setMenuState(number, true);
}

function hideMenu(number, fast) {
	var menu = $(menus[number]);
	var items = menu.find(".items");
	if (fast) {
		items.hide();
	} else {
		items.slideUp();
	}
	menu.addClass("closed", fast?0:"normal");
	setMenuState(number, false);
}

function startMenuMove(event, ui) {
	// disable click events (otherwise it will fire after drop)
	$(">.top, >.bottom, .overlay", ui.item).unbind("click").css("cursor", "move");
}

function endMenuMove(event, ui) {

	// rewrite locations
	$("body > .wrapper > .sidebar > .menus > li").each(function(number, menu) {
		menu = $(menu);
		menuLocation[number] = menu.data("number");
		menu.data("position", number);
	});

	// save locations
	if (stor) stor.setItem("menuLocation", JSON.stringify(menuLocation));

	$(">.top, >.bottom, .overlay", ui.item).css("cursor", "pointer");

	// restore click
	setTimeout(function() {
		$(">.top, >.bottom, .overlay", ui.item)
			.click(menuClick(ui.item.data("number")))
	}, 300);
}

function menuClick(number) {
	return function() {
		toggleMenu(number);
	};
}

$(document).ready(function() {

	// so that we can do javascript-only css rules
	$("body").addClass("script");

	// get menu state from local storage
	if (stor) {
		menushown = JSON.parse(stor.getItem("menuState"));
		if (!menushown) {
			menushown = menuDefaultState;
		}
		menuLocation = JSON.parse(stor.getItem("menuLocation"));
		if (!menuLocation) {
			menuLocation = menuDefaultLocation;
		}
	} else {
		menushown = menuDefaultState;
		menuLocation = menuDefaultLocation;
	}

	// the list which has the menus
	var menuList = $("body > .wrapper > .sidebar > .menus");

	// scriptify the menus
	menuList.find("> li").each(function(number, menu) {

		// add menu
		menus.push(menu);
		$(menu).data("number", number);

		// listen to clicks and change cursor
		$(">.top, >.bottom, .overlay", menu)
			.click(menuClick(number))
			.css("cursor", "pointer");

		// add toggle indicator
		$(">.top", menu).prepend("<div class=\"toggle\"></div>");

		// make the menu items move too
		var height = $(".items ul", menu).get(0).offsetHeight;
		var pusher = $("<div></div>");
		pusher.css("height", height);
		$(".items", menu).append(pusher);

	});

	// set menus to initial state
	$.each(menushown, function(i, shown) {
		if (!shown) hideMenu(i, true);
	});

	// restore order
	$.each(menuLocation, function(pos, menuNumber) {
		var menu = $(menus[menuNumber]);
		menu.data("position", pos);
		menuList.append(menu);
	});

	// allow sorting
	menuList.sortable({
		axis: "y",
		start: startMenuMove,
		stop: endMenuMove
	});

});