(function($) {
    $.extend({
        tablesorterPager: new function() {

            function updatePageDisplay(c, table) {

                var c = table.config;

                //var _pageSize2 = $(config.cssPageSize,c.container).val();
                //c.size = _pageSize2;
                c.totalPages = Math.ceil(c.totalRows / c.size);


                var loaded_rows = c.size > 0 ? c.size : c.totalPages;
                var cPage = (c.page + 1);
                var _start = ((loaded_rows * (cPage - 1) + 1));
                var _end = ((loaded_rows * cPage) > c.totalRows ? c.totalRows : loaded_rows * cPage);
                var _pageSize = $(config.cssTestingPages, c.container).val();




                updatePages(c, table);

                //it total records is less than or = to 20 then hide the
                //the drop down list
                if (c.totalRows <= 20)
                    $(("#pageSizer"), c.container).hide();

                //hide page numbers if there is only one page	
                if (c.totalRows <= $(config.cssPageSize, c.container).val())
                    $(config.cssPageNav, c.container).hide();
                else
                    $(config.cssPageNav, c.container).show();


                //shows row viewer Showing x to x of x Results
                $(c.cssViewRecords, c.container).text('Showing ' + _start + ' to ' + _end + ' of ' + c.totalRows + ' Results');
                //if ($("#pager_dnarna")) {
                    $(c.cssPageSize, c.container).val(c.size);
                //}
                
            }



            function getInterval(c) {
                var numToDisplay = c.numDisplayEntries - 1;
                var half = Math.ceil(numToDisplay / 2);
                var np = c.totalPages;
                var cPage = c.page + 1;
                var ulimit = np - numToDisplay;
                var start = cPage > half ? Math.max(Math.min(cPage - half, ulimit), 0) : 0;
                var end = cPage > half ? Math.min(cPage + half, np) : Math.min(numToDisplay, np);


                //fixes issus with a starting integer of 0
                if (start == 0) {
                    start = 1;

                    if (end == 4 && c.numDisplayEntries < np) {
                        end = c.numDisplayEntries;
                    }
                }


                return [start, end];



            }

            function updatePages(c, table) {
                var c = table.config;
                var panel = $(c.cssPages, c.container);
                var cPage = (c.page + 1);

                var getClickHandler = function(table, page_id) {
                    return function(evt) { moveToSelectedPage(table, page_id); }
                }

                panel.empty();

                var interval = getInterval(c);

                for (var x = interval[0]; x <= interval[1]; x++) {
                    if (x == cPage) {
                        var lnk = $("<span class='current'>" + x + "</span>");
                    } else {
                        var lnk = $("<span class='pagenumber'>" + x + "</span>")
			                .bind("click", getClickHandler(table, x));
                    }

                    panel.append(lnk);
                }



            }




            function setPageSize(table, size) {
                var c = table.config;
                c.size = size;
                c.totalPages = Math.ceil(c.totalRows / c.size);
                c.pagerPositionSet = false;
                moveToPage(table);
                fixPosition(table);
            }

            function fixPosition(table) {
                var c = table.config;
                if (!c.pagerPositionSet && c.positionFixed) {
                    var c = table.config, o = $(table);
                    if (o.offset) {
                        c.container.css({
                            top: o.offset().top + o.height() + 'px',
                            position: 'absolute'
                        });
                    }
                    c.pagerPositionSet = true;
                }
            }

            function moveToFirstPage(table) {
                var c = table.config;
                c.page = 0;
                moveToPage(table);
            }

            function moveToLastPage(table) {
                var c = table.config;
                c.page = (c.totalPages - 1);
                moveToPage(table);
            }

            function moveToNextPage(table) {
                var c = table.config;
                c.page++;
                if (c.page >= (c.totalPages - 1)) {
                    c.page = (c.totalPages - 1);
                }
                moveToPage(table);
            }

            function moveToPrevPage(table) {
                var c = table.config;
                c.page--;
                if (c.page <= 0) {
                    c.page = 0;
                }
                moveToPage(table);
            }

            function moveToSelectedPage(table, selPageNumber) {
                var c = table.config;
                c.page = (selPageNumber - 1);
                moveToPage(table);
            }


            function moveToPage(table) {
                var c = table.config;
                if (c.page < 0 || c.page > (c.totalPages - 1)) {
                    c.page = 0;
                }

                renderTable(table, c.rowsCopy);
            }

            function renderTable(table, rows) {

                var c = table.config;
                //to persist page size when broswer back button is hit
                //var pageSize = $(config.cssPageSize,c.container).val();
                //c.size = pageSize;

                var l = rows.length;
                var s = (c.page * c.size);
                var e = (s + c.size);
                if (e > rows.length) {
                    e = rows.length;
                }


                var tableBody = $(table.tBodies[0]);

                // clear the table body

                $.tablesorter.clearTableBody(table);

                for (var i = s; i < e; i++) {

                    //tableBody.append(rows[i]);

                    var o = rows[i];
                    var l = o.length;
                    for (var j = 0; j < l; j++) {

                        tableBody[0].appendChild(o[j]);

                    }
                }

                fixPosition(table, tableBody);

                $(table).trigger("applyWidgets");

                if (c.page >= c.totalPages) {
                    moveToLastPage(table);
                }

                updatePageDisplay(c, table);
            }

            this.appender = function(table, rows) {

                var c = table.config;

                c.rowsCopy = rows;
                c.totalRows = rows.length;
                c.totalPages = Math.ceil(c.totalRows / c.size);

                renderTable(table, rows);
            };

            this.defaults = {
                size: 10,
                offset: 0,
                page: 0,
                totalRows: 0,
                totalPages: 0,
                numDisplayEntries: 5,
                container: null,
                cssNext: '.next',
                cssPrev: '.prev',
                cssFirst: '.first',
                cssLast: '.last',
                cssPageDisplay: '.pagedisplay',
                cssViewRecords: '.viewRecords',
                cssPageSize: '.pagesize',
                cssPageNumber: '.pagenumber',
                cssTestingPages: '#pagenumber',
                cssPages: '.pages',
                cssPageNav: '#pageNav',
                seperator: "/",
                positionFixed: true,
                appender: this.appender
            };


            this.construct = function(settings) {

                return this.each(function() {

                    config = $.extend(this.config, $.tablesorterPager.defaults, settings);

                    var table = this, pager = config.container;

                    $(this).trigger("appendCache");

                    config.size = parseInt($(".pagesize", pager).val());

                    $(config.cssFirst, pager).click(function() {
                        moveToFirstPage(table);
                        return false;
                    });
                    $(config.cssNext, pager).click(function() {
                        moveToNextPage(table);
                        return false;
                    });
                    $(config.cssPrev, pager).click(function() {
                        moveToPrevPage(table);
                        return false;
                    });
                    $(config.cssLast, pager).click(function() {
                        moveToLastPage(table);
                        return false;
                    });
                    $(config.cssPageSize, pager).change(function() {
                        setPageSize(table, parseInt($(this).val()));
                        return false;
                    });
                    $(config.cssPageNumber, pager).change(function() {
                        moveToSelectedPage(table, parseInt($(this).val()));
                        return false;
                    });

                });
            };

        }
    });
    // extend plugin scope
    $.fn.extend({
        tablesorterPager: $.tablesorterPager.construct
    });

})(jQuery);				
