/*
    Componente para comportamento de carrossel, vertical / horizontal.
    @author Hudson Tavares <hudson.tavares@gmail.com>
    @created 2011-04-26 12:44
*/

if(!('fess' in window))window.fess = {};

fess.carroussel =
{
    init: function(params)
    {
        /* Configuração geral do slider */
        params = $.extend
        (
            {
                next        : null,     /* CSS expression para o botão de navegação "próximo" (move para a próxima página de itens) */
                previous    : null,     /* CSS expression para o botão de navegação "anterior" (move para a página anterior de itens) */
                slidable    : null,     /* CSS expression para o elemento que terá seu margin-left alterado */
                children    : null,     /* CSS expression para a coleção de filhos do elemento slidável */
                index       : 0,        /* Posição inicial */
                speed       : 'fast',   /* Velocidade de movimentação */
                walkBy      : 1,         /* Número de filhos a mover por clique em anterior / próximo */
                after       : function(params){} /* Função a executar após cada navegação (params é uma referência a esse objeto) */
            },
            params
        );
        
        params.next     = $(params.next);
        params.previous = $(params.previous);
        params.slidable = $(params.slidable);
        params.children = $(params.children);
        
        if(params.slidable.length == 0)return false;
        
        /* Comportamentos de clique */
        if(params.previous.length != 0 && params.next.length != 0)
        $([params.previous[0], params.next[0]]).bind
        (
            'click',
            function(e)
            {
                var target = $(this), desiredIndex = null;
                
                switch(true)
                {
                    /* Anterior */
                    case this == params.previous[0]:

                        if(params.index <= 0)return false;

                        desiredIndex = params.index - params.walkBy;
                        if(desiredIndex < 0)desiredIndex = 0;
                    break;
                    /* Próximo */
                    case this == params.next[0]:

                        if(params.index >= params.children.length - 1)return false;
                        desiredIndex = params.index + params.walkBy;
                        
                        if((params.children.length - desiredIndex - 1) < params.walkBy)
                            desiredIndex = params.index + (params.children.length - desiredIndex);

                    break;
                }
                
                if(desiredIndex == null)return false;
                fess.carroussel.moveTo(params, desiredIndex);
                
                
                e.preventDefault();
                e.stopPropagation();
                return true;
            }
        );
        
        fess.carroussel.moveTo(params, params.index);
        return params;
    },
    reassignPositions: function(params)
    {
        params.previous[params.index == 0 ? 'addClass' : 'removeClass']('inactive').css({zoom:1});
        params.next[params.index >= params.children.length - params.walkBy ? 'addClass' : 'removeClass']('inactive').css({zoom:1});
        
        if(params.after.constructor == Function)params.after.apply(this, [params]);
        return true;
    },
    moveTo: function(params, index)
    {
        if(params.slidable.is(':animated'))return false;
        
        params.slidable.animate
        (
            {'margin-top' : -params.children.eq(index).position().top,
             'margin-left': -params.children.eq(index).position().left},
             params.speed,
            function()
            {
                params.index = index;
                fess.carroussel.reassignPositions(params);
            }
        );
        
        return true;
    }
};
