function updateButtons()
{
    $('div.button, a.button, span.button').hover(function()
    {
        $(this).css({'z-index': 10});//.addClass('ui-state-hover');
    }, function()
    {
        $(this).css({'z-index': 'inherit'});//.removeClass('ui-state-hover');
    });
}

jQuery(function($)
{
    jQuery.fn.idle = function(time)
    {
        var o = $(this);

        o.queue(function()
        {
            setTimeout(function()
            {
                o.dequeue();
            }, time);
        });

        return o;
    };
});

var messagebarMessages = {
    'error': '',
    'success': '',
    'warning': ''
};

var messagebarCounts = {
    'error': 1,
    'success': 1,
    'warning': 1
};

var messagebarSelectors = {
    'error': '#error-message-bar',
    'success': '#success-message-bar',
    'warning': '#warning-message-bar'
};

function _messageBar(type, message, idle)
{
    if (!idle) idle = 2000;

    if (message == messagebarMessages[type])
    {
        messagebarCounts[type]++;

        if (messagebarCounts[type] > 1)
        {
            message += ' (' + messagebarCounts[type] + ')';
        }

        $(messagebarSelectors[type])
            .clearQueue()
            .stop()
            .html(message)
            .effect('highlight', {}, 1000)
            .delay(idle)
            .hide('slide', {direction: 'left'}, function()
            {
                messagebarMessages[type] = '';
                messagebarCounts[type] = 1;
            });
    }
    else if ($(messagebarSelectors[type]).is(':visible'))
    {
        messagebarMessages[type] = message;
        $(messagebarSelectors[type])
            .clearQueue()
            .stop()
            .html(message)
            .effect('highlight', {}, 1000)
            .delay(idle)
            .hide('slide', {direction: 'left'}, function()
            {
                messagebarMessages[type] = '';
                messagebarCounts[type] = 1;
            });
    }
    else
    {
        messagebarMessages[type] = message;

        $(messagebarSelectors[type])
            .clearQueue()
            .stop()
            .html(message)
            .show('slide', {direction: 'left'})
            .delay(idle)
            .hide('slide', {direction: 'left'}, function()
            {
                messagebarMessages[type] = '';
                messagebarCounts[type] = 1;
            });
    }

    return false;
}

function errorMessageBar(message, idle)
{
    return _messageBar('error', message, idle);
}

function successMessageBar(message, idle)
{
    return _messageBar('success', message, idle);
}

function warningMessageBar(message, idle)
{
    return _messageBar('warning', message, idle);
}

var currentKeyCodeFunction = null;
var keyCodeNavigationEnabled = true;

var enableKeyCodeNavigation = function()
{
    keyCodeNavigationEnabled = true;
}

var disableKeyCodeNavigation = function()
{
    keyCodeNavigationEnabled = false;
}

var startKeyCodeNavigation = function()
{
    $(document).bind('keydown', function(ev)
    {
        return true;
        //console.log(ev.keyCode);

        if (keyCodeNavigationEnabled)
        {
            switch (ev.keyCode)
            {
                case 48: // 0
                    window.location = $('h1 a').attr('href');
                    return false;
                    break;
                case 49: // 1
                    $('h2.database').click();
                    return false;
                    break;

                case 50: // 2
                    $('h2.client').click();
                    return false;
                    break;

                case 51: // 3
                    $('h2.settings').click();
                    return false;
                    break;

                case 72: // h
                    $('h2.database').click();
                    $('.chapter li').removeClass('hover');
                    $('#database .houses').addClass('hover');
                    $('#database li').hover(function()
                    {
                        $('.chapter li').removeClass('hover');
                        $(this).unbind('hover');
                    });

                    currentKeyCodeFunction = housesLevelKeyCode;

                    return false;

                case 67: // c
                    $('h2.database').click();
                    $('.chapter li').removeClass('hover');
                    $('#database .contacts').addClass('hover');
                    $('#database li').hover(function()
                    {
                        $('.chapter li').removeClass('hover');
                        $(this).unbind('hover');
                    });

                    currentKeyCodeFunction = contactsLevelKeyCode;

                    return false;

                case 190: // dot
                case 191: // forward slash
                    $('#search-box').trigger('openSearchBox');
                    return false;
                    break;
            }
        }

        // globals
        switch (ev.keyCode)
        {
            case $.ui.keyCode.ESCAPE:
                currentKeyCodeFunction = null;
                $('.chapter li').removeClass('hover');
                $('textarea, input, select').blur();

                if ($('#search-box input').val() == '')
                {
                    $('#search-box').hide();
                }
                else
                {
                    $('#search-box input').val('');
                    $('#search-box input').focus();
                    $('#search-box .results').html('');
                }
                break;

            case 83: // ctrl+s
                if (ev.ctrlKey && saveEnabledForm != '')
                {
                    if (askConfirm())
                    {
                        $(saveEnabledForm).submit();
                    }
                }
        }

        //return true;

        if (currentKeyCodeFunction != null)
        {
            return currentKeyCodeFunction(ev);
        }

        return true;
    });
}

function housesLevelKeyCode(ev)
{
    switch (ev.keyCode)
    {
        case 65: // a
            window.location = $('#database .houses .add a').attr('href');
            return false;
            break;

        case 83: // s
            window.location = $('#database .houses .search a').attr('href');
            return false;
            break;
    }

    return true;
}

function contactsLevelKeyCode(ev)
{
    switch (ev.keyCode)
    {
        case 65: // a
            window.location = $('#database .contacts .add a').attr('href');
            return false;
            break;

        case 83: // s
            window.location = $('#database .contacts .search a').attr('href');
            return false;
            break;
    }
}

$(function()
{
    startKeyCodeNavigation();

    $(':input').focus(function()
    {
        disableKeyCodeNavigation();
    });

    $(':input').blur(function()
    {
        enableKeyCodeNavigation();
    });
});