
(function($) {
      
  $.fn.paginate = function(options) {
  
    var defaults = {
      pageSize: 25,
      page: 0,
      itemSelector: false,
      navContainer: false,
      backHTML: "Back",
      forwardHTML:"Forward",
      navSize:5
    };
    
    var options = $.extend(defaults, options);

    
    return this.each(function() {
  
      var element = $(this);    
      element.data("page",options.page);
      
      var children = element.children(options.itemSelector).addClass("paginatorItem");
     
      
      
      if(children.length <= options.pageSize){ //only one page, do not display paginator
        return false;
      }
      
      children.hide(); //hide items we got everything sorted
      
      var pages = new Array();
      
      var page=0;
      var start = page*options.pageSize;
      var end = start+options.pageSize;
      var subset = children.slice(start,end);

      while( subset.length ) {
        pages[page++] = subset;
        
        start = page*options.pageSize;
        end = start+options.pageSize;
        
        subset = children.slice(start,end);
      }

      
      pages[options.page].show();
      
      element.data("pages",pages);
      
      var navigator = $("<ul />").addClass("horizontal").addClass("paginateNav");
      
      navigator.data("element",element);
      element.data("navigator",navigator);
      
      var back = $("<li />").attr("id","paginateBack").html(options.backHTML).appendTo(navigator);
      
      back.css({"text-decoration":"underline","cursor":"pointer"}); //temporary
      
      var navPages = new Array();
      
      $(pages).each(function(index){ 
 
        var pageElem = $("<li />").addClass("paginateSelect").data("page",index).html(index).appendTo(navigator);
        
        pageElem.click(function(){
          $(this).parent().data("element").navigate(index);
        });
        
        pageElem.css({"text-decoration":"underline","cursor":"pointer"}); //temporary
        if(index == options.page) {
          pageElem.css({"opacity":"1"});
        }
        else {
          pageElem.css({"opacity":"0.3"});
        }  
        
        
        
        navPages[index] = pageElem;
        
      });
      
      navigator.data("pages",navPages);
      
      
      
      var forward = $("<li />").attr("id","paginateForward").html(options.forwardHTML).appendTo(navigator);
      
      forward.css({"text-decoration":"underline","cursor":"pointer"}); //temporary
      
      if(options.navContainer && $(options.navContainer).length){
        $(options.navContainer).empty().append(navigator);
      }
      else{
        navigator.insertAfter(element); 
      }
      
      
      
      back.click(function(){
        $(this).parent().data("element").navigate("back");
      });
      
      forward.click(function(){
        $(this).parent().data("element").navigate("forward");
      });
      

        
      
      element.navigate = function(go) {
        if(go == "back") {
          go = element.data("page")-1; 
        }
        if(go == "forward") {
          go = element.data("page")+1; 
        }
              
        var pages = element.data("pages");
        var oldpage = element.data("page");
        
        if(typeof pages[go] === "undefined"){
          return false;
        }
        
        
        navigator = element.data("navigator");
        navpages = navigator.data("pages");
        
        navpages[oldpage].css({"opacity":"0.3"});
        navpages[go].css({"opacity":"1"});
        
        pages[oldpage].hide();
        pages[go].show();
        
        element.data("page",go);
        
        element.trigger("paginate");

        return true;
        
      }
      
    });
  }
  
  $.extend($.fn.paginate, {
    navigate: function (go) {
      var element = $(this);
      if(go == "back") {
        go = element.data("page")-1; 
      }
      if(go == "forward") {
        go = element.data("page")+1; 
      }
            
      var pages = element.data("pages");
      var oldpage = element.data("page");
      
      if(typeof pages[go] === "undefined"){
        return false;
      }
      
      
      navigator = element.data("navigator");
      navpages = navigator.data("pages");
      
      navpages[oldpage].css({"opacity":"0.3"});
      navpages[go].css({"opacity":"1"});
      
      pages[oldpage].hide();
      pages[go].show();
      
      element.data("page",go);   
      
      element.trigger("paginate");
      
      return true;
    }
      
    
    
  });
  
  
})(jQuery);

