jquery.tablesorter.pager.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. function sprintf(format, etc) {
  2. var arg = arguments;
  3. var i = 1;
  4. return format.replace(/%((%)|s)/g, function (m) { return m[2] || arg[i++] })
  5. }
  6. (function($) {
  7. $.extend({
  8. tablesorterPager: new function() {
  9. function updatePageDisplay(c) {
  10. var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);
  11. }
  12. function setPageSize(table,size) {
  13. var c = table.config;
  14. if (size == -1)
  15. {
  16. size = c.totalRows;
  17. }
  18. c.size = size;
  19. c.totalPages = Math.ceil(c.totalRows / c.size);
  20. c.pagerPositionSet = false;
  21. moveToPage(table);
  22. fixPosition(table);
  23. }
  24. function fixPosition(table) {
  25. var c = table.config;
  26. if(!c.pagerPositionSet && c.positionFixed) {
  27. var c = table.config, o = $(table);
  28. if(o.offset) {
  29. c.container.css({
  30. top: o.offset().top + o.height() + 'px',
  31. position: 'absolute'
  32. });
  33. }
  34. c.pagerPositionSet = true;
  35. }
  36. }
  37. function moveToFirstPage(table) {
  38. var c = table.config;
  39. c.page = 0;
  40. moveToPage(table);
  41. }
  42. function moveToLastPage(table) {
  43. var c = table.config;
  44. c.page = (c.totalPages-1);
  45. moveToPage(table);
  46. }
  47. function moveToNextPage(table) {
  48. var c = table.config;
  49. c.page++;
  50. if(c.page >= (c.totalPages-1)) {
  51. c.page = (c.totalPages-1);
  52. }
  53. moveToPage(table);
  54. }
  55. function moveToPrevPage(table) {
  56. var c = table.config;
  57. c.page--;
  58. if(c.page <= 0) {
  59. c.page = 0;
  60. }
  61. moveToPage(table);
  62. }
  63. function moveToPage(table) {
  64. var c = table.config;
  65. if(c.page < 0 || c.page > (c.totalPages-1)) {
  66. c.page = 0;
  67. }
  68. renderTable(table,c.rowsCopy);
  69. }
  70. function checkAll(table, pager, value)
  71. {
  72. // Mark all the displayed items as check or unchecked depending on the value
  73. $(table).find(':checkbox[name^=selectObj]').attr('checked', value);
  74. // Set the 'selectionMode' for the future objects to load
  75. if (value)
  76. {
  77. table.config.selectionMode = 'negative';
  78. }
  79. else
  80. {
  81. table.config.selectionMode = 'positive';
  82. }
  83. $(pager).find(':input[name=selectionMode]').val(table.config.selectionMode);
  84. // Reset the list of saved selection...
  85. resetStoredSelection(pager);
  86. updateCounter(table, pager);
  87. return true;
  88. }
  89. function resetStoredSelection(pager)
  90. {
  91. $(':input[name^=storedSelection]', pager).remove();
  92. }
  93. function updateSelection(table, pager, id, value)
  94. {
  95. var valueToStore = value;
  96. if (table.config.selectionMode == 'negative')
  97. {
  98. valueToStore = !(valueToStore);
  99. }
  100. if (valueToStore)
  101. {
  102. if (table.config.select_mode == 'single')
  103. {
  104. $(':input[name^=storedSelection]', pager).remove(); // Remove any previous selection
  105. }
  106. if ($('#'+id, pager).length ==0)
  107. {
  108. $(pager).append($('<input type="hidden" id="'+id+'" name="storedSelection[]" value="'+id+'"></input>'));
  109. }
  110. }
  111. else
  112. {
  113. if ($('#'+id, pager).length !=0)
  114. {
  115. $('#'+id, pager).remove();
  116. }
  117. }
  118. updateCounter(table, pager);
  119. }
  120. function updateCounter(table, pager)
  121. {
  122. var ex = $(':input[name^=storedSelection]', pager).length;
  123. var s = ex;
  124. if (table.config.selectionMode == 'negative')
  125. {
  126. s = table.config.totalRows - ex;
  127. }
  128. $('.selectedCount',pager).text(s);
  129. if (table.config.cssCount != '')
  130. {
  131. $(table.config.cssCount).val(s);
  132. $(table.config.cssCount).trigger('change');
  133. }
  134. }
  135. function getData(table, start, end)
  136. {
  137. if (table.ajax_request)
  138. {
  139. table.ajax_request.abort();
  140. table.ajax_request = null;
  141. }
  142. var c = table.config;
  143. var s = c.sortList[0];
  144. var s_col = null;
  145. var s_order = null;
  146. if (s != undefined)
  147. {
  148. s_col = s[0];
  149. s_order = (s[1] == 0) ? 'asc' : 'desc';
  150. }
  151. $('#loading', table.config.container).html('<img src="../images/indicator.gif" />');
  152. table.ajax_request = $.post(AddAppContext(GetAbsoluteUrlAppRoot()+"pages/ajax.render.php"),
  153. { operation: 'pagination',
  154. filter: c.filter,
  155. extra_param: c.extra_params,
  156. start: start,
  157. end: end,
  158. sort_col: s_col,
  159. sort_order: s_order,
  160. select_mode: c.select_mode,
  161. display_key: c.displayKey,
  162. display_list: c.displayList
  163. },
  164. function(data)
  165. {
  166. table.ajax_request = null; // Ajax request completed
  167. oData = $(data);
  168. var tableBody = $(table.tBodies[0]);
  169. // clear the table body
  170. $.tablesorter.clearTableBody(table);
  171. for(var i = 0; i < end-start; i++) {
  172. //tableBody.append(rows[i]);
  173. //var o = rows[i];
  174. var r = $(oData[i]);
  175. var l = r.length;
  176. for(var j=0; j < l; j++) {
  177. //tableBody[0].appendChild(r);
  178. tableBody[0].appendChild(r[j]);
  179. }
  180. }
  181. fixPosition(table,tableBody);
  182. if (c.selectionMode == 'negative')
  183. {
  184. $(table).find(':checkbox[name^=selectObj]').attr('checked', true);
  185. }
  186. if (table.config.select_mode == 'multiple')
  187. {
  188. $(table).find(':checkbox[name^=selectObj]').each(function() {
  189. var id = parseInt(this.value, 10);
  190. if ($('#'+id, table.config.container).length > 0)
  191. {
  192. if (c.selectionMode == 'positive')
  193. {
  194. $(this).attr('checked', true);
  195. }
  196. else
  197. {
  198. $(this).attr('checked', false);
  199. }
  200. }
  201. });
  202. $(table).find(':checkbox[name^=selectObj]').change(function() {
  203. updateSelection(table, table.config.container, this.value, this.checked);
  204. });
  205. }
  206. else if (table.config.select_mode == 'single')
  207. {
  208. $(table).find('input[name^=selectObject]:radio').each(function() {
  209. var id = parseInt(this.value, 10);
  210. if ($('#'+id, table.config.container).length > 0)
  211. {
  212. if (c.selectionMode == 'positive')
  213. {
  214. $(this).attr('checked', true);
  215. }
  216. else
  217. {
  218. $(this).attr('checked', false);
  219. }
  220. }
  221. });
  222. $(table).find('input[name^=selectObject]:radio').change(function() {
  223. updateSelection(table, table.config.container, this.value, this.checked);
  224. });
  225. }
  226. $(table).trigger("applyWidgets");
  227. if( c.page >= c.totalPages ) {
  228. moveToLastPage(table);
  229. }
  230. updatePageDisplay(c);
  231. updateCounter(table, table.config.container);
  232. renderPager(table, table.config.container);
  233. $(table).tableHover();
  234. $('#loading', table.config.container).empty();
  235. });
  236. }
  237. function renderPager(table, pager)
  238. {
  239. var c = table.config;
  240. var s = c.page - 2;
  241. var nb = Math.ceil(c.totalRows / c.size);
  242. if (s < 0)
  243. {
  244. s = 0;
  245. }
  246. var e = s +5;
  247. if (e > nb)
  248. {
  249. e = nb;
  250. s = e - 5;
  251. if (s < 0) s = 0;
  252. }
  253. txt = '';
  254. for(var i=s; i<e; i++)
  255. {
  256. var page = 1+i;
  257. var link = ' '+page+' ';
  258. if (i != c.page)
  259. {
  260. link = ' <span page="'+i+'" id="gotopage_'+i+'">'+page+'</span> ';
  261. }
  262. else
  263. {
  264. link = ' <span class="curr_page" page="'+i+'">'+page+'</span> ';
  265. }
  266. txt += link;
  267. }
  268. txt += '';
  269. $('#total', pager).text(c.totalRows);
  270. $('#index', pager).html(txt);
  271. for(var j=s; j<e; j++)
  272. {
  273. $('#gotopage_'+j, pager).click(function(){
  274. var idx = $(this).attr('page');
  275. table.config.page = idx;
  276. moveToPage(table);
  277. });
  278. }
  279. }
  280. function renderTable(table) {
  281. var c = table.config;
  282. //var l = rows.length;
  283. var s = (c.page * c.size);
  284. var e = (s + c.size);
  285. if(e > c.totalRows ) {
  286. e = c.totalRows;
  287. }
  288. getData(table, s, e);
  289. }
  290. this.appender = function(table,rows) {
  291. var c = table.config;
  292. if (c.totalRows == 0)
  293. {
  294. c.totalRows = rows.length;
  295. }
  296. c.totalPages = Math.ceil(c.totalRows / c.size);
  297. renderTable(table,rows);
  298. };
  299. this.defaults = {
  300. size: 10,
  301. offset: 0,
  302. page: 0,
  303. totalRows: 0,
  304. totalPages: 0,
  305. container: null,
  306. cssNext: '.next',
  307. cssPrev: '.prev',
  308. cssFirst: '.first',
  309. cssLast: '.last',
  310. cssPageDisplay: '.pagedisplay',
  311. cssPageSize: '.pagesize',
  312. cssCount: '',
  313. seperator: "/",
  314. positionFixed: false,
  315. appender: this.appender,
  316. filter: '',
  317. extra_params: '',
  318. select_mode: '',
  319. totalSelected: 0,
  320. selectionMode: 'positive',
  321. displayKey: true,
  322. displayList: []
  323. };
  324. this.construct = function(settings) {
  325. return this.each(function() {
  326. config = $.extend(this.config, $.tablesorterPager.defaults, settings);
  327. var table = this, pager = config.container;
  328. this.ajax_request = null;
  329. $(this).trigger("appendCache");
  330. config.size = parseInt($(".pagesize",pager).val());
  331. $(config.cssFirst,pager).click(function() {
  332. moveToFirstPage(table);
  333. return false;
  334. });
  335. $(config.cssNext,pager).click(function() {
  336. moveToNextPage(table);
  337. return false;
  338. });
  339. $(config.cssPrev,pager).click(function() {
  340. moveToPrevPage(table);
  341. return false;
  342. });
  343. $(config.cssLast,pager).click(function() {
  344. moveToLastPage(table);
  345. return false;
  346. });
  347. $(config.cssPageSize,pager).change(function() {
  348. setPageSize(table,parseInt($(this).val()));
  349. return false;
  350. });
  351. $(table).find(':checkbox.checkAll').removeAttr('onclick').click(function() {
  352. return checkAll(table, pager, this.checked);
  353. });
  354. });
  355. };
  356. }
  357. });
  358. // extend plugin scope
  359. $.fn.extend({
  360. tablesorterPager: $.tablesorterPager.construct
  361. });
  362. })(jQuery);