/*!
* jq-paginator v2.0.2
* http://jqpaginator.keenwon.com
*/
(function () {
'use strict';
/* eslint-env jquery */
var $ = jquery;
$.jqpaginator = function (el, options) {
if (!(this instanceof $.jqpaginator)) {
return new $.jqpaginator(el, options)
}
var self = this;
self.$container = $(el);
self.$container.data('jqpaginator', self);
self.init = function () {
if (options.first || options.prev || options.next || options.last || options.page) {
options = $.extend(
{},
{
first: '',
prev: '',
next: '',
last: '',
page: ''
},
options
);
}
self.options = $.extend({}, $.jqpaginator.defaultoptions, options);
self.verify();
self.extendjquery();
self.render();
self.fireevent(this.options.currentpage, 'init');
};
self.verify = function () {
var opts = self.options;
if (!self.isnumber(opts.totalpages)) {
throw new error('[jqpaginator] type error: totalpages')
}
if (!self.isnumber(opts.totalcounts)) {
throw new error('[jqpaginator] type error: totalcounts')
}
if (!self.isnumber(opts.pagesize)) {
throw new error('[jqpaginator] type error: pagesize')
}
if (!self.isnumber(opts.currentpage)) {
throw new error('[jqpaginator] type error: currentpage')
}
if (!self.isnumber(opts.visiblepages)) {
throw new error('[jqpaginator] type error: visiblepages')
}
if (!opts.totalpages && !opts.totalcounts) {
throw new error('[jqpaginator] totalcounts or totalpages is required')
}
if (!opts.totalpages && opts.totalcounts && !opts.pagesize) {
throw new error('[jqpaginator] pagesize is required')
}
if (opts.totalcounts && opts.pagesize) {
opts.totalpages = math.ceil(opts.totalcounts / opts.pagesize);
}
if (opts.currentpage < 1 || opts.currentpage > opts.totalpages) {
throw new error('[jqpaginator] currentpage is incorrect')
}
if (opts.totalpages < 1) {
throw new error('[jqpaginator] totalpages cannot be less currentpage')
}
};
self.extendjquery = function () {
$.fn.jqpaginatorhtml = function (s) {
return s
? this.before(s).remove()
: $('
')
.append(this.eq(0).clone())
.html()
};
};
self.render = function () {
self.renderhtml();
self.setstatus();
self.bindevents();
};
self.renderhtml = function () {
var html = [];
var pages = self.getpages();
for (var i = 0, j = pages.length; i < j; i++) {
html.push(self.builditem('page', pages[i]));
}
self.isenable('prev') && html.unshift(self.builditem('prev', self.options.currentpage - 1));
self.isenable('first') && html.unshift(self.builditem('first', 1));
self.isenable('statistics') && html.unshift(self.builditem('statistics'));
self.isenable('next') && html.push(self.builditem('next', self.options.currentpage + 1));
self.isenable('last') && html.push(self.builditem('last', self.options.totalpages));
// html.push("
共" + self.options.totalpages + "页" + self.options.totalcounts + "条")
if (self.options.wrapper) {
self.$container.html(
$(self.options.wrapper)
.html(html.join(''))
.jqpaginatorhtml()
);
} else {
self.$container.html(html.join(''));
}
};
self.builditem = function (type, pagedata) {
var html = self.options[type]
.replace(/{{page}}/g, pagedata)
.replace(/{{totalpages}}/g, self.options.totalpages)
.replace(/{{totalcounts}}/g, self.options.totalcounts);
return $(html)
.attr({
'jp-role': type,
'jp-data': pagedata
})
.jqpaginatorhtml()
};
self.setstatus = function () {
var options = self.options;
if (!self.isenable('first') || options.currentpage === 1) {
$('[jp-role=first]', self.$container).addclass(options.disableclass);
}
if (!self.isenable('prev') || options.currentpage === 1) {
$('[jp-role=prev]', self.$container).addclass(options.disableclass);
}
if (!self.isenable('next') || options.currentpage >= options.totalpages) {
$('[jp-role=next]', self.$container).addclass(options.disableclass);
}
if (!self.isenable('last') || options.currentpage >= options.totalpages) {
$('[jp-role=last]', self.$container).addclass(options.disableclass);
}
$('[jp-role=page]', self.$container).removeclass(options.activeclass);
$('[jp-role=page][jp-data=' + options.currentpage + ']', self.$container).addclass(options.activeclass);
};
self.getpages = function () {
var pages = [];
var visiblepages = self.options.visiblepages;
var currentpage = self.options.currentpage;
var totalpages = self.options.totalpages;
if (visiblepages > totalpages) {
visiblepages = totalpages;
}
var half = math.floor(visiblepages / 2);
var start = currentpage - half + 1 - (visiblepages % 2);
var end = currentpage + half;
if (start < 1) {
start = 1;
end = visiblepages;
}
if (end > totalpages) {
end = totalpages;
start = 1 + totalpages - visiblepages;
}
var itpage = start;
while (itpage <= end) {
pages.push(itpage);
itpage++;
}
return pages
};
self.isnumber = function (value) {
var type = typeof value;
return type === 'number' || type === 'undefined'
};
self.isenable = function (type) {
return self.options[type] && typeof self.options[type] === 'string'
};
self.switchpage = function (pageindex) {
self.options.currentpage = pageindex;
self.render();
};
self.fireevent = function (pageindex, type) {
return typeof self.options.onpagechange !== 'function' || self.options.onpagechange(pageindex, type) !== false
};
self.callmethod = function (method, options) {
switch (method) {
case 'option':
self.options = $.extend({}, self.options, options);
self.verify();
self.render();
break
case 'destroy':
self.$container.empty();
self.$container.removedata('jqpaginator');
break
default:
throw new error('[jqpaginator] method "' + method + '" does not exist')
}
return self.$container
};
self.bindevents = function () {
var opts = self.options;
self.$container.off();
self.$container.on('click', '[jp-role]', function () {
var $el = $(this);
if ($el.hasclass(opts.disableclass) || $el.hasclass(opts.activeclass)) {
return
}
var pageindex = +$el.attr('jp-data');
if (self.fireevent(pageindex, 'change')) {
self.switchpage(pageindex);
}
});
};
self.init();
return self.$container
};
$.jqpaginator.defaultoptions = {
wrapper: '',
first: 'first',
prev: 'previous',
next: 'next',
last: 'last',
page: '{{page}}',
totalpages: 0,
totalcounts: 0,
pagesize: 0,
currentpage: 1,
visiblepages: 7,
disableclass: 'disabled',
activeclass: 'active',
onpagechange: null
};
$.fn.jqpaginator = function () {
var self = this;
var args = array.prototype.slice.call(arguments);
if (typeof args[0] === 'string') {
var $instance = $(self).data('jqpaginator');
if (!$instance) {
throw new error('[jqpaginator] the element is not instantiated')
} else {
return $instance.callmethod(args[0], args[1])
}
} else {
return new $.jqpaginator(this, args[0])
}
};
}());