You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

70 lines
2.0 KiB

  1. // Calculator
  2. // ----------
  3. _r.calc_dialog = null;
  4. _r.show_calc = function(tab, colnames, coltypes, add_idx) {
  5. if(!add_idx) add_idx = 0;
  6. if(!tab || !tab.rows.length) { msgprint("No Data"); return; }
  7. if(!_r.calc_dialog) {
  8. var d = new Dialog(400,400,"Calculator")
  9. d.make_body([
  10. ['Select','Column']
  11. ,['Data','Sum']
  12. ,['Data','Average']
  13. ,['Data','Min']
  14. ,['Data','Max']
  15. ])
  16. d.widgets['Sum'].readonly = 'readonly';
  17. d.widgets['Average'].readonly = 'readonly';
  18. d.widgets['Min'].readonly = 'readonly';
  19. d.widgets['Max'].readonly = 'readonly';
  20. d.widgets['Column'].onchange = function() {
  21. d.set_calc();
  22. }
  23. d.set_calc = function() {
  24. // get the current column of the data table
  25. var cn = sel_val(this.widgets['Column']);
  26. var cidx = 0; var sum=0; var avg=0; var minv = null; var maxv = null;
  27. for(var i=0;i<this.colnames.length;i++) {if(this.colnames[i]==cn){ cidx=i+add_idx; break; } }
  28. for(var i=0; i<this.datatab.rows.length; i++) {
  29. var c = this.datatab.rows[i].cells[cidx];
  30. var v = c.div ? flt(c.div.innerHTML) : flt(c.innerHTML);
  31. sum += v;
  32. if(minv == null) minv = v;
  33. if(maxv == null) maxv = v;
  34. if(v > maxv)maxv = v;
  35. if(v < minv)minv = v;
  36. }
  37. d.widgets['Sum'].value = fmt_money(sum);
  38. d.widgets['Average'].value = fmt_money(sum / this.datatab.rows.length);
  39. d.widgets['Min'].value = fmt_money(minv);
  40. d.widgets['Max'].value = fmt_money(maxv);
  41. _r.calc_dialog = d;
  42. }
  43. d.onshow = function() {
  44. // set columns
  45. var cl = [];
  46. for(var i in _r.calc_dialog.colnames) {
  47. if(in_list(['Currency','Int','Float'],_r.calc_dialog.coltypes[i]))
  48. cl.push(_r.calc_dialog.colnames[i]);
  49. }
  50. if(!cl.length) {
  51. this.hide();
  52. alert("No Numeric Column");
  53. return;
  54. }
  55. var s = this.widgets['Column'];
  56. empty_select(s);
  57. add_sel_options(s, cl);
  58. if(s.inp)s.inp.value = cl[0];
  59. else s.value = cl[0];
  60. this.set_calc();
  61. }
  62. _r.calc_dialog = d;
  63. }
  64. _r.calc_dialog.datatab = tab;
  65. _r.calc_dialog.colnames = colnames;
  66. _r.calc_dialog.coltypes = coltypes;
  67. _r.calc_dialog.show();
  68. }