﻿jQuery.fn.vPage = function(options) {
    options = jQuery.extend({
        pagesize: 20,
        recordcount: 0,
        currentpage: 1,
        pagekey: "page",
        pageid: "{$pageid}",
        text_prev: "上一页",
        text_next: "下一页",
        text_frist: "首页",
        text_last: "尾页",
        text_total: "记录总数{0}条",
        text_pagesize: "每页{0}条",
        text_page: "当前第{0}页",
        css_current: "current",
        css_prev: "prev",
        css_next: "next",
        css_frist: "frist",
        css_last: "last",
        show_prev: true,
        show_frist: true,
        show_report: true,
        url: "#",
        offset: 4
    }, options || {});
		var _this = this;
    var currentpage = options.currentpage || 1;
    this.getpage=function()
    {
    	return currentpage;
    };
    return this.each(function() {
        function Replace(str, pattern, o) {
            pattern = eval("/(?:" + pattern + ")/");
            try {
                return str.replace(pattern.exec(str), o);
            }
            catch (ex) { return str; }
        }
        function SetPage(pageid) {
            if (pageid < 1) pageid = 1;
            if (pageid > PageCount()) pageid = PageCount();
            var url = options.url;
            if (!url) url = location.href;
						url=url.toLowerCase();
            var pattern = /\{0\}/i;
            if (pattern.test(url)) {
                url = url.replace(pattern.exec(url), pageid);
            }
            else {
                if (url.indexOf("?") < 0) url += "?";
                url = Replace(url, "" + options.pagekey + "=\\d+", "");
                if (url.substr(url.length - 1, 1) != "&" && url.substr(url.length - 1, 1) != "?") url += "&";
                url += options.pagekey + "=" + pageid;
            }
            return url.replace(/&&/i,"&");
        }
        function SetDisabled(obj, v) {
            obj.attr("disabled", v).find("a").attr("disabled", v);
        };
        function OnClick(pageid, event) {
            currentpage = pageid;
            DrawLinks();
            if(options.event)options.event(_this);
        };
        function InitDisabled() {

            if (currentpage <= 1) {
                SetDisabled(_this.find("." + options.css_frist), true);
                SetDisabled(_this.find("." + options.css_prev), true);
            }
            else {
                SetDisabled(_this.find("." + options.css_frist), false);
                SetDisabled(_this.find("." + options.css_prev), false);
            }
            if (currentpage >= PageCount()) {
                SetDisabled(_this.find("." + options.css_next), true);
                SetDisabled(_this.find("." + options.css_last), true);
            }
            else {
                SetDisabled(_this.find("." + options.css_next), false);
                SetDisabled(_this.find("." + options.css_last), false);
            }
            if (options.callback) {
                options.callback(currentpage, _this);
                return false;
            }
        };
        function PageCount() {
            return Math.ceil(options.recordcount / options.pagesize);
        };
        function OnPrevClick(event) {
            currentpage--;
            if (currentpage < 1) currentpage = 1;
            OnClick(currentpage, event);
        };
        function OnNextClick(event) {
            currentpage++;
            if (currentpage > PageCount()) currentpage = PageCount();
            OnClick(currentpage, event);
        };
        var OnClickEvent = function(pageid) {
            return function(evt) { return OnClick(pageid, evt); }
        };
        var OnNextEvent = function() {
            return function(evt) { return OnNextClick(evt); }
        };
        var OnPrevEvent = function() {
            return function(evt) { return OnPrevClick(evt); }
        };
        function MakeLink(text, pageid, ev) {
            var event1;
            if (ev == "next") event1 = OnNextEvent;
            else if (ev == "prev") event1 = OnPrevEvent;
            else event1 = OnClickEvent;
            var a= $("<a>" + (text) + "</a>")
						.bind("click", event1(pageid));
						if(!options.event)
						{
							a.attr('href', SetPage(pageid));
						}
						a.css({cursor:'pointer'});
						return a;
        };
        function AddLink(opt, uls) {
            var li = $("<li></li>").appendTo(uls);
            if (opt.css) li.addClass(opt.css);
            MakeLink(opt.text, opt.pageid, opt.eve).appendTo(li);
        };
        function DrawLinks() {
            _this.empty();
            var uls = $("<ul></ul>").appendTo(_this);
            if (options.show_frist)
                AddLink({ text: options.text_frist, pageid: 1, css: options.css_frist }, uls);
            if (options.show_prev)
                AddLink({ text: options.text_prev, pageid: currentpage - 1, css: options.css_prev, eve: "prev" }, uls);
            var iLen = 0;
            var totalpage = PageCount();
            var iCut2 = (options.offset - (totalpage - currentpage) < 0 ? 0 : options.offset - (totalpage - currentpage));
            var iCut = 0;
            for (var i = currentpage - options.offset - iCut2; i < currentpage + iCut + options.offset + 1; i++) {
                if (i < 1) { iCut++; continue; }
                if (i > totalpage) { break; }
                if (currentpage == i)
                    AddLink({ text: i, pageid: i, css: options.css_current }, uls);
                else
                    AddLink({ text: i, pageid: i }, uls);
                iLen++;
            }
            if (options.show_prev)
                AddLink({ text: options.text_next, css: options.css_next, eve: "next", pageid: currentpage + 1 }, uls);
            if (options.show_frist)
                AddLink({ text: options.text_last, css: options.css_last, pageid: PageCount() }, uls);
            InitDisabled();
            if (options.show_report) {
                var report = $("<ul class=\"report\"></ul>").appendTo(_this);
                $("<li></li>").appendTo(report).html(options.text_total.replace("{0}", options.recordcount));
                $("<li></li>").appendTo(report).html(options.text_pagesize.replace("{0}", options.pagesize));
                $("<li></li>").appendTo(report).html(options.text_page.replace("{0}", currentpage));
                
            }
        };
        DrawLinks();
    });
};
