﻿$.fn.pager = function(clas, options) {
    
    var settings = {        
        navId: 'nav',
        navClass: 'nav',
        navAttach: 'append',
        highlightClass: 'highlight',
        prevText: '&laquo;',
        nextText: '&raquo;',
        linkText: null,
        linkWrap: null,
        height: null,
        pagesToShow:10
    }
    if(options) $.extend(settings, options);
    
        
    return this.each( function () {
        
        var me = $(this);
        var size;
          var i = 0;        
        var navid = '#'+settings.navId;
        var navclass = '.'+settings.navClass;
        
        function init () {
            size = $(clas, me).not(navid).size();
            if(settings.height == null) {            
                settings.height = getHighest();
            }
            if(size > 1) {
                makeNav();
                show();
                highlight();
            }            
            sizePanel();
            if(settings.linkWrap != null) {
                linkWrap();
            }
        }
        function makeNav () {        
            var str = '<div id="'+settings.navId+'" class="'+settings.navClass+'">';
            str += '<a href="#" rel="prev">'+settings.prevText+'</a>';
            for(var i = 0; i < size; i++) {
                var j = i+1;
                str += '<a href="#" class="nv_'+(settings.navId+j)+'" rel="'+j+'" style="display:'+((i<settings.pagesToShow)?"inline":"none")+'">';
                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).append(str);
                    break;
                case 'prepend':
                    $(me).prepend(str);
                    break;
                case 'topbottom':
                    $(me).prepend(str);
                    $(me).append(str);
                    break;
                default:
                    $(me).append(str);
                    break;
            }
        }
        function show () {
            $(me).find(clas).not(navid).hide();
            var show = $(me).find(clas).not(navid).get(i);
            $(show).show();
        }        
        function highlight () {
            var startPage = (i+1)-Math.round((settings.pagesToShow-1)/2);
            var endPage = startPage + (settings.pagesToShow-1);
            if (endPage > size){
                startPage -= (endPage - size);
                endPage = size;
            }
            if (startPage < 1)
            {
                endPage += (startPage * -1) + 1;
                startPage = 1;
                if (endPage > size)
                {
                    endPage = size;
                }
            }
            $(me).find(navclass).find('a').removeClass(settings.highlightClass);
            for(j=1;j<=size;j++){
                if(j >= startPage && j <= endPage){
                    $('.nv_'+settings.navId+j).css({display: "inline"});
                    if((i+1) == j){
                        $('.nv_'+settings.navId+j).addClass(settings.highlightClass);
                    }
                } else {
                    $('.nv_'+settings.navId+j).css({display: "none"});
                }
            }
            $(me).find(navclass).find('a').blur();
        }
        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);
        }
        init();
        $(this).find(navid).find("a").click(function () {
            if($(this).attr('rel') == 'next') {
                if(i + 1 < size) {
                    i = i+1;
                }
            } else if($(this).attr('rel') == 'prev') { 
                if(i > 0) {    
                    i = i-1;
                }
            } else {        
                var j = $(this).attr('rel');    
                i = j-1;        
            }
            show();
            highlight();
            return false;
        });
    });    
}
