﻿/*
 * jQuery Modality pagination plugin
 * http://modality.com
 *
 * Creator: Nathan Wilkinson
 * Version: 0.2
 */
(function($){
  $.fn.pagination = function(options){
    var opts = $.extend({
      items:'',
      showingClass:'.pagination-showing',
      controlsClass:'.pagination-controls',
      pagesize:10,
      currentpage:1,
      speed:0
    }, options);
  
    return this.each(function(){
      var container = this;
      
      createControls();
      showPage(1);
      
      $(opts.controlsClass).find('a').live('click', function(){
        if ($(this).is('a.pagination-update')){
          showPage(1);
          updatePagination();
          updateShowing();
        }
        else if ($(this).is('a.pagination-all')){
          showPage(1);
          
          $(opts.items).show();
          $(opts.items).removeClass('last');
          $(opts.items + ':last').addClass('last');
          
          $(opts.controlsClass).find('a.pagination-prev').addClass('disabled');
          $(opts.controlsClass).find('li a:eq(0)').removeClass('off');
          $(opts.controlsClass).find('a.pagination-next').addClass('disabled');
          $(this).addClass('disabled');
          
          var total = $(opts.items).length;
          $(opts.showingClass).html('Showing Records 1 to ' + total + ' of ' + total);
        }
        else if ($(this).is(':not(a.off)') && $(container).is(':not(:animated)')){
          if ($(this).hasClass('pagination-prev')) {
            if (opts.currentPage > 1)
              showPage(parseInt(opts.currentPage,10) - 1);
          } else if ($(this).hasClass('pagination-next')) {
            var totalpages = Math.ceil($(opts.items).length / opts.pagesize);
            if (opts.currentPage < totalpages)
              showPage(parseInt(opts.currentPage,10) + 1);
          } else {
            showPage($(this).attr('rel'));
          }
            
          $(opts.controlsClass).find('a.pagination-all').removeClass('off');
        }
      }).disableSelection();
      
      function showPage(page){
        var hheight = 0;
        var iheight = 0;
        var indexStart = (page - 1) * opts.pagesize;
        var indexEnd = page * opts.pagesize <= $(opts.items).length ? page * opts.pagesize : $(opts.items).length;
        
        opts.currentPage = page;
        
        $(opts.items).hide().removeClass('last');
        $(opts.items).slice(indexStart, indexEnd).show();
        $(opts.items).eq(indexEnd - 1).addClass('last');
        
        updateControls();
        updateShowing();
      }
      
      function updatePagination(){
        var total = $(opts.items).length;
        var pages = Math.ceil(parseFloat(total) / opts.pagesize);
        
        $(opts.controlsClass + ' li').show();
        $(opts.controlsClass).each(function(){
          $(this).find('li:gt(' + (pages - 1) + ')').hide();
        });
        
        if (pages > 1){
          $(opts.controlsClass).show();
          showPage(1);
        } else
          $(opts.controlsClass).hide();
      }
      
      function createControls(){
        var total = $(opts.items).length;
        var pages = Math.ceil(parseFloat(total) / opts.pagesize);
        var html = '';
        
        if (pages > 1){
          html  = '<a class="pagination-prev disabled">Previous</a>'
          html += '<ul>';
          for (var i=1; i<=pages; i++)
            html += '<li><a class="pagination-page" rel="' + i + '">' + i + '</a></li>';
          html += '</ul>';
          html += '<a class="pagination-next">Next</a>';
          html += '<a class="pagination-all">View All</a>';
        }
        html += '<a style="display:none;" class="pagination-update">update</a>';
        
        $(opts.controlsClass).html(html);
      }
      
      function updateControls(){
        if ($(opts.items).length > 0){
          $(opts.controlsClass).show();
          
          if (opts.currentPage == 1)
            $(opts.controlsClass).find('a.pagination-prev').addClass('disabled');
          else
            $(opts.controlsClass).find('a.pagination-prev').removeClass('disabled');
            
          if (opts.currentPage == Math.ceil(parseFloat($(opts.items).length) / opts.pagesize))
            $(opts.controlsClass).find('a.pagination-next').addClass('disabled');
          else
            $(opts.controlsClass).find('a.pagination-next').removeClass('disabled');
            
          $(opts.controlsClass).find('li a.off').removeClass('off');
          $(opts.controlsClass).find('li a:eq(' + (opts.currentPage - 1) + ')').addClass('off');
          
          $(opts.controlsClass).find('a.pagination-all').removeClass('disabled');
        } else {
          $(opts.controlsClass).hide();
        }
      }
      
      function updateShowing(){
        var currentIndex = (((opts.currentPage - 1) * opts.pagesize) + 1);
        var total = $(opts.items).length;
        var toIndex = (opts.currentPage * opts.pagesize) > total ? total : (opts.currentPage * opts.pagesize);
        
        if (total > 0)
          $(opts.showingClass).html('Showing Records ' + currentIndex + ' to ' + toIndex + ' of ' + total);
        else 
          $(opts.showingClass).html('');
      }
      
      function calcHeight(obj){
        return parseInt($(obj).height(),10) + 
                parseInt($(obj).css('padding-top'),10) + 
                parseInt($(obj).css('padding-bottom'),10) + 
                parseInt($(obj).css('border-bottom-width'),10);
      }
    });
  };
})(jQuery);
