jQuery.fn.openPage=function( page, pages ){
    var currentIndex = ( page - 1 ) * pages;
    var lastIndex = currentIndex + pages - 1;
    var itensLength = this.size();
    var jItens = this;

    function fadeInItens() {
        for( ; currentIndex <= lastIndex && currentIndex < itensLength; currentIndex++ )
            $(jItens[currentIndex]).fadeIn(500);
    }

    this.each(
        function(index,elem){
            var isLast = index==(itensLength-1);
            $(elem).fadeOut(500);
            if( index == (itensLength - 1) )
                setTimeout(fadeInItens, 500 );
        }
    );

}

jQuery.fn.navigate=function( pageSize, seletor ){

    var _self = this;

    this.each(
        function( index, a ) {
            $(a).css('cursor','pointer');
            $(a).bind('click', function( event ){
                var currentA = event.target;
                $( seletor ).openPage( parseInt( event.target.innerHTML, 10 ), pageSize );
                _self.each(
                    function( index, aa ) {
                        if( $(aa).html() == $(currentA).html() ){
                            $(aa).addClass('selected');
                        } else {
                            $(aa).removeClass('selected');
                        }
                    }
                );
            });
        }
    );
}

function Paginate( pageSize, navigableSeletor, navigationSeletor ) {
    var _self=this;
    var _seletor={navigable:navigableSeletor, navigator:navigationSeletor};
    var _pageSize=pageSize;

    this.getPages=function() {
        return Math.ceil( $(_seletor.navigable).size() / _pageSize );
    }

    this.openPage=function(page){
        _self.setCurrentPage(page);
        $(_seletor.navigable).openPage( page, _pageSize );
    }

    this.setCurrentPage=function(page){
        $('a',_seletor.navigator).each(
            function( index, a ){
                if( page == $(a).html() ) {
                    $(a).addClass('selected');
                } else {
                    $(a).removeClass('selected');
                }
            }
        );
    }

    function _onPageClick( event ) {
        _self.openPage( $(event.target).html() );
    }
    
    this.refreshNavigation=function() {
        $(_seletor.navigator).each(
            function(index,nav){
                $(nav).html('');
                for(var i=0, a=null, pages=_self.getPages();i<pages;i++) 
                    $(nav).append('<a>'+(i+1)+'</a>');
                $('a',nav).each(function(index,a){
                    a.style.cursor = 'pointer';
                    $(a).bind('click', _onPageClick );
                });
                    //
            }
        );
    }

    _self.refreshNavigation();
    _self.openPage(1);
    
}