/* 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: 'first',
      nextText: 'last',
      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);
        }

        window.getSelection().removeAllRanges();
      });

      $(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);
        }

        window.getSelection().removeAllRanges();
      });

      $(options.pageContainer).find('.first').click(function() {
        options.page = 0;
        selectIndex(options);

        window.getSelection().removeAllRanges();
      });

      $(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);

        window.getSelection().removeAllRanges();
      });

      $(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);
        }

        window.getSelection().removeAllRanges();
      });

      //-- 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);
  
