$(function() {

var tocItemColor = '#bab0c0',
	tocItemHoverColor = '#e5e1e7',
	tocHoverDelay = 200,
	emptyFn = function() {},
	caretTimer = null,
	sidebarLeft = 0;

var moveCaret = function(target, instant) {
	if (!instant) instant = false;
	var targetWidth = $(target).width();
	var targetX = $(target).position().left;
	var caretX = $('#caret').position().left;
	var caretWidth = $('#caret').width();
	var newCaretX = (targetX + (targetWidth / 2)) - (caretWidth / 2);
	$('#caret').css('left', caretX);
	if (instant)
		$('#caret').css('left', newCaretX + sidebarLeft);
	else
		$('#caret').animate({'left': newCaretX + sidebarLeft}, 500);
};

var tocHover = function(target) {
	caretTimer = null;
	var hoverItem = $('#toc li.hover a');
	var selItem = $('#toc li.current_page_item a');
	var thisItem = $(target);
	if (hoverItem != selItem)
		hoverItem.animate({color: tocItemColor}, 500);
	hoverItem.parent().removeClass('hover');
	thisItem.parent().addClass('hover');
	if (thisItem != selItem)
		thisItem.animate({color: tocItemHoverColor}, 500);
	moveCaret(target);
};

var tocOut = function() {
	caretTimer = null;
	var hoverItem = $('#toc li.hover a');
	if (!hoverItem.parent().hasClass('current_page_item')) {
		$('#toc li.hover a').animate({color: tocItemColor}, 500);
		moveCaret('#toc li.current_page_item a');
	}
	hoverItem.parent().removeClass('hover');
};

var keyFn = function(navItem) {
    return function() {
        moveCaret(navItem);
        window.setTimeout(function() {
            window.location = navItem.children()[0].href;
        }, 450);
    };
};

var setupShortcuts = function() {
    var tocItems = $('#toc').children();
    for (var i=0;i<tocItems.length;i++) {
        var $item = $(tocItems[i]);
        var shortcut = $item.children()[0].innerHTML[0];
        key(shortcut, keyFn($item));
    }
};

var init = function() {
	sidebarLeft = $('#headerimg').position().left;

	if (!$('#toc li.current_page_item').length)
		$('#toc li:first').addClass('current_page_item');
	moveCaret('#toc li.current_page_item a', true);
	$('#caret').fadeIn(200);
	
	$('#toc a').hover(
		function() {
			var that = this;
			if (caretTimer) window.clearTimeout(caretTimer);
			caretTimer = window.setTimeout(function() {tocHover(that)}, tocHoverDelay);
		},
		emptyFn
	);
	$('#toc').hover(
		emptyFn,
		function() {
			if (caretTimer) window.clearTimeout(caretTimer);
			caretTimer = window.setTimeout(tocOut, tocHoverDelay);
		}
	);
            
        setupShortcuts();
};

init();

});
