/**
 * @author Tom Maneri
 * @version 1.0
 */

 
(function($){
    var PaginatePlugin = function(element, options)
    {
        var elem = $(element);
        var obj = this;
        var settings = $.extend({
        
            initialPage: 1,
            pagingLinks: 9,
            paginationSelector: null,
            showFirstLink: true,
            showPrevLink: true,
            showNextLink: true,
            showLastLink: true,
            firstLinkText: '&lsaquo; first',
            prevLinkText: '&laquo; prev',
            nextLinkText: 'next &raquo;',
            lastLinkText: 'last &rsaquo;',
            itemsPerPage: 15

        }, options || {});

        this.nextPage = function()
        {
            setPage(settings.currentPage+1);  
        }
        
        this.prevPage = function()
        {
            setPage(settings.currentPage+1);  
        }            
            
        var setPage = function(pageNum)
        {

            settings.currentPage = pageNum >= 1 && pageNum <= settings.lastPage ? pageNum : 1;

            settings.records.slice( (settings.currentPage-1)*settings.itemsPerPage, (settings.currentPage-1)*settings.itemsPerPage+settings.itemsPerPage ).show();
            settings.records.not(settings.records.slice( (settings.currentPage-1)*settings.itemsPerPage, (settings.currentPage-1)*settings.itemsPerPage+settings.itemsPerPage )).hide();
            
        if( settings.lastPage > 1 ) {
        
            var paginationContainer = $(settings.paginationSelector);

            paginationContainer.empty();
            
            var linksLeft = settings.pagingLinks;

            for( var i = settings.currentPage-(settings.pagingLinks-1)/2; i < settings.currentPage; i++ )
            {
                    
                if( i > 0 )
                {   
                    linksLeft--;
                    paginationContainer.each(function(){
                    
                        $(this).append($('<li></li>').append($('<a href="#">'+i+'</a>').bind('click', { page: i }, function(e){
                            e.preventDefault();
                            setPage(e.data.page);
                        })));
                        
                    });
                }
                    
            }
            
            paginationContainer.append('<li><strong>'+i+'<'+'/strong><'+'/li>');
            linksLeft--;
                  
            for( var i = settings.currentPage+1; linksLeft > 0 && i <= settings.lastPage; i++ )
            {
                linksLeft--;
                paginationContainer.each(function(){
                
                    $(this).append($('<li></li>').append($('<a href="#">'+i+'</a>').bind('click', { page: i }, function(e){
                        e.preventDefault();
                        setPage(e.data.page);
                    })));
                    
                });
            }

            /*for( var i = settings.currentPage-(settings.pagingLinks-1)/2; linksLeft > 0 && i > 0; i-- )
            {
                linksLeft--;
                paginationContainer.each(function(){
                
                    $(this).prepend($('<li></li>').append($('<a href="#">'+i+'</a>').bind('click', { page: i }, function(e){
                        e.preventDefault();
                        setPage(e.data.page);
                    })));
                    
                });     
            }*/
                  
            if( settings.showPrevLink && settings.prevLinkText.length > 0 )
            {
                paginationContainer.each(function(){
                
                    $(this).prepend($('<li></li>').append($('<a href="#">'+settings.prevLinkText+'</a>').bind('click', { page: settings.currentPage-1 }, function(e){
                        e.preventDefault();
                        setPage(e.data.page);
                    })).css('display',settings.currentPage > 1?'inline-block':'none'));
                    
                });
            }

            if( settings.showFirstLink && settings.firstLinkText.length > 0 )
            {
                paginationContainer.each(function(){
                
                    $(this).prepend($('<li></li>').append($('<a href="#">'+settings.firstLinkText+'</a>').bind('click', { page: 1 }, function(e){
                        e.preventDefault();
                        setPage(e.data.page);
                    })).css('display',settings.currentPage > 1?'inline-block':'none'));
                    
                });
            }


            
            if( settings.showNextLink && settings.nextLinkText.length > 0 )
            {
                paginationContainer.each(function(){
                
                    $(this).append($('<li></li>').append($('<a href="#">'+settings.nextLinkText+'</a>').bind('click', { page: settings.currentPage+1 }, function(e){
                        e.preventDefault();
                        setPage(e.data.page);
                    })).css('display',settings.currentPage < settings.lastPage?'inline-block':'none'));
                    
                });
            }

            if( settings.showLastLink && settings.lastLinkText.length > 0 )
            {
                paginationContainer.each(function(){
                
                    $(this).append($('<li></li>').append($('<a href="#">'+settings.lastLinkText+'</a>').bind('click', { page: settings.lastPage }, function(e){
                        e.preventDefault();
                        setPage(e.data.page);
                    })).css('display',settings.currentPage < settings.lastPage?'inline-block':'none'));
                    
                });
            }
        
                }
        };                   

        settings.records = elem.children('li');
        settings.lastPage = Math.ceil(settings.records.length/settings.itemsPerPage);
        settings.currentPage = settings.initialPage >= 1 && settings.initialPage <= settings.lastPage ? settings.initialPage : 1;

        if( !settings.paginationSelector )
        {
           
            var id = Math.round((Math.random()*100000000));
            settings.paginationSelector = '#paging-links-'+id;
            var el = $('<ul class="paging-links" id="paging-links-'+id+'"></ul>');
            elem.before(el);
        }    

        setPage(settings.initialPage);
       
   };

   $.fn.paginate = function(options)
   {
       //return this.each(function()
       //{
           var element = $(this);
          
           // Return early if this element already has a plugin instance
           if( element.data('paginate') ) {

               return element.data('paginate');
           }

           // pass options to plugin constructor
           var paginate = new PaginatePlugin(this, options);

           // Store plugin object in this element's data
           element.data('paginate', paginate);
           
         return $(this); 
           
       //});
   };
})(jQuery);
