(function ($) {
$.fn.extend({
smartpaginator: function (options) {
var settings = $.extend({
totalrecords: 0,
recordsperpage: 0,
length: 10,
next: 'next',
prev: 'prev',
first: 'first',
last: 'last',
go: 'go',
theme: 'green',
display: 'double',
initval: 1,
datacontainer: '', //data container id
dataelement: '', //children elements to be filtered e.g. tr or div
onchange: null,
controlsalways: false
}, options);
return this.each(function () {
var currentpage = 0;
var startpage = 0;
var totalpages = parseint(settings.totalrecords / settings.recordsperpage);
if (settings.totalrecords % settings.recordsperpage > 0) totalpages++;
var initialized = false;
var container = $(this).addclass('smartpager').addclass(settings.theme);
container.find('ul').remove();
container.find('div').remove();
container.find('span').remove();
var datacontainer;
var dataelements;
if (settings.datacontainer != '') {
datacontainer = $('#' + settings.datacontainer);
dataelements = $('' + settings.dataelement + '', datacontainer);
}
var list = $('
');
var btnprev = $('').text(settings.prev).click(function () { if ($(this).hasclass('disabled')) return false; currentpage = parseint(list.find('li a.active').text()) - 1; navigate(--currentpage); }).addclass('btn');
var btnnext = $('').text(settings.next).click(function () { if ($(this).hasclass('disabled')) return false; currentpage = parseint(list.find('li a.active').text()); navigate(currentpage); }).addclass('btn');
var btnfirst = $('').text(settings.first).click(function () { if ($(this).hasclass('disabled')) return false; currentpage = 0; navigate(0); }).addclass('btn');
var btnlast = $('').text(settings.last).click(function () { if ($(this).hasclass('disabled')) return false; currentpage = totalpages - 1; navigate(currentpage); }).addclass('btn');
var inputpage = $('').attr('type', 'text').keydown(function (e) {
if (istextselected(inputpage)) inputpage.val('');
if (e.which >= 48 && e.which < 58) {
var value = parseint(inputpage.val() + (e.which - 48));
if (!(value > 0 && value <= totalpages)) e.preventdefault();
} else if (!(e.which == 8 || e.which == 46)) e.preventdefault();
});
var btngo = $('').attr('type', 'button').attr('value', settings.go).addclass('btn').click(function () { if (inputpage.val() == '') return false; else { currentpage = parseint(inputpage.val()) - 1; navigate(currentpage); } });
container.append(btnfirst).append(btnprev).append(list).append(btnnext).append(btnlast).append($('').addclass('short').append(inputpage).append(btngo));
if (settings.display == 'single') {
btngo.css('display', 'none');
inputpage.css('display', 'none');
}
buildnavigation(startpage);
if (settings.initval == 0) settings.initval = 1;
currentpage = settings.initval - 1;
navigate(currentpage);
initialized = true;
function showlabels(pageindex) {
container.find('span').remove();
var upper = (pageindex + 1) * settings.recordsperpage;
if (upper > settings.totalrecords) upper = settings.totalrecords;
container.append($('').append($('').text(pageindex * settings.recordsperpage + 1)))
.append($('').text('-'))
.append($('').append($('').text(upper)))
.append($('').text('of'))
.append($('').append($('').text(settings.totalrecords)));
}
function buildnavigation(startpage) {
list.find('li').remove();
// zb 2013-11-18 修改 加入类型转换parseint,如果1页显示1
if (settings.totalrecords <= settings.recordsperpage) {
list.append($('')
.append($('').attr('id', 1).addclass(settings.theme).addclass('normal')
.attr('href', 'javascript:void(0)')
.text(1))
.click(function () {
currentpage = startpage + $(this).closest('li').prevall().length;
navigate(currentpage);
}));
return;
}
if (settings.totalrecords <= settings.recordsperpage) return;
for (var i = startpage; i < startpage + settings.length; i++) {
if (i == totalpages) break;
list.append($('')
.append($('').attr('id', (i + 1)).addclass(settings.theme).addclass('normal')
.attr('href', 'javascript:void(0)')
.text(i + 1))
.click(function () {
currentpage = startpage + $(this).closest('li').prevall().length;
navigate(currentpage);
}));
}
showlabels(startpage);
inputpage.val((startpage + 1));
list.find('li a').addclass(settings.theme).removeclass('active');
list.find('li:eq(0) a').addclass(settings.theme).addclass('active');
//set width of paginator
var lisize = list.find('li').length;
// zb 2014-12-19 修改列表宽度:bug 可能第一个窄最后一个宽
/**
var sw = list.find('li:eq(0) a').outerwidth() + (parseint(list.find('li:eq(0)').css('margin-left')) * 2);
var width = sw * list.find('li').length;
**/
var width = 0 ;
var lisize = list.find('li').length;
for(i=0 ; i 0) mid = (settings.length + 1) / 2;
var startindex = 0;
if (topage >= 0 && topage < totalpages) {
if (topage >= mid) {
if (totalpages - topage > mid)
startindex = topage - (mid - 1);
else if (totalpages > settings.length)
startindex = totalpages - settings.length;
}
buildnavigation(startindex); showlabels(currentpage);
list.find('li a').removeclass('active');
inputpage.val(currentpage + 1);
list.find('li a[id="' + (index + 1) + '"]').addclass('active');
var recordstartindex = currentpage * settings.recordsperpage;
var recordsendindex = recordstartindex + settings.recordsperpage;
if (recordsendindex > settings.totalrecords)
recordsendindex = settings.totalrecords % recordsendindex;
if (initialized) {
if (settings.onchange != null) {
settings.onchange((currentpage + 1), recordstartindex, recordsendindex);
}
}
if (datacontainer != null) {
if (datacontainer.length > 0) {
//hide all elements first
dataelements.css('display', 'none');
//display elements that need to be displayed
if ($(dataelements[0]).find('th').length > 0) { //if there is a header, keep it visible always
$(dataelements[0]).css('display', '');
recordstartindex++;
recordsendindex++;
}
for (var i = recordstartindex; i < recordsendindex; i++)
$(dataelements[i]).css('display', '');
}
}
showrequiredbuttons();
}
}
function showrequiredbuttons() {
if (totalpages > settings.length) {
if (currentpage > 0) {
if (!settings.controlsalways) {
btnprev.css('display', '');
}
else {
btnprev.css('display', '').removeclass('disabled');
}
}
else {
if (!settings.controlsalways) {
btnprev.css('display', 'none');
}
else {
btnprev.css('display', '').addclass('disabled');
}
}
if (currentpage > settings.length / 2 - 1) {
if (!settings.controlsalways) {
btnfirst.css('display', '');
}
else {
btnfirst.css('display', '').removeclass('disabled');
}
}
else {
if (!settings.controlsalways) {
btnfirst.css('display', 'none');
}
else {
btnfirst.css('display', '').addclass('disabled');
}
}
if (currentpage == totalpages - 1) {
if (!settings.controlsalways) {
btnnext.css('display', 'none');
}
else {
btnnext.css('display', '').addclass('disabled');
}
}
else {
if (!settings.controlsalways) {
btnnext.css('display', '');
}
else {
btnnext.css('display', '').removeclass('disabled');
}
}
if (totalpages > settings.length && currentpage < (totalpages - (settings.length / 2)) - 1) {
if (!settings.controlsalways) {
btnlast.css('display', '');
}
else {
btnlast.css('display', '').removeclass('disabled');
}
}
else {
if (!settings.controlsalways) {
btnlast.css('display', 'none');
}
else {
btnlast.css('display', '').addclass('disabled');
}
};
}
else {
if (!settings.controlsalways) {
btnfirst.css('display', 'none');
btnprev.css('display', 'none');
btnnext.css('display', 'none');
btnlast.css('display', 'none');
}
else {
btnfirst.css('display', '').addclass('disabled');
btnprev.css('display', '').addclass('disabled');
btnnext.css('display', '').addclass('disabled');
btnlast.css('display', '').addclass('disabled');
}
}
}
function istextselected(el) {
var startpos = el.get(0).selectionstart;
var endpos = el.get(0).selectionend;
var doc = document.selection;
if (doc && doc.createrange().text.length != 0) {
return true;
} else if (!doc && el.val().substring(startpos, endpos).length != 0) {
return true;
}
return false;
}
});
}
});
})(jquery);