jquery.tablesorter.pager.js 12 KB

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