﻿jQuery.fn.SimplePager = function(config) {

    //参数
    var config = jQuery.extend({
        id: null,
        name: null,
        pageSize: 10,        //每页的记录数
        showNum: 10,         //显示的分页标签数
        nowPage: 0,          //当前页,从0开始
        totalRec: 0,
        edgeNum: 0,          //边缘显示数
        className: 'simplePager', //样式
        groupText: '每页 # 条',
        groupVal: [10, 15, 20, 25, 40], //每页多少条
        currText: '第#/#页',
        statText: 'Total: {total} rec(s)/{pages} pages ', //统计的文字{total},{start}{end}{pages}
        linkTo: "javascript:void(0);",         //href链接的Url，link风格
        firstText: "|&lt;",
        prevText: "Prev",
        nextText: "Next",
        lastText: "&gt;|",
        ellipsisText: "...",
        sizeShowAlways: true, //是否一直显示分页选择
        statShowAlways: true, //是否一致显示统计信息
        copyTo: null,
        callback: null //回调函数
    }, config || {});

    return this.each(function() {

        var panel = jQuery(this);
        var panelCopy = null;
        var linkDiv = $("<div class='link'></div>");
        var tipsDiv = $("<div class='stat'></div>");

        config.totalRec = (!config.totalRec || config.totalRec < 0) ? 0 : config.totalRec;
        config.pageSize = (!config.pageSize || config.pageSize < 0) ? 0 : config.pageSize;

        /**
        * 计算最大页数
        */
        function numPages() {
            return Math.ceil(config.totalRec / config.pageSize);
        }

        /**
        * 计算中间数的距左第一标签数
        */
        function leftMargin() {
            if (config.nowPage <= config.showNum)
                return config.nowPage - 1
            else
                return (config.nowPage - 1) % config.showNum
        }

        /**
        * 计算开始和结束点，返回数组
        */
        function getInterval() {
            var ne_half = Math.ceil(config.showNum / 2);
            var np = numPages();
            var start = config.nowPage > ne_half ? (config.nowPage - ne_half + 1) : 1;
            var end = config.nowPage > ne_half ? Math.min(config.nowPage + ne_half, np) : Math.min(config.showNum, np);
            return [start, end];
        }

        /**
        * 单击事件
        */
        function pageSelected(page_id, evt) {

            config.nowPage = page_id;
            psizeChg = $('select[name="sltPageSize"]', panel).val();

            if (config.callback == null) {

                drawLinks();
            }
            else {
                //数据加载中
                var continuePropagation = config.callback(page_id, psizeChg, panel);
                if (!continuePropagation) {
                    if (evt.stopPropagation) {
                        evt.stopPropagation();
                    }
                    else {
                        evt.cancelBubble = true;
                    }
                }
                return continuePropagation;
            }
        }

        /**
        * 生成分页，插入到容器中
        */
        function drawLinks(n) {
            panel.empty();
            linkDiv.empty();
            tipsDiv.empty();

            var interval = getInterval();
            var np = numPages();

            //点击事件
            var getClickHandler = function(page_id) {
                return function(evt) { return pageSelected(page_id, evt); }
            }
            //生成分页标签
            var appendItem = function(page_id, appendconfig) {
                page_id = page_id <= 0 ? 1 : (page_id < np ? page_id : np);
                appendconfig = jQuery.extend({ text: page_id, classes: "" }, appendconfig || {});

                //先判断两边的
                if (page_id == config.nowPage) {
                    if (appendconfig.classes == "") appendconfig.classes = "current";
                    $("<span>" + (appendconfig.text) + "</span>").addClass(appendconfig.classes).appendTo(linkDiv);
                }
                else {
                    $("<a>" + (appendconfig.text) + "</a>").addClass(appendconfig.classes)
						.bind("click", getClickHandler(page_id))
						.attr('href', config.linkTo.replace(/__id__/, page_id)).appendTo(linkDiv);
                }
            }
            //生成"first"标签
            if (config.nowPage > 1) {
                appendItem(1, { text: config.firstText, classes: "" });
            }
            else {
                appendItem(1, { text: config.firstText, classes: "disabled" });
            }
            //生成"Prev"标签
            if (config.nowPage > 1) {
                appendItem(config.nowPage - 1, { text: config.prevText, classes: "" });
            }
            else {
                appendItem(config.nowPage - 1, { text: config.prevText, classes: "disabled" });
            }
            //生成中间节点标签
            for (var i = interval[0]; i <= interval[1]; i++) {
                appendItem(i);
            }
            //生成Next节点标签
            if (config.nowPage <= np - 1) {
                appendItem(config.nowPage + 1, { text: config.nextText, classes: "" });
            }
            else {
                appendItem(config.nowPage + 1, { text: config.nextText, classes: "disabled" });
            }
            //生成Last节点标签
            if (config.nowPage <= np - 1) {
                appendItem(config.totalRec, { text: config.lastText, classes: "" });
            }
            else {
                appendItem(config.totalRec, { text: config.lastText, classes: "disabled" });
            }

            //            var str = new Array();

            //            //页尺寸选择
            //            if (config.sizeShowAlways) {
            //                var gText = config.groupText.split('#');
            //                str.push("<div class='separator' />");
            //                str.push("<span class='txt'>" + gText[0] + "</span>");
            //                str.push("<span class='txt'><select name='sltPageSize'>");

            //                for (var i = 0; i < config.groupVal.length; i++)
            //                    str.push("<option value='" + config.groupVal[i] + "'>" + config.groupVal[i] + "</option>");

            //                str.push("</select></span>");
            //                str.push("<span class='txt'>" + gText[1] + "</span>");
            //            }

            //统计信息
            if (config.statShowAlways) {

                var sText = config.statText.replace('{total}', config.totalRec);
                //当前页开始数
                sText = sText.replace('{start}', (config.nowPage - 1) * config.pageSize + 1);
                //当前页结束数
                if (np == config.nowPage) //最后一页
                    sText = sText.replace('{end}', config.totalRec);
                else
                    sText = sText.replace('{end}', config.nowPage * config.pageSize);
                //总页数
                sText = sText.replace('{pages}', np);

                tipsDiv.append(sText);
            }

            //最后插入
            panel.append(linkDiv);
            panel.append(tipsDiv);

            //事件			
            $('select[name="sltPageSize"]', panel).val(config.pageSize).change(function(e) { pageSelected(nowPage, e); });

        }


        this.selectPage = function(page_id) { pageSelected(page_id); }
        this.firstPage = function() {
            pageSelected(1);
        }
        this.prevPage = function() {
            if (config.nowPage > 0) {
                pageSelected(config.nowPage - 1);
                return true;
            }
            else {
                return false;
            }
        }
        this.nextPage = function() {
            if (config.nowPage < numPages() - 1) {
                pageSelected(config.nowPage + 1);
                return true;
            }
            else {
                return false;
            }
        }
        this.lastPage = function() {
            pageSelected(numPages());
        }
        this.setTips = function(htm) {
            $('.pPageStat', panel).html(htm);
        }

        /**
        * 初始化Pager
        */
        function init() {
            panel.attr("class", config.className);
            if (config.copyTo != null) { panelCopy = $('#' + config.copyTo); panelCopy.attr("class", config.className); }
        }

        this.load = function() {
            init();
            drawLinks();
            //copy
            if (config.copyTo != null && panelCopy.length > 0) {
                if (config.totalRec == 0) panelCopy.empty().hide();
                else panelCopy.empty().append($(this).children().clone(true)).show();
            }
        };

        this.load();

        return panel;
    });
}
