/* Version 1.2.5 of the NovelProjects Paging
 * Author: Nathan Wilkinson
 * Website: http://www.novelprojects.com/ */
  
(function($){
  $.fn.paging = function(params) {
    var options = jQuery.extend({
      items: '.items',
      pageContainer : '.paging',
      pagesize: 20,
      page: 0,
      showPrevNext:true,
      showPages:true,
      showFirstLast:false,
      prevText:'prev',
      nextText:'next',
      maxPagesShown:99,
      pagesOrder:'surrounded' //'surrounded', 'left', 'right'
    }, params);
    
    return this.each(function() {
      //-- create paging links --//
      $(options.pageContainer).html('<ul class="paging-items"></ul>');
      
      switch (options.pagesOrder)
      {
        case 'surrounded':
          if (options.showPrevNext) $(options.pageContainer).find('.paging-items').addClass('paging-progression');
          if (options.showFirstLast) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item first">first</a></li>');
          if (options.showPrevNext) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item prev">' + options.prevText + '</a></li>');
          if (options.showPrevNext) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item next">' + options.nextText + '</a></li>');
          if (options.showFirstLast) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item last">last</a></li>');
          break;
        
        case 'left':
          if (options.showPrevNext) $(options.pageContainer).find('.paging-items').after('<ul class="paging-progression"><li><a class="paging-item first">first</a></li><li><a class="paging-item prev">' + options.prevText + '</a></li><li><a class="paging-item next">' + options.nextText + '</a></li><li><a class="paging-item last">last</a></li></ul>');
          break;
          
        case 'right':
          if (options.showPrevNext) $(options.pageContainer).find('.paging-items').before('<ul class="paging-progression"><li><a class="paging-item first">first</a></li><li><a class="paging-item prev">' + options.prevText + '</a></li><li><a class="paging-item next">' + options.nextText + '</a></li><li><a class="paging-item last">last</a></li></ul>');
          break;
          
        default:
          if (options.showPrevNext) $(options.pageContainer).find('.paging-items').addClass('paging-progression');
          if (options.showFirstLast) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item first">first</a></li>');
          if (options.showPrevNext) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item prev">' + options.prevText + '</a></li>');
          if (options.showPrevNext) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item next">' + options.nextText + '</a></li>');
          if (options.showFirstLast) $(options.pageContainer).find('.paging-progression').append('<li><a class="paging-item last">last</a></li>');
      }
      
      //-- bind events --//
      $(options.pageContainer).find('.prev').click(function(){
        if (options.page > 0){
          options.page--;
          selectIndex(options);
        }
      });
      
      $(options.pageContainer).find('.next').click(function(){
        var count = $(options.items).length;
        var maxpages = parseInt(count,10)/parseInt(options.pagesize,10) > Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) ? Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) + 1 : parseInt(count,10)/parseInt(options.pagesize,10);

        //alert('current: ' + options.page + '\nmax: ' + maxpages);

        if (options.page < (maxpages - 1)){
          options.page++;
          selectIndex(options);
        }
      });
      
      $(options.pageContainer).find('.first').click(function(){ 
        options.page = 0;
        selectIndex(options);
      });
      
      $(options.pageContainer).find('.last').click(function(){
        var count = $(options.items).length;
        var maxpages = parseInt(count,10)/parseInt(options.pagesize,10) > Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) ? Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) + 1 : parseInt(count,10)/parseInt(options.pagesize,10);

        options.page = maxpages - 1;
        selectIndex(options);
      });
      
      $(options.pageContainer).find('.page').live('click',function(){
        var count = $(options.items).length;
        var maxpages = parseInt(count,10)/parseInt(options.pagesize,10) > Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) ? Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) + 1 : parseInt(count,10)/parseInt(options.pagesize,10);
        var page = parseInt($(this).text(),10) - 1;

        if (page < maxpages){
          options.page = page;
          selectIndex(options);
        }
      });
    
      //-- initialize paging --//
      selectIndex(options);
    });
  };
  
function selectIndex(options){
  var count = parseInt($(options.items).length,10);
  var maxpages = parseInt(count,10)/parseInt(options.pagesize,10) > Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) ? Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) + 1 : parseInt(count,10)/parseInt(options.pagesize,10);
  
  if (maxpages < options.maxPagesShown) options.maxPagesShown = maxpages;
  
  if (options.showPages) createPages(options);
  
  $(options.pageContainer).find('.paging-item').removeClass('page-selected').removeClass('disabled');
  $(options.pageContainer).find('.paging-item[index=' + options.page + ']').addClass('page-selected');
  
  if (options.page == 0){
    $(options.pageContainer).find('.first').addClass('disabled');
    $(options.pageContainer).find('.prev').addClass('disabled');
  }
  else if (options.page == (maxpages - 1)){
    $(options.pageContainer).find('.next').addClass('disabled');
    $(options.pageContainer).find('.last').addClass('disabled');
  }
    
    
  var start = parseInt(options.page * options.pagesize,10);
  var end = count > start + parseInt(options.pagesize,10) ? start + parseInt(options.pagesize,10) : count;
  
  //alert('start: ' + start + '\nend: ' + end);
  
  $(options.items).hide();
  $(options.items).slice(start, end).show();
};

function createPages(options){
  var count = $(options.items).length;
  var maxpages = parseInt(count,10)/parseInt(options.pagesize,10) > Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) ? Math.floor(parseInt(count,10)/parseInt(options.pagesize,10)) + 1 : parseInt(count,10)/parseInt(options.pagesize,10);
  
  if (maxpages < options.maxPagesShown) options.maxPagesShown = maxpages;
  
  var mid = Math.floor(options.maxPagesShown/2)%2==0 ? Math.floor(options.maxPagesShown/2) + 1 : Math.floor(options.maxPagesShown/2);
  var start,end;
  
  if (maxpages > options.maxPagesShown){
    if (options.page + 1 >= mid){
      if ((options.page + mid)>=maxpages){
        start = maxpages - options.maxPagesShown;
      } else{
        start = options.page - mid + 1;
      }
    } else{
      start = 0;
    }
  } else{
    start = 0;
  }
  
  end = start + options.maxPagesShown;
  //alert('mid: ' + mid + '\nstart: ' + start + '\nend: ' + end);
  
  $(options.pageContainer).find('.paging-items .page').parent().remove();
  var $afterthis = $(options.pageContainer);
  
  if (options.pagesOrder == 'surrounded'){
    if (options.showFirstLast)
      $afterthis = $(options.pageContainer).find('.paging-items li:eq(1)');
    else if (options.showPrevNext)
      $afterthis = $(options.pageContainer).find('.paging-items li:eq(0)');
    else
      $afterthis = $(options.pageContainer).find('.paging-items');
  } else {
      $afterthis = $(options.pageContainer).find('.paging-items');
  }
  
  if (options.maxPagesShown > 1) {
    for(var i=options.maxPagesShown - 1; i>=0; i--){
      var newpage = '<li><a class="paging-item page" index="' + (i + start) + '">' + (i + start + 1) + '</a></li>';
      
      if (!options.showFirstLast && !options.showPrevNext)
        $afterthis = $afterthis.prepend(newpage);
      else
        $afterthis = $afterthis.after(newpage);
    }
    $(options.pageContainer).find('.paging-items').show();
  } else {
    $(options.pageContainer).find('.paging-items').hide();
  }
};
  
})(jQuery);
  