$.fn.pager = function(clas, options) {
  
  var settings = {    
    navId: 'nav',
    navClass: 'nav',
    navAttach: 'append',
    highlightClass: 'highlight',
    prevText: '&laquo;',
    nextText: '&raquo;',
    linkText: null,
    linkWrap: null,
    linkWrapInner: null,
    height: null,
    perPage: 5
  }
  if(options) $.extend(settings, options);
  
    
  return this.each( function () {
    
    var me = $(this);
    var totalItems;
    var currentPage = 0;
    var totalPages;
    var navid = '#' + settings.navId;
    
    function init () {
      totalItems = $(clas, me).not(navid).length;
      totalPages = Math.ceil(totalItems/settings.perPage);
      if(settings.height == null) {      
        settings.height = getHighest();
      }
      if(totalItems > 1) {
        makeNav();
        show();
        highlight();
      }      
      sizePanel();
      if(settings.linkWrap != null) {
        linkWrap();
      }
      if(settings.linkWrapInner != null) {
        linkWrapInner();
      }
    }
    function makeNav () {
      var str = '<div id="'+settings.navId+'" class="'+settings.navClass+'">';
      str += '<a href="#" rel="prev">'+settings.prevText+'</a>';
      for(var i = 0; i < totalPages; i++) {
        var j = i+1;
        str += '<a href="#" rel="'+j+'">';
        str += (settings.linkText == null) ? j : settings.linkText[j-1];        
        str += '</a>';
      }
      str += '<a href="#" rel="next">'+settings.nextText+'</a>';
      str += '</div>';
      switch (settings.navAttach) {    
        case 'before':
          $(me).before(str);
          break;
        case 'after':    
          $(me).after(str);
          break;
        case 'prepend':
          $(me).prepend(str);
          break;
        default:
          $(me).append(str);
          break;
      }
    }
    function show () {
      var items = $(me).find(clas);
      items.hide();
      
      items.each(function(count) {
        if (count >= (currentPage * settings.perPage) && count < (currentPage * settings.perPage + settings.perPage)) {
          $(this).show();
        }
      });
    }    
    function highlight () {
      $(me).find(navid).find('a').removeClass(settings.highlightClass);
      var show = $(me).find(navid).find('a').get(currentPage + 1);
      $(show).addClass(settings.highlightClass);
    }

    function sizePanel () {
      if($.browser.msie) {
        $(me).find(clas).not(navid).css( {
          height: settings.height
        });  
      } else {
        $(me).find(clas).not(navid).css( {
          minHeight: settings.height
        });
      }
    }
    function getHighest () {
      var highest = 0;
      $(me).find(clas).not(navid).each(function () {
        
        if(this.offsetHeight > highest) {
          highest = this.offsetHeight;
        }
      });
      highest = highest + 'px';
      return highest;
    }
    function getNavHeight () {
      var nav = $(navid).get(0);
      return nav.offsetHeight;
    }
    function linkWrap () {
      $(me).find(navid).find('a').wrap(settings.linkWrap);
    }
    function linkWrapInner () {
      $(me).find(navid).find('a').wrapInner(settings.linkWrapInner);
    }
    init();
    $(this).find(navid).find('a').click(function () {

      if($(this).attr('rel') == 'next') {
        if (currentPage + 1 < totalPages) {
          currentPage++;
        }
      }
      else if($(this).attr('rel') == 'prev') { 
        if (currentPage > 0) {  
          currentPage--;
        }
      }
      else {
        var j = $(this).attr('rel');  
        currentPage = j-1;    
      }
      
      show();
      highlight();
      return false;
    });
  });  
}
