jQuery.fn.paginator = function(settings){
  settings = jQuery.extend({
    maxHeight : 300,
    labelPrev : "Previous",
    labelNext : "Next"
  }, settings);
  
  var box = jQuery(this);
  var pageNumber = 0;
  var pageItems = 1;
  var tmp = 0;

  var currentPage = 0;

//  var text = $(box).html();
// 
//  $(box).html('<div class="jsItems"></div><div class="jsPager"></div>');
//  $(".jsItems").html(text);
  
  $(box).addClass('jsItems').parent().append('<div class="jsPager"></div>');

  var items = $(".jsItems > div, .jsItems > p, .jsItems > a");

  var navPrev = function () {
	$(".jsPrev").remove();
    var prevContainer = '<div class="jsPreview"></div>';
    $(".jsPager").append(prevContainer);
    if ($(".jsPrev").length == 0) {
      var prevBtn = '<a href="#" class="jsPrev">'+settings.labelPrev+'</a>';
      $(".jsPreview").append(prevBtn);
    }

    $(".jsPrev").click(function() {
      currentPage--;
      showNav();
      viewPage();
    });
  }

  var navNext = function () {
	$(".jsNext").remove();
	var nextContainer = '<div class="jsForward"></div>';
	$(".jsPager").append(nextContainer);
    if ($(".jsNext").length == 0) {
      var nextBtn = '<a href="#" class="jsNext">'+settings.labelNext+'</a>';
      $(".jsForward").append(nextBtn);
    } 
    
    $(".jsNext").click(function() {
      currentPage++;
      showNav();
      viewPage();
    });
  }

  var navPages = function () {
	var pagesContainer = '<div class="jsPages"></div>';
	$(".jsPager").append(pagesContainer);
    for (i=0; i< $(".jsItems > div").length; i++) {
      var title = i + 1;
      title = "" + title;
      var pageBtn = '<a href="#" class="jsNumber">'+title+'</a>';
      $(".jsPages").append(pageBtn);
    }

    $(".jsNumber").each(function () {
      $(this).click(function () {
        currentPage = $(this).text() - 1;
        showNav();
        viewPage();
      });
    });
  }

  var viewPage = function () {
    $(".jsItems > div, .jsItems > p, .jsItems > a").hide();
    $(".jsPage-" + currentPage).show(); 
  }

  var showNav = function() {
    if (currentPage >= ($(".jsItems > div, .jsItems > p, .jsItems > a").length-1)) {
      $(".jsNext").hide()
    } else {
      $(".jsNext").show()
    }
    if (currentPage <= 0) {
      $(".jsPrev").hide()
    } else {
      $(".jsPrev").show()
    }
    $(".jsNumber").removeClass("active").filter(function() {
      return $(this).text() == (currentPage+1);
    }).addClass("active");
    
    if ($(".jsPrevNext").length == 0) {
      var navContainer = '<div class="jsPrevNext"></div>';   
      $(".jsPager").prepend(navContainer);
      $(".jsPager > .jsPreview, .jsPager > .jsForward").appendTo(".jsPrevNext");
    }
  }

  var paginate = function () {
   $(".jsItems > div, .jsItems > p, .jsItems > a").hide();
   var pageNumber = 0;
   for (i=0; i<items.length; i++) {
     if ($(".jsPage-" + pageNumber).length == 0) {
    	 var pageBox = '<div class="jsPage-'+pageNumber+'"></div>';
    	 $(".jsItems").append(pageBox);
     }
     var item = items[i];
     
     $(".jsPage-" + pageNumber).append(item);
     $(item).show();
     
     var glueBox = '<div class="glue" style="clear:both;"></div>';
     $(".jsPage-" + pageNumber).append(glueBox);

     if (settings.maxHeight < $(".jsPage-" + pageNumber).height()) {
       pageNumber++;
       var pageBox = '<div class="jsPage-'+pageNumber+'"></div>';
  	   $(".jsItems").append(pageBox);
  	   $(item).appendTo(".jsPage-" + pageNumber);
     } else {
       $(".jsPage-" + pageNumber + " .glue").remove();
     }
   }
   viewPage();
   navPrev();
   navPages();
   navNext();
   showNav();
  };

  if ($(box).height() > settings.maxHeight) {
    paginate();
  }

}