PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/mt-static/js/screens/list_common.js

http://github.com/openmelody/melody
JavaScript | 1470 lines | 1359 code | 100 blank | 11 comment | 246 complexity | c46a08aff73144febf245a96651d983e MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, LGPL-2.1
  1. var cols = [];
  2. var vals = [];
  3. var checked = [];
  4. var total = 0;
  5. var editable_total = 0;
  6. var editable_count_in_page;
  7. var current_id = mt.screen.initial_filter.id;
  8. var currentPage = 1;
  9. var inputCount = 0;
  10. var initial_load = true;
  11. var editSysFilter = 0;
  12. var editNewFilter = 0;
  13. var allPass = 0;
  14. var request_id = 0;
  15. var this_request;
  16. function handleMessages( data, additional_class ) {
  17. if ( initial_load ) {
  18. initial_load = false;
  19. }
  20. else {
  21. jQuery('#msg-block .msg-success').remove();
  22. jQuery('#msg-container .msg-success').remove();
  23. }
  24. if ( data.error ) {
  25. var error_cls = 'error';
  26. if ( additional_class ) error_cls += ' ' + additional_class;
  27. showMessage( data.error, error_cls);
  28. return false;
  29. }
  30. if ( !data.result ) return false;
  31. var messages = data.result.messages;
  32. if ( !data.result.messages ) return true;
  33. for ( var i=0; i < messages.length; i++ ) {
  34. var msg = messages[i];
  35. var cls = msg.cls;
  36. if ( additional_class ) cls += ' ' + additional_class;
  37. showMessage(msg.msg, cls);
  38. }
  39. return true;
  40. }
  41. function showMessage( content, cls ){
  42. var error_block;
  43. if ( typeof content == 'object' ) {
  44. jQuery('#msg-block').append(
  45. error_block = jQuery('<div>')
  46. .attr('class', 'msg msg-' + cls )
  47. .append(
  48. jQuery('<p />')
  49. .attr('class', 'msg-text')
  50. .append(content)
  51. .append('<span class="mt-close-msg close-link clickable icon-remove icon16 action-icon">'+mt.screen.trans.CLOSE+'</span>')
  52. )
  53. );
  54. }
  55. else {
  56. jQuery('#msg-block').append(
  57. error_block = jQuery('<div />')
  58. .attr('class', 'msg msg-' + cls )
  59. .append(
  60. jQuery('<p />')
  61. .attr('class', 'msg-text')
  62. .append(content)
  63. .append('<span class="mt-close-msg close-link clickable icon-remove icon16 action-icon">'+mt.screen.trans.CLOSE+'</span>')
  64. )
  65. );
  66. }
  67. return error_block;
  68. }
  69. function loginAgain(fn) {
  70. jQuery(window)
  71. .unbind('dialogReady.loginAgain')
  72. .bind('dialogReady.loginAgain', function(){
  73. var dialog = jQuery('#mt-dialog-iframe').contents();
  74. dialog
  75. .find('#sign-in-button')
  76. .text(mt.screen.trans.CONTINUE)
  77. .unbind()
  78. .click(function(){
  79. dialog.find('#msg-block').empty();
  80. jQuery.ajax({
  81. type: 'POST',
  82. async: false,
  83. url: ScriptURI,
  84. dataType: 'json',
  85. data: {
  86. __mode: 'login_json',
  87. username: dialog.find('#username').val(),
  88. password: dialog.find('#password').val()
  89. },
  90. success: function(data) {
  91. jQuery.fn.mtDialog.close();
  92. fn();
  93. return false;
  94. },
  95. error: function(data) {
  96. dialog.find('#password').val('');
  97. dialog
  98. .find('#msg-block')
  99. .append('<div class="msg msg-error">'+mt.screen.trans.INVALID_LOGIN+'</div>');
  100. }
  101. });
  102. return false;
  103. });
  104. });
  105. jQuery.fn.mtDialog.open(ScriptURI + '?__mode=dashboard');
  106. }
  107. function renderFilterList() {
  108. jQuery('#dialog_filter_content').empty();
  109. var has_user_filter = 0;
  110. var has_sys_filter = 0;
  111. for (var i = 0, length = mt.screen.filters.length; i < length; i++) {
  112. if ( parseInt(mt.screen.filters[i].can_save) )
  113. has_user_filter++;
  114. else
  115. has_sys_filter++;
  116. }
  117. jQuery('<div class="filter-list-block">')
  118. .append(
  119. jQuery('<h3 class="filter-list-label" />').text(mt.screen.trans.MY_FILTERS))
  120. .append(
  121. jQuery('<ul id="user-filters" class="editable"><li class="filter line"><a href="#" id="new_filter" class="icon-mini-left addnew create-new apply-link">'+mt.screen.trans.CREATE_NEW+'</a></li></ul>'))
  122. .appendTo('#dialog_filter_content');
  123. if ( has_sys_filter ) {
  124. jQuery('<div class="filter-list-block">')
  125. .append(
  126. jQuery('<h3 class="filter-list-label" />').text(mt.screen.trans.BUILT_IN))
  127. .append(
  128. jQuery('<ul id="built-in-filters" />'))
  129. .appendTo('#dialog_filter_content');
  130. }
  131. for (var i = 0, length = mt.screen.filters.length; i < length; i++) {
  132. var filter = mt.screen.filters[i];
  133. if ( parseInt(filter.can_save) ) {
  134. var line = '<span class="filter-label unit size2of3"><a href="#'+i+'" class="apply-link '
  135. + ( filter.can_save ? 'user-filter' : 'system-filter' )
  136. + '">'+filter.label+'</a></span>'
  137. + '<span class="item-ctrl unit size1of3"><a href="#'+i+'" class="rename-link tool-link">'+mt.screen.trans.RENAME+'</a><a href="#'+i+'" class="delete-link action-icon icon16 icon-delete">'+mt.screen.trans.DELETE+'</a></span>';
  138. jQuery('<li class="filter line" />').append(line).prependTo('#user-filters');
  139. }
  140. else {
  141. var line = '<span class="filter-label"><a href="#'+i+'" class="apply-link '
  142. + ( filter.can_save ? 'user-filter' : 'system-filter' )
  143. + '">'+filter.label+'</a></span>';
  144. jQuery('<li class="filter line" />').append(line).appendTo('#built-in-filters');
  145. }
  146. }
  147. jQuery('#new_filter').click(function() {
  148. jQuery('#filter-detail').show().parent('#filter').addClass('active');
  149. jQuery('#item_list').attr('selectedIndex', 0);
  150. resetFilterDetails();
  151. jQuery('input[name=filter_name]').mtUnvalidate().val(mt.screen.trans.NEW_FILTER);
  152. jQuery('#opener').html(mt.screen.trans.NEW_FILTER);
  153. jQuery('#filter_id').val('');
  154. jQuery('input[name=filter_id]').val('');
  155. updateItemList();
  156. jQuery('#dialog_filter').dialog('close');
  157. updateFilterSaveButtons({
  158. system: 0,
  159. new_filter: 1,
  160. allpass: 0
  161. });
  162. });
  163. jQuery('#dialog_filter .filter-label a:not(#new_filter)').click(function() {
  164. jQuery('#dialog_filter').dialog('close');
  165. jQuery(this).attr('href').match(/#(.*)/);
  166. var index = RegExp.$1;
  167. applyFilter(index);
  168. updateFilterSaveButtons();
  169. return false;
  170. });
  171. jQuery('#dialog_filter .delete-link').click(function() {
  172. var label = $(this).parents('.filter').find('.apply-link').text();
  173. var message = trans("Are you sure you want to remove the filter '[_1]'?", label);
  174. if (confirm(message)) {
  175. $(this).parents('.filter').addClass('edit-mode').find('.item-ctrl').hide();
  176. $(this).parents('.filter').find('.filter-label').hide().after( jQuery('<span class="indicator"><img alt="'+mt.screen.trans.LOADING+'" src="<mt:var name="static_uri">images/indicator.white.gif" /></span>') );
  177. removeFilter(this);
  178. }
  179. return false;
  180. });
  181. jQuery('#dialog_filter .rename-link').click(openFilterRenameField);
  182. }
  183. function updateFilterSaveButtons ( opts ){
  184. if ( opts ) {
  185. if ( opts.allpass != undefined ) allPass = opts.allpass;
  186. if ( opts.new_filter != undefined ) editNewFilter = opts.new_filter;
  187. if ( opts.system != undefined ) editSysFilter = opts.system;
  188. }
  189. if ( jQuery('#filter-detail div.filteritem').length > 0 ) {
  190. jQuery('#apply').removeClass('disabled').removeAttr('disabled');
  191. if ( editSysFilter )
  192. jQuery('#save').addClass('disabled').attr('disabled', 'disabled');
  193. else
  194. jQuery('#save').removeClass('disabled').removeAttr('disabled');
  195. if ( editNewFilter )
  196. jQuery('#saveas').hide();
  197. else
  198. jQuery('#saveas').show();
  199. }
  200. else {
  201. jQuery('#apply').addClass('disabled').attr('disabled','disabled');
  202. jQuery('#save').addClass('disabled').attr('disabled', 'disabled');
  203. jQuery('#saveas').hide();
  204. }
  205. if ( allPass ) {
  206. jQuery('#allpass-filter').hide();
  207. }
  208. else {
  209. jQuery('#allpass-filter').show();
  210. }
  211. }
  212. function openFilterRenameField() {
  213. cancelFilterRenameField();
  214. var $this = jQuery(this);
  215. $this.parents('.filter').addClass('edit-mode');
  216. $this.attr('href').match(/#(.*)/);
  217. var index = RegExp.$1;
  218. var fid = mt.screen.filters[index].id;
  219. var $label = $this.parents('.filter').children('.filter-label');
  220. var $handle = $this.parents('.filter').children('.item-ctrl');
  221. var text = $label.find('.apply-link').hide().text();
  222. jQuery('<input type="text" id="filter_'+fid+'" class="text full rename-filter-input" />')
  223. .val(text)
  224. .appendTo($label);
  225. $this.hide().next('.delete-link').hide();
  226. jQuery('<a href="#'+fid+'" class="tool-link save button">'+mt.screen.trans.SAVE+'</a>').bind('click', function() {
  227. var name = jQuery('#filter_'+fid).val();
  228. if (name == text) {
  229. // Not modified.
  230. $handle.find('.cancel').click();
  231. return false;
  232. }
  233. if ( !jQuery('#filter_' + fid).mtValidate('dialog') )
  234. return false;
  235. $this.parents('.filter').find('.item-ctrl').hide();
  236. $this.parents('.filter').find('input').hide().after( jQuery('<span class="indicator"><img alt="'+mt.screen.trans.LOADING+'" src="<mt:var name="static_uri">images/indicator.white.gif" /></span>') );
  237. renameFilter(index, fid, name);
  238. return false;
  239. }).appendTo($handle);
  240. jQuery('<a href="#'+fid+'" class="tool-link cancel button">'+mt.screen.trans.CANCEL+'</a>')
  241. .bind('click', cancelFilterRenameField )
  242. .appendTo($handle);
  243. return false;
  244. }
  245. function cancelFilterRenameField() {
  246. jQuery('.rename-filter-input').mtUnvalidate();
  247. jQuery('.filter').removeClass('edit-mode');
  248. jQuery('.filter-label')
  249. .find('.apply-link:hidden').show().end()
  250. .find('input').remove();
  251. jQuery('.item-ctrl')
  252. .find('a.save, a.cancel').remove().end()
  253. .find('a:hidden').css('display','inline-block')
  254. return false;
  255. }
  256. function renameFilter(index, fid, name) {
  257. jQuery.ajax({
  258. type: 'POST',
  259. url: ScriptURI,
  260. dataType: 'json',
  261. data: {
  262. __mode: 'save_filter',
  263. datasource: mt.screen.list_type,
  264. blog_id: BlogID,
  265. fid: fid,
  266. label: name,
  267. items: jQuery.toJSON(mt.filters.filters[index].items),
  268. list: 0
  269. },
  270. success: function(data) {
  271. if ( !handleMessages(data) ) return;
  272. filters = data.result.filters;
  273. },
  274. complete: function() {
  275. if ( fid == current_id ) {
  276. jQuery('#opener').text(name);
  277. }
  278. renderFilterList();
  279. },
  280. error: function(xhr, status) {
  281. if ( xhr.status == 401 ) {
  282. loginAgain(function(){
  283. renameFilter(index, fid, name);
  284. });
  285. }
  286. else {
  287. alert( trans('Communication Error ([_1])', xhr.status) );
  288. }
  289. }
  290. });
  291. }
  292. function removeFilter(element) {
  293. var $node = jQuery(element).parents('li');
  294. jQuery(element).attr('href').match(/#(.*)/);
  295. var index = RegExp.$1;
  296. var remove_current = mt.screen.filters[index].id == current_id;
  297. if ( remove_current ) {
  298. updateFilterSaveButtons({ allpass: 1 });
  299. doApplyFilter(mt.screen.allpass_filter, 1);
  300. renderList({
  301. mode: 'delete_filter',
  302. id: mt.screen.filters[index].id
  303. });
  304. }
  305. else {
  306. jQuery.ajax({
  307. type: 'POST',
  308. url: ScriptURI,
  309. dataType: 'json',
  310. data: {
  311. __mode: 'delete_filter',
  312. id: mt.screen.filters[index].id,
  313. datasource: mt.screen.list_type,
  314. blog_id: BlogID,
  315. list: 0
  316. },
  317. success: function(data) {
  318. if ( !handleMessages(data) ) return;
  319. filters = data.result.filters;
  320. },
  321. complete: function() {
  322. renderFilterList();
  323. },
  324. error: function(xhr, status) {
  325. if ( xhr.status == 401 ) {
  326. loginAgain(function(){
  327. removeFilter(element);
  328. });
  329. }
  330. else {
  331. alert( trans('Communication Error ([_1])', xhr.status) );
  332. }
  333. }
  334. });
  335. }
  336. }
  337. function renderColumns( col, chk ) {
  338. cols = [];
  339. var e = jQuery('table.listing-table thead th, table.listing-table tfoot th').hide();
  340. if (mt.screen.has_list_actions) e.filter('.cb').show();
  341. jQuery('ul#disp_cols input:checked').each(function() {
  342. jQuery(this).attr('id').match(/custom-prefs-(.*)/);
  343. var id = RegExp.$1;
  344. cols.push(id);
  345. });
  346. jQuery('ul#disp_cols input.main:checked').each(function() {
  347. var id = jQuery(this).val();
  348. jQuery('table.listing-table th.'+id).show();
  349. });
  350. if ( col && chk ) {
  351. var header = jQuery('table.listing-table thead th.' + col);
  352. var idx = jQuery('table.listing-table thead th:visible').index(header) - 1;
  353. jQuery('table.listing-table tr').each( function() {
  354. jQuery(this).find('td:eq(' + idx + ')').after( '<td class="col"> </td>' );
  355. });
  356. }
  357. else if ( col && !chk ) {
  358. jQuery('table.listing-table td.' + col).remove();
  359. }
  360. jQuery('table.listing-table thead, table.listing-table tfoot').each(function() {
  361. jQuery(this)
  362. .find('th')
  363. .removeClass('first-visible-child')
  364. .filter(':visible:first')
  365. .addClass('first-visible-child');
  366. });
  367. // Re-render the table for IE.
  368. if ( window.navigator.userAgent.match(/MSIE/) )
  369. jQuery('table.listing-table').insertAfter('#listing-table-overlay');
  370. }
  371. function saveChecked(page) {
  372. checked[page] = [];
  373. jQuery('table.listing-table tbody tr input:checked').each(function() {
  374. var id = jQuery(this).parents('tr').attr('id');
  375. checked[page][id] = 1;
  376. });
  377. }
  378. function renderPagination(count, limit, page, last, total) {
  379. var $e = jQuery('.pagination').empty();
  380. if (count == 0) {
  381. return;
  382. }
  383. var usefirst = false;
  384. var uselast = false;
  385. var start;
  386. if (page > 1) {
  387. usefirst = true;
  388. start = (page-1)*limit+1;
  389. } else {
  390. start = 1;
  391. }
  392. if (total / limit > 1) {
  393. if (page + 1 <= last) {
  394. uselast = true;
  395. }
  396. }
  397. currentPage = page;
  398. if (usefirst) {
  399. $e.append('<a href="#" class="pagenav start">&laquo; '+mt.screen.trans.FIRST+'</a>')
  400. .append('<a href="#" class="pagenav to-start">&lsaquo; '+mt.screen.trans.PREV+'</a>');
  401. } else {
  402. $e.append('<span class="pagenav start disabled">&laquo; '+mt.screen.trans.FIRST+'</span>')
  403. .append('<span class="pagenav to-start disabled">&lsaquo; '+mt.screen.trans.PREV+'</span>');
  404. }
  405. var end = (page == last) ? total : start+limit-1;
  406. var page_status = trans('[_1] - [_2] of [_3]', start, end, total);
  407. $e.append('<span class="current-rows">'+page_status+'</span>')
  408. if (uselast) {
  409. $e.append('<a href="#" class="pagenav to-end">'+mt.screen.trans.NEXT+' &rsaquo;</a>')
  410. .append('<a href="#" class="pagenav end">'+mt.screen.trans.LAST+' &raquo;</a>');
  411. } else {
  412. $e.append('<span class="pagenav to-end disabled">'+mt.screen.trans.NEXT+' &rsaquo;</span>')
  413. .append('<span class="pagenav end disabled">'+mt.screen.trans.LAST+' &raquo;</span>');
  414. }
  415. jQuery('a.start').click(function() {
  416. saveChecked(page);
  417. renderList('filtered_list', cols, vals, jQuery('#row').val(), 1);
  418. return false;
  419. });
  420. jQuery('a.to-start').click(function() {
  421. saveChecked(page);
  422. renderList('filtered_list', cols, vals, jQuery('#row').val(), page-1);
  423. return false;
  424. });
  425. jQuery('a.to-end').click(function() {
  426. saveChecked(page);
  427. renderList('filtered_list', cols, vals, jQuery('#row').val(), page+1);
  428. return false;
  429. });
  430. jQuery('a.end').click(function() {
  431. saveChecked(page);
  432. renderList('filtered_list', cols, vals, jQuery('#row').val(), last);
  433. return false;
  434. });
  435. }
  436. function saveListPrefs() {
  437. cols = [];
  438. jQuery('ul#disp_cols input:checked').each(function() {
  439. jQuery(this).attr('id').match(/custom-prefs-(.*)/);
  440. var id = RegExp.$1;
  441. cols.push(id);
  442. });
  443. jQuery.ajax({
  444. type: 'POST',
  445. url: ScriptURI,
  446. dataType: 'json',
  447. data: {
  448. __mode: 'save_list_prefs',
  449. datasource: mt.screen.list_type,
  450. blog_id: BlogID,
  451. columns: cols.join(','),
  452. limit: jQuery('#row').val()
  453. },
  454. success: function(data) {
  455. handleMessages(data);
  456. return false;
  457. },
  458. error: function(xhr, status) {
  459. if ( typeof this_request == 'undefined' || this_request != request_id ) {
  460. return false;
  461. }
  462. if ( xhr.status == 401 ) {
  463. loginAgain(function(){
  464. renderList(mode, columns, values, limit, page);
  465. });
  466. }
  467. else {
  468. alert( trans('Communication Error ([_1])', xhr.status) );
  469. }
  470. }
  471. });
  472. }
  473. function renderList(mode, columns, values, limit, page ) {
  474. this_request = ++request_id;
  475. // If the first arg is Object, it's Hash style call
  476. var args = {};
  477. if ( typeof mode == 'object' ) {
  478. args = mode;
  479. var defaults = {
  480. mode: 'filtered_list',
  481. columns: cols,
  482. values: vals,
  483. limit: jQuery('#row').val(),
  484. page: currentPage
  485. };
  486. mode = ( 'mode' in args ) ? args['mode'] : defaults['mode'];
  487. columns = ( 'columns' in args ) ? args['columns'] : defaults['columns'];
  488. values = ( 'values' in args ) ? args['values'] : defaults['values'];
  489. limit = ( 'limit' in args ) ? args['limit'] : defaults['limit'];
  490. page = ( 'page' in args ) ? args['page'] : defaults['page'];
  491. delete args['mode'];
  492. delete args['columns'];
  493. delete args['values'];
  494. delete args['limit'];
  495. delete args['page'];
  496. }
  497. limit = parseInt(limit);
  498. if ( args['magic_token'] ) {
  499. args['magic_token'] = MagicToken;
  500. }
  501. var params = {
  502. __mode: mode,
  503. datasource: mt.screen.list_type,
  504. blog_id: BlogID,
  505. columns: columns.join(','),
  506. limit: limit,
  507. page: page
  508. };
  509. params = jQuery.extend( params, args );
  510. if (values.length) {
  511. params['items'] = jQuery.toJSON(values);
  512. }
  513. if (jQuery('table.listing-table th.sorted').length) {
  514. jQuery('table.listing-table th.sorted').find('a').attr('href').match(/#(.*)/);
  515. params['sort_by'] = RegExp.$1;
  516. params['sort_order'] = jQuery('table.listing-table th.sorted').find('span').hasClass('desc') ? 'descend' : 'ascend';
  517. }
  518. if (jQuery('input[name=filter_id]').val()) {
  519. params['fid'] = jQuery('input[name=filter_id]').val();
  520. }
  521. if (jQuery('input[name=filter_name]').val()) {
  522. params['label'] = jQuery('input[name=filter_name]').val();
  523. }
  524. jQuery('.indicator, #listing-table-overlay').show();
  525. jQuery('div.pagination').hide();
  526. jQuery('#msg-block div.msg-error.filtered-list-msg').remove()
  527. jQuery.ajax({
  528. type: 'POST',
  529. url: ScriptURI,
  530. dataType: 'json',
  531. data: params,
  532. success: function(data) {
  533. if ( this_request != request_id ) {
  534. return false;
  535. }
  536. if ( !handleMessages(data, 'filtered-list-msg' ) ) return;
  537. if (mt.config.debug_mode && data.result.debug) {
  538. jQuery('#listing-debug-block').text(data.result.debug);
  539. }
  540. jQuery('table.listing-table tbody').empty();
  541. jQuery('table.listing-table th :checkbox').removeAttr('checked');
  542. var objs = data.result.objects;
  543. var count = objs.length;
  544. var last = data.result.page_max;
  545. total = parseInt(data.result.count);
  546. editable_total = parseInt(data.result.editable_count);
  547. var return_columns = data.result.columns.split(',');
  548. var return_cols = jQuery.grep( return_columns, function( val, idx ){
  549. return val.match(/\./);
  550. }, true );
  551. var main_cols = {};
  552. jQuery('ul#disp_cols input:checked').each(function() {
  553. // jQuery('#disp_cols input.main.checkbox:checked').each(function() {
  554. main_cols[ jQuery(this).val() ] = 1;
  555. });
  556. editable_count_in_page = 0;
  557. for (var row = 0; row < count; row++) {
  558. var id = objs[row][0];
  559. var line = '';
  560. if ( id ) {
  561. editable_count_in_page++;
  562. if (checked[page] && checked[page][id]) {
  563. line = '<td class="cb col"'+(mt.screen.has_list_actions ? '' : ' style="display: none;"')+'><input type="checkbox" checked="checked" name="id" value="'+id+'" /></td>';
  564. } else {
  565. line = '<td class="cb col"'+(mt.screen.has_list_actions ? '' : ' style="display: none;"')+'><input type="checkbox" name="id" value="'+id+'" /></td>';
  566. }
  567. }
  568. else {
  569. line = '<td class="cb col"'+(mt.screen.has_list_actions ? '' : ' style="display: none;"')+'></td>';
  570. }
  571. for (var col = 1, col_length = objs[row].length; col < col_length; col++) {
  572. var col_id = return_cols[ col - 1 ];
  573. if ( main_cols[col_id] ) {
  574. line += '<td class="col '+col_id+' '+mt.screen.col_classes[col_id]+'">' + objs[row][col] + '</td>';
  575. }
  576. }
  577. jQuery('<tr id="'+id+'"' + ( id ? '' : ' class="no-action"' ) + '>'+line+'</tr>').appendTo('table.listing-table tbody');
  578. }
  579. jQuery('#resultstats').remove();
  580. var n = columnLength();
  581. if (count == 0) {
  582. var message = trans('No [_1] could be found.', (mt.screen.zero_state ? mt.screen.zero_state : mt.screen.object_label_lc));
  583. jQuery('<td class="col fullwidth-row" colspan="'+n+'">'+message+'</tr>').appendTo('table.listing-table tbody');
  584. }
  585. renderPagination(count, limit, page, last, total);
  586. filters = data.result.filters;
  587. if ( data.result.label ) {
  588. jQuery('#opener').html(data.result.label);
  589. jQuery('#filter_name').val(data.result.label);
  590. }
  591. if ( data.result.id ) {
  592. jQuery('#filter_id').val(data.result.id);
  593. current_id = data.result.id;
  594. }
  595. },
  596. complete: function() {
  597. if ( this_request != request_id ) {
  598. return false;
  599. }
  600. jQuery('.indicator, #listing-table-overlay').hide();
  601. jQuery('div.pagination').show();
  602. jQuery('table.listing-table tbody tr:even').addClass('even');
  603. jQuery('table.listing-table tbody tr:odd').addClass('odd');
  604. var $checkboxes = jQuery('td :checkbox');
  605. var $checked = jQuery('td :checked');
  606. $checked.parents('tr').addClass('selected');
  607. if ($checkboxes.length && $checkboxes.length == $checked.length) {
  608. jQuery('table.listing-table th :checkbox').attr('checked', 'checked');
  609. addSelectAll($checkboxes);
  610. }
  611. if (mode == 'save_filter' || mode == 'delete_filter') {
  612. renderFilterList();
  613. updateFilterSaveButtons({
  614. system: 0,
  615. new_filter: 0
  616. });
  617. }
  618. if (!jQuery('#msg-block .msg-error').length) {
  619. jQuery('#dialog_save_filter').dialog('close');
  620. } else {
  621. if (jQuery('#dialog_save_filter:visible').length) {
  622. jQuery('.msg-error').clone().appendTo('#dialog-msg-block');
  623. jQuery('#msg-block').hide();
  624. }
  625. }
  626. jQuery(window).trigger('listReady');
  627. },
  628. error: function(xhr, status, error) {
  629. if ( this_request != request_id ) {
  630. return false;
  631. }
  632. if ( xhr.status == 401 ) {
  633. loginAgain(function(){
  634. renderList(mode, columns, values, limit, page);
  635. });
  636. }
  637. else if ( xhr.status == 0 ) {
  638. // Maybe this is user abort. do nothing.
  639. }
  640. else {
  641. alert( trans('Communication Error ([_1])', xhr.status) );
  642. }
  643. }
  644. });
  645. }
  646. jQuery.fn.mtRenderList = renderList;
  647. function itemValues() {
  648. var $items = jQuery('#filter-detail .filteritem:not(.error)');
  649. vals = [];
  650. $items.each(function() {
  651. var data = {};
  652. var fields = [];
  653. var $types = jQuery(this).find('.filtertype');
  654. $types.each(function() {
  655. jQuery(this).attr('class').match(/type-(\w+)/);
  656. var type = RegExp.$1;
  657. jQuery(this).find('.item-content').each(function() {
  658. var args = {};
  659. jQuery(this).find(':input').each(function() {
  660. var re = new RegExp(type+'-(\\w+)');
  661. jQuery(this).attr('class').match(re);
  662. var key = RegExp.$1;
  663. args[key] = jQuery(this).val();
  664. });
  665. fields.push({'type': type, 'args': args});
  666. });
  667. });
  668. if (fields.length > 1 ) {
  669. data['type'] = 'pack';
  670. data['args'] = {
  671. "op":"and",
  672. "items":fields
  673. };
  674. } else {
  675. data = fields.pop();
  676. }
  677. vals.push(data);
  678. });
  679. }
  680. function toggleSubField (obj) {
  681. if ( jQuery(obj).is(':checked') ) {
  682. jQuery( '#listing-table .' + jQuery(obj).val() ).show();
  683. } else {
  684. jQuery( '#listing-table .' + jQuery(obj).val() ).hide();
  685. }
  686. }
  687. function addSelectAll($node) {
  688. if (editable_count_in_page >= editable_total) {
  689. return false;
  690. }
  691. var n = columnLength();
  692. $node
  693. .parents('tbody')
  694. .append('<tr class="select-all"><td class="col fullwidth-row" colspan="'+n+'"></td></tr>')
  695. .prepend('<tr class="select-all"><td class="col fullwidth-row" colspan="'+n+'"><input type="hidden" name="all_selected" /></td></tr>');
  696. var select_text = trans('Select all [_1] items', editable_total);
  697. var cancel_text = trans('All [_1] items are selected', editable_total);
  698. jQuery('<a href="#"></a>')
  699. .appendTo('.select-all td')
  700. .text(select_text)
  701. .bind('click', function() {
  702. var $input = jQuery('input[name=all_selected]');
  703. if ($input.val()) {
  704. $input.val('');
  705. jQuery('.select-all td').find('a').text(select_text);
  706. } else {
  707. $input.val('1');
  708. jQuery('.select-all td').append(cancel_text).addClass('highlight').find('a').remove();
  709. }
  710. return false;
  711. });
  712. }
  713. function removeSelectAll($node) {
  714. $node
  715. .parents('tbody')
  716. .find('.select-all')
  717. .remove();
  718. jQuery('input[name=all_selected]').val('');
  719. }
  720. function columnLength () {
  721. return jQuery('#disp_cols').find('input.main:checked').length + (mt.screen.has_list_actions ? 1 : 0);
  722. }
  723. function dateOption($node) {
  724. var val = $node.val();
  725. var type;
  726. switch (val) {
  727. case 'days':
  728. type = 'days';
  729. break;
  730. case 'before':
  731. case 'after':
  732. type = 'date';
  733. break;
  734. case 'future':
  735. case 'past':
  736. type = 'none';
  737. break;
  738. default:
  739. type = 'range';
  740. }
  741. $node.parent('.item-content').find('input').mtUnvalidate();
  742. $node.parent('.item-content').find('.date-options span.date-option').hide();
  743. $node.parent('.item-content').find('.date-option.'+type).show();
  744. }
  745. function filterItem(type, datepicker_off) {
  746. var $item = jQuery(mt.screen.filter_types[type]);
  747. if ( $item && $item.attr('class') && $item.attr('class').match(/no-edit/) ) {
  748. $item.find('input').attr('disabled', 1);
  749. $item.find('select').attr('disabled', 1);
  750. }
  751. if ( !datepicker_off ) {
  752. $item
  753. .find('.filter-date').each(function() {
  754. dateOption(jQuery(this));
  755. }).bind('change', function() {
  756. dateOption(jQuery(this));
  757. }).end()
  758. .find('.date').datepicker({
  759. dateFormat: 'yy-mm-dd',
  760. dayNamesMin: mt.screen.trans_DAY_NAMES,
  761. monthNames: ['- 01','- 02','- 03','- 04','- 05','- 06','- 07','- 08','- 09','- 10','- 11','- 12'],
  762. showMonthAfterYear: true,
  763. prevText: '&lt;',
  764. nextText: '&gt;',
  765. onSelect: function( dateText, inst ) {
  766. inst.input.mtValid();
  767. }
  768. });
  769. }
  770. return $item;
  771. }
  772. var validateErrorMessage;
  773. function validateFilterDetails () {
  774. if ( validateErrorMessage ) {
  775. validateErrorMessage.remove();
  776. }
  777. var errors = 0;
  778. jQuery('div#filter-detail div.filteritem').each( function () {
  779. if ( !jQuery(this).find('input:visible').mtValidate() ) {
  780. errors++;
  781. jQuery(this).addClass('highlight error');
  782. }
  783. else {
  784. jQuery(this).removeClass('highlight error');
  785. }
  786. })
  787. if ( errors ) {
  788. validateErrorMessage = showMessage( trans('[_1] Filter Items have errors', errors ), 'error' );
  789. }
  790. return errors ? false : true;
  791. }
  792. function resetFilterDetails() {
  793. if ( validateErrorMessage ) {
  794. validateErrorMessage.remove();
  795. }
  796. validateErrorMessage = false;
  797. jQuery('div#filter-detail div.filteritem')
  798. .find('input, select')
  799. .mtUnvalidate()
  800. .end()
  801. .remove();
  802. }
  803. function validateFilterName (name) {
  804. var res = true;
  805. jQuery('a.apply-link').each( function() {
  806. if ( jQuery(this).text() == name )
  807. res = false;
  808. });
  809. return res;
  810. }
  811. function addItems(items, op) {
  812. var type;
  813. var args;
  814. if ( !items )
  815. items = [];
  816. for (var i = 0, length = items.length; i < length; i++) {
  817. type = items[i].type;
  818. if (type == 'pack') {
  819. addItems(items[i].args.items, items[i].args.op);
  820. }
  821. var $filteritem = jQuery('.filteritem:first');
  822. var $filtertype;
  823. var prev_type;
  824. if ($filteritem.length) {
  825. $filtertype = $filteritem.children('.filtertype:last');
  826. $filtertype.attr('class').match(/type-(\w+)/);
  827. prev_type = RegExp.$1;
  828. }
  829. var $item = filterItem(type);
  830. $item.find('input').each( function() {
  831. var id = jQuery(this).attr('id') || jQuery(this).attr('name') || 'input-' + inputCount++;
  832. jQuery(this)
  833. .attr('id', id)
  834. .attr('name', id);
  835. });
  836. if (op && type == prev_type) {
  837. $item
  838. .insertAfter($filtertype)
  839. .find('.item-label').addClass('invisible');
  840. } else {
  841. var $div = jQuery('<div class="filteritem" />').addClass('itemtype-' . type);
  842. $item
  843. .insertAfter('.selectfilter')
  844. .wrap($div)
  845. .find('.minus').hide().end();
  846. jQuery('<span class="close-link clickable remove icon-remove icon16 action-icon">'+mt.screen.REMOVE_ITEM+'</span>')
  847. .insertAfter($item)
  848. .bind('click', function() {
  849. jQuery(this).parent('.filteritem').find('input').mtUnvalidate().end().remove();
  850. updateItemList();
  851. updateFilterSaveButtons();
  852. });
  853. }
  854. args = items[i].args;
  855. for (var key in args) {
  856. if ( typeof args[key] != 'string' && typeof args[key] != 'number' ) continue;
  857. // A sort of hack to decode HTML entities using jQuery.
  858. var decoded = jQuery('<div>').html( args[key] ).text();
  859. $item.find('.'+type+'-'+key).each( function(){
  860. if ( jQuery(this).is('input, select') )
  861. jQuery(this).val( decoded );
  862. else
  863. jQuery(this).text( decoded );
  864. });
  865. }
  866. var $node = $item.find('.filter-date');
  867. if ($node) {
  868. dateOption($node);
  869. }
  870. }
  871. updateItemList();
  872. updateFilterSaveButtons();
  873. }
  874. function applyFilter(index, no_render) {
  875. if (index >= 0 && mt.screen.filters[index].items) {
  876. var filter = mt.screen.filters[index];
  877. doApplyFilter(filter, no_render);
  878. allPass = 0;
  879. }
  880. }
  881. function doApplyFilter(filter, no_render) {
  882. jQuery('#filter_name').val('');
  883. jQuery('#filter_id').val('');
  884. resetFilterDetails();
  885. var name = filter.label;
  886. addItems(filter.items);
  887. jQuery('#opener').html(name);
  888. jQuery('#filter_name').val(name);
  889. jQuery('#filter_id').val(filter.id);
  890. current_id = filter.id;
  891. if ( parseInt(filter.can_save) )
  892. editSysFilter = 0;
  893. else
  894. editSysFilter = 1;
  895. if ( filter.id == '_allpass' )
  896. allPass = 1;
  897. jQuery('input[name=filter_id]').val(filter.id);
  898. itemValues();
  899. if ( !no_render )
  900. renderList('filtered_list', cols, vals, jQuery('#row').val(), 1);
  901. }
  902. function doForMarked(formid, action, singlar, plural, phrase, xhr) {
  903. var $form = jQuery('#'+formid);
  904. if (!$form.length) {
  905. return;
  906. }
  907. var mode;
  908. var params = {};
  909. if ( action == 'itemset_action' ) {
  910. var $selected = $form.find('option:selected');
  911. action = $selected.val();
  912. }
  913. if (action == '' || action == '0') {
  914. alert(trans('You must select an action.'));
  915. return;
  916. }
  917. var opt = itemset_options[action];
  918. if ( !opt )
  919. return false;
  920. var xhr = opt['xhr'];
  921. var mode = opt['mode'] || 'itemset_action';
  922. if ($form.find('input[name=itemset_action_input]').val()) {
  923. $form.find('input[name=itemset_action_input]').val('');
  924. }
  925. var count = $form.find('input[name=id]').filter(':checked').length;
  926. if ( jQuery('input[name=all_selected]').val() == 1 ) {
  927. count = total;
  928. }
  929. if (!count) {
  930. alert(trans('You did not select any [_1] to [_2].', plural, phrase));
  931. return;
  932. }
  933. if (opt['min'] && (count < opt['min'])) {
  934. alert(trans('You can only act upon a minimum of [_1] [_2].', opt['min'], plural));
  935. return false;
  936. } else if (opt['max'] && (count > opt['max'])) {
  937. alert(trans('You can only act upon a maximum of [_1] [_2].', opt['max'], plural));
  938. return false;
  939. } else if (opt['input']) {
  940. if (input = prompt(opt['input'])) {
  941. $form.find('[name=itemset_action_input]').val(input);
  942. params['itemset_action_input'] = input;
  943. } else {
  944. return false;
  945. }
  946. }
  947. if (xhr) {
  948. params['mode'] = mode;
  949. params['xhr'] = 1;
  950. params['all_selected'] = jQuery('input[name=all_selected]').val();
  951. params['magic_token'] = 1;
  952. params['id'] = $form
  953. .find('input[name=id]:checked')
  954. .map(function(){
  955. return jQuery(this).val();
  956. })
  957. .get()
  958. .join(",");
  959. params['_type'] = mt.screen.object_type;
  960. } else {
  961. jQuery('input[name=return_args]').val(jQuery('input[name=return_args]').val()+'&does_act=1');
  962. }
  963. if (action) {
  964. $form.find('input[name=action_name]').val(action);
  965. params['action_name'] = action;
  966. } else {
  967. $form.find('input[name=action_name]').val('');
  968. }
  969. if (vals.length) {
  970. var items = jQuery.toJSON(vals);
  971. $form.find('input[name=items]').val(items);
  972. params['items'] = items;
  973. }
  974. if (opt['no_prompt']) {
  975. // Do always.
  976. }
  977. else if (opt['continue_prompt']) {
  978. if (!confirm(opt['continue_prompt'])) {
  979. return false;
  980. }
  981. }
  982. else if (phrase) {
  983. var message = ( count == 1 )
  984. ? trans('Are you sure you want to [_2] this [_1]?', singlar, phrase)
  985. : trans('Are you sure you want to [_3] the [_1] selected [_2]?', count, plural, phrase);
  986. if (!confirm(message)) {
  987. return;
  988. }
  989. }
  990. $form.find('input[name=__mode]').val(mode);
  991. if ( xhr )
  992. renderList(params);
  993. else if ( opt['dialog'] )
  994. jQuery.fn.mtDialog.open(ScriptURI + '?' + $form.serialize());
  995. else {
  996. $form.unbind('submit.as_apply').submit();
  997. }
  998. }
  999. function updateItemList () {
  1000. var list = jQuery('#item_list');
  1001. list.find('option').removeAttr('disabled');
  1002. jQuery('#filter-detail').find('.filtertype').each( function() {
  1003. jQuery(this).attr('class').match(/type-(\w+)/);
  1004. var type = RegExp.$1;
  1005. list.find('option[value=' + type + ']').attr('disabled','disabled');
  1006. });
  1007. }
  1008. jQuery(document).ready( function($) {
  1009. $.event.special.listReady = {
  1010. setup:function( data, ns ) {
  1011. return false;
  1012. },
  1013. teardown:function( ns ) {
  1014. return false;
  1015. }
  1016. };
  1017. $(window).bind( 'ajaxStart', function() {
  1018. $('#msg-block .msg-error').remove();
  1019. });
  1020. $.mtValidateRules['[name=filter_name], .rename-filter-input'] = function (e) {
  1021. return validateFilterName(e.val()) ? true : this.raise(trans('Label "[_1]" is already in use.', e.val() ));
  1022. };
  1023. $('ul#disp_cols .main:checkbox').click(function() {
  1024. var col = $(this).val();
  1025. var checked = $(this).is(':checked');
  1026. renderColumns(col, checked);
  1027. if (checked)
  1028. renderList('filtered_list', cols, vals, $('#row').val(), currentPage);
  1029. else
  1030. saveListPrefs();
  1031. var n = columnLength();
  1032. $('td.fullwidth-row').attr('colspan', n);
  1033. });
  1034. $('ul#disp_cols .sub:checkbox').click(function() {
  1035. toggleSubField(this);
  1036. var n = columnLength();
  1037. $('td.fullwidth-row').attr('colspan', n);
  1038. saveListPrefs();
  1039. });
  1040. $('#reset-display-options').click(function() {
  1041. $('#disp_cols input[type=checkbox]').each(function() {
  1042. if ( $(this).is('.show-default') ) {
  1043. $(this).attr('checked', 'checked');
  1044. }
  1045. else {
  1046. $(this).removeAttr('checked');
  1047. }
  1048. });
  1049. renderColumns();
  1050. renderList({});
  1051. var n = columnLength();
  1052. $('td.fullwidth-row').attr('colspan', n);
  1053. return false;
  1054. });
  1055. $('#row').change(function() {
  1056. $('table.listing-table tbody').empty();
  1057. checked = [];
  1058. renderColumns();
  1059. renderList('filtered_list', cols, vals, $(this).val(), 1);
  1060. });
  1061. $('table.listing-table th :checkbox').click(function() {
  1062. var $checkboxes = $('tr :checkbox');
  1063. if (this.checked) {
  1064. $checkboxes.attr('checked', 'checked');
  1065. addSelectAll($checkboxes);
  1066. $checkboxes.parents('tr').addClass('selected');
  1067. } else {
  1068. $checkboxes.removeAttr('checked');
  1069. removeSelectAll($checkboxes);
  1070. $checkboxes.parents('tr').removeClass('selected');
  1071. }
  1072. });
  1073. $('#item_list').change(function() {
  1074. var type = $('#item_list').val();
  1075. if ( !type ) return false;
  1076. var $item = filterItem(type);
  1077. $item
  1078. .insertAfter('.selectfilter')
  1079. .wrap('<div class="filteritem" />')
  1080. .find('.minus').hide().end()
  1081. .find('input').each( function() {
  1082. var id = $(this).attr('id') || $(this).attr('name') || 'input-' + inputCount++;
  1083. $(this)
  1084. .attr('id', id)
  1085. .attr('name', id);
  1086. });
  1087. $('#item_list').attr('selectedIndex', 0);
  1088. $('<span class="close-link clickable remove icon-remove icon16 action-icon">'+mt.screen.trans.REMOVE_ITEM+'</span>')
  1089. .insertAfter($item)
  1090. .bind('click', function() {
  1091. $(this).parent('.filteritem').find('input').mtUnvalidate().end().remove();
  1092. updateItemList();
  1093. updateFilterSaveButtons();
  1094. });
  1095. if ( allPass ) {
  1096. $('#filter_id').val('');
  1097. $('#opener').text(mt.screen.trans.UNKNOWN_FILTER);
  1098. editNewFilter = 1;
  1099. editSysFilter = 0;
  1100. allPass = 0;
  1101. }
  1102. updateItemList();
  1103. updateFilterSaveButtons({ allpass: false });
  1104. return false;
  1105. });
  1106. $('#apply').click(function() {
  1107. validateFilterDetails();
  1108. $('input[name=filter_id]').val('');
  1109. itemValues()
  1110. renderList('filtered_list', cols, vals, $('#row').val(), 1);
  1111. return false;
  1112. });
  1113. $('#'+mt.screen.object_type+'-listing-form').bind('submit.as_apply', function() {
  1114. $('#apply').click();
  1115. return false;
  1116. });
  1117. $('#save').click(function() {
  1118. validateFilterDetails();
  1119. if ($('#filter_id').val() && $('#filter_id').val().match(/^[1-9][0-9]*$/) ) {
  1120. // Overwrite current filter.
  1121. $('input[name=filter_name]').val($('#filter_name').val());
  1122. $('input[name=filter_id]').val($('#filter_id').val());
  1123. itemValues()
  1124. renderList('save_filter', cols, vals, $('#row').val(), 1);
  1125. } else {
  1126. // Create new filter.
  1127. var temp_base = 1;
  1128. var temp;
  1129. while ( 1 ) {
  1130. temp = trans('[_1] - Filter [_2]', mt.screen.object_label, temp_base++);
  1131. if ( 0 == $.grep(mt.screen.filters, function(f){ return f.label == temp }).length )
  1132. break;
  1133. }
  1134. $('input[name=filter_name]').mtUnvalidate().val(temp);
  1135. $('input[name=filter_id]').val('');
  1136. $('#dialog_save_filter').dialog({
  1137. title: trans('Save Filter'),
  1138. dialogClass: 'save',
  1139. width: 450,
  1140. modal: true,
  1141. resizable: false,
  1142. draggable: false,
  1143. closeOnEscape: false,
  1144. open: function(){
  1145. $('input[name=filter_name]').focus();
  1146. }
  1147. }).dialog('open');
  1148. }
  1149. return false;
  1150. });
  1151. $('#saveas').click(function() {
  1152. validateFilterDetails();
  1153. $('input[name=filter_name]').mtUnvalidate().val($('#opener').text());
  1154. $('input[name=filter_id]').val('');
  1155. $('#dialog_save_filter')
  1156. .dialog({
  1157. title: trans('Save As Filter'),
  1158. dialogClass: 'save',
  1159. width: 450,
  1160. modal: true,
  1161. resizable: false,
  1162. open: function () {
  1163. $('input[name=filter_name]').focus();
  1164. }
  1165. }).dialog('open');
  1166. return false;
  1167. });
  1168. $('#dialog_filter').dialog({
  1169. autoOpen: false,
  1170. title: trans('Select Filter'),
  1171. width: 380,
  1172. resizable: false
  1173. });
  1174. $('#opener').click(function() {
  1175. $('#dialog_filter').dialog('open');
  1176. return false;
  1177. });
  1178. $('#dialog_save_filter').dialog({
  1179. autoOpen: false,
  1180. dialogClass: 'save',
  1181. width: 450,
  1182. minHeight: 100
  1183. });
  1184. // When the enter key is pressed, click the primary button instead of submitting.
  1185. $('#dialog_save_filter form').submit(function() {
  1186. $('button.primary', this).click();
  1187. return false;
  1188. });
  1189. $('#save-filter').click(function() {
  1190. if ( !$('input[name=filter_name]').mtValidate('dialog') )
  1191. return false;
  1192. var name = $('input[name=filter_name]').val();
  1193. itemValues();
  1194. $(window).one('listReady', function() {
  1195. updateFilterSaveButtons({ new_filter: 0 });
  1196. });
  1197. renderList('save_filter', cols, vals, $('#row').val(), 1);
  1198. return false;
  1199. });
  1200. $('#cancel-save-filter').click(function() {
  1201. $(this).parents().dialog('close');
  1202. });
  1203. $('#allpass-filter').click( function() {
  1204. allPass = 1;
  1205. $('#filter-detail').hide();
  1206. $('#filter').removeClass('active');
  1207. doApplyFilter(mt.screen.allpass_filter);
  1208. return false;
  1209. });
  1210. $('.action_selector').change(function() {
  1211. var selected = $(this).val();
  1212. $('.action_selector').val(selected);
  1213. });
  1214. $('button.mt-'+mt.screen.object_type+'-listing-form-action').click(function() {
  1215. var id = mt.screen.object_type+'-listing-form';
  1216. var singlar = mt.screen.singular;
  1217. var plural = mt.screen.plural;
  1218. var phrase = mt.screen.trans.ACT_UPON;
  1219. doForMarked(id, 'itemset_action', singlar, plural, phrase);
  1220. return false;
  1221. });
  1222. $('.actions-bar a.button').click(function() {
  1223. $(this).attr('href').match(/#(.*)/);
  1224. var action = RegExp.$1;
  1225. var id = mt.screen.object_type+'-listing-form';
  1226. var singlar = mt.screen.singular;
  1227. var plural = mt.screen.plural;
  1228. var phrase = mt.screen.button_messages[action];
  1229. doForMarked(id, action, singlar, plural, phrase);
  1230. return false;
  1231. });
  1232. $('.filtertype .minus').live('click', function() {
  1233. var $item = $(this).parents('.filteritem');
  1234. $(this).parents('.filtertype').find('input').mtUnvalidate().end().remove();
  1235. if ( $item.find('.filtertype').length == 1 ) {
  1236. $item.find('.minus').hide();
  1237. }
  1238. });
  1239. $('.filtertype .plus').live('click', function() {
  1240. var op = 'and';
  1241. $(this).parents('.filteritem').addClass(op);
  1242. var $filtertype = $(this).parents('.filtertype');
  1243. var $filteritem = $(this).parents('.filteritem');
  1244. $filtertype.attr('class').match(/type-(\w+)/);
  1245. var type = RegExp.$1;
  1246. var $node = filterItem(type, true);
  1247. var $clone = $node.clone(true);
  1248. $clone.insertAfter($filtertype)
  1249. .find('.item-label').addClass('invisible');
  1250. $clone.find('.filter-date').each(function() {
  1251. dateOption($(this));
  1252. }).bind('change', function() {
  1253. dateOption($(this));
  1254. }).end()
  1255. .find('.date').datepicker({
  1256. dateFormat: 'yy-mm-dd',
  1257. dayNamesMin: mt.screen.trans.DAY_NAMES,
  1258. monthNames: ['- 01','- 02','- 03','- 04','- 05','- 06','- 07','- 08','- 09','- 10','- 11','- 12'],
  1259. showMonthAfterYear: true,
  1260. prevText: '&lt;',
  1261. nextText: '&gt;'
  1262. });
  1263. $filteritem.find('.minus').show();
  1264. });
  1265. $(window).bind('listReady', function(){
  1266. $('ul#disp_cols .sub:checkbox').each(function () {
  1267. toggleSubField(this);
  1268. });
  1269. $('a.action-link.mt-open-dialog').mtDialog();
  1270. });
  1271. var line = '<th class="col head cb"' + (mt.screen.has_list_actions ? '' : ' style="display: none;"') + '><input type="checkbox" /></th>';
  1272. var table = $('table.listing-table')[0];
  1273. for (i=0;i<mt.screen.list_columns.length;i++) {
  1274. var col = mt.screen.list_columns[i];
  1275. line += '<th class="col head '+col.id+(col.is_primary ? ' primary' : '')+(typeof col.col_class != 'undefined' ? ' ' + col.col_class : '')+'">'+(col.is_sortable ? '<a href="#'+col.id+'" class="sort-link"><span class="col-label">'+col.label+'</span><span class="sm"></span></a>' : '<span class="col-label">'+col.label+'</span>')+'</th>';
  1276. if (mt.screen.default_sort_order == "descend") {
  1277. $.data(table, col.id, 'desc');
  1278. } else {
  1279. $.data(table, col.id, 'asc');
  1280. }
  1281. }
  1282. $('table.listing-table thead, table.listing-table tfoot').append('<tr>');
  1283. $(line).appendTo('table.listing-table thead tr, table.listing-table tfoot tr');
  1284. var filter_types = {};
  1285. for (i=0;i<mt.screen.filter_types;i++) {
  1286. var fltr = mt.screen.filter_types[i];
  1287. filter_types[ fltr.type ] = '<div class="filtertype type-'+fltr.type+(fltr.is_editable ? '' : 'no-edit')+(typeof fltr.base_type != 'undefined' ? ' base-'+fltr.base_type : '')+'"><div class="item-content">'+fltr.field+(fltr.is_singleton ? '' : '<span class="item-ctrl"><span class="item-action plus clickable icon-plus icon16 action-icon">'+mt.screen.trans.ADD+'</span><span class="item-action minus clickable icon-minus icon16 action-icon">'+mt.screen.trans.REMOVE+'</span></span>')+'</div></div>';
  1288. }
  1289. $('#filter_types').hide();
  1290. if (!mt.screen.open_filter_panel) $('#filter-detail').hide();
  1291. $('.filter-block').mtToggleField( mt.screen.open_filter_panel ? {default_hide: false} : {} );
  1292. addItems(mt.screen.initial_filter.items);
  1293. $('#opener').html(mt.screen.initial_filter.label);
  1294. $('#filter_name').val(mt.screen.initial_filter.label);
  1295. $('#filter_id').val(mt.screen.initial_filter.id);
  1296. $('input[name=filter_id]').val(mt.screen.initial_filter.id);
  1297. if ( mt.screen.initial_filter.id == '_allpass' )
  1298. allPass = 1;
  1299. $('input[name=filter_name]').val(mt.screen.initial_filter.label);
  1300. editSysFilter = !parseInt(mt.screen.initial_filter.can_edit);
  1301. if ( $('#disp_cols li:not(.hidden)').size() == 0 )
  1302. $('#display_columns-field, #reset-display-options').hide();
  1303. itemValues()
  1304. renderColumns();
  1305. renderFilterList();
  1306. $('table.listing-table thead a, tfoot a').click(function() {
  1307. var url = $(this).attr('href');
  1308. var $th = $('a[href=\''+url+'\']').parents('th');
  1309. if ($th.hasClass('sorted')) {
  1310. var $order = $th.find('span');
  1311. if ($order.hasClass('desc')) {
  1312. $order.removeClass('desc').addClass('asc');
  1313. } else {
  1314. $order.removeClass('asc').addClass('desc');
  1315. }
  1316. } else {
  1317. $('table.listing-table thead th, tfoot th').removeClass('sorted').find('span.sm').removeClass('asc desc');
  1318. $th.addClass('sorted').find('span.sm').remove();
  1319. url.match(/#(.*)/);
  1320. $('<span class="sm '+$.data(table, RegExp.$1)+'"></span>').appendTo($th.find('.sort-link'));
  1321. }
  1322. checked = [];
  1323. renderColumns();
  1324. renderList('filtered_list', cols, vals, $('#row').val(), 1);
  1325. return false;
  1326. });
  1327. // This must be located after the listeners and handlers are registered for the page
  1328. if (typeof mt.screen.default_sort_key != 'undefined') {
  1329. var initial_sort_button = $('table.listing-table thead th.'+mt.screen.default_sort_key+' a.sort-link');
  1330. if ( initial_sort_button.length ) {
  1331. initial_sort_button.click();
  1332. } else {
  1333. renderList('filtered_list', cols, vals, $('#row').val(), 1);
  1334. }
  1335. } else {
  1336. renderList('filtered_list', cols, vals, $('#row').val(), 1);
  1337. }
  1338. updateFilterSaveButtons();
  1339. if (mt.screen.has_list_actions) {
  1340. $('table.listing-table tbody').selectable({
  1341. filter: 'tr',
  1342. cancel: 'tr.no-action, a, .select-all, .text, .can-select, button, pre, :input:not([name=id])',
  1343. selected: function(event, ui) {
  1344. var $checkboxes = $(ui.selected).find(':checkbox');
  1345. if ($checkboxes.attr('checked')) {
  1346. $(ui.selected).removeClass('selected');
  1347. $checkboxes.removeAttr('checked');
  1348. } else {
  1349. $(ui.selected).addClass('selected');
  1350. $checkboxes.attr('checked', 'checked');
  1351. }
  1352. if ($('table.listing-table td :checkbox').length == $('table.listing-table td :checked').length) {
  1353. $('table.listing-table th :checkbox').attr('checked', 'checked');
  1354. if (!$('table.listing-table tr.select-all').length) {
  1355. addSelectAll($checkboxes);
  1356. }
  1357. } else {
  1358. $('table.listing-table th :checkbox').removeAttr('checked');
  1359. removeSelectAll($checkboxes);
  1360. }
  1361. }
  1362. });
  1363. }
  1364. if (typeof mt.screen.system_messages != 'undefined') {
  1365. for ( var i=0; i < mt.screen.system_messages.length; i++ ) {
  1366. var message = system_messages[i];
  1367. showMessage( message.msg, message.cls );
  1368. }
  1369. }
  1370. });