Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. function fancyTimeFormat(duration) {
  2. const hrs = ~~(duration / 3600);
  3. const mins = ~~((duration % 3600) / 60);
  4. const secs = ~~duration % 60;
  5. // Output like "1:01" or "4:03:59" or "123:03:59"
  6. let ret = "";
  7. if (hrs > 0) {
  8. ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
  9. }
  10. ret += "" + mins + ":" + (secs < 10 ? "0" : "");
  11. ret += "" + secs;
  12. return ret;
  13. }
  14. function playDing() {
  15. const ding_sound = new Audio('ding-sound-effect_2.mp3');
  16. ding_sound.play();
  17. }
  18. function startTimerOnElement() {
  19. let currElement = $('#task_list > .current_element').first();
  20. if (!currElement.length) {
  21. $('#timer_reset_btn').prop('disabled', true);
  22. $('#timer_next_btn').prop('disabled', true);
  23. $('#timer_start_btn').prop('disabled', false);
  24. $('#spent_time').text('0:00');
  25. $('#element_title').text('');
  26. return;
  27. }
  28. let element_ttl = currElement.data('ttl');
  29. let timer = element_ttl;
  30. $('#spent_time').text(fancyTimeFormat(element_ttl - timer));
  31. $('#rest_time').text(fancyTimeFormat(timer));
  32. let title = currElement.html();
  33. if (title) {
  34. let short_title = '';
  35. $($.parseHTML(title)).filter('b').each(function () {
  36. short_title += $(this).text() + ' ';
  37. });
  38. $('#element_title').text(short_title);
  39. }
  40. timerId = setInterval(function () {
  41. --timer;
  42. $('#spent_time').text(fancyTimeFormat(element_ttl - timer));
  43. $('#rest_time').text(fancyTimeFormat(timer));
  44. if (!timer) {
  45. clearInterval(timerId);
  46. timerId = null;
  47. //playDing();
  48. startNextTimer(currElement);
  49. }
  50. }, 1000);
  51. }
  52. function startNextTimer(currElement) {
  53. let nextElement = currElement.parent().children('li.current_element + li');
  54. if (!nextElement) {
  55. $('#spent_time').text('0:00');
  56. $('#rest_time').text('0:00');
  57. return;
  58. }
  59. currElement.removeClass('current_element');
  60. nextElement.addClass('current_element');
  61. startTimerOnElement();
  62. }
  63. function calcTotalTimeSeconds() {
  64. let total_time = 0;
  65. $('#task_list').children('li').each(function () {
  66. let ttl = $(this).data('ttl');
  67. if (!ttl || !parseInt(ttl) || ttl != parseInt(ttl)) {
  68. alert('Illegal element TTL value "' + ttl + '"!');
  69. return false;
  70. }
  71. total_time += ttl;
  72. });
  73. return total_time;
  74. }
  75. let timerId;
  76. $(document).ready(function () {
  77. $('#total_rest_time').text(fancyTimeFormat(calcTotalTimeSeconds()));
  78. $('#timer_start_btn').on('click', function () {
  79. if (timerId) {
  80. return;
  81. }
  82. $(this).prop('disabled', true);
  83. $('#timer_reset_btn').prop('disabled', false);
  84. $('#timer_next_btn').prop('disabled', false);
  85. //playDing();
  86. if (!$('#task_list > .current_element').length) {
  87. $('#task_list > li').first().addClass('current_element');
  88. }
  89. startTimerOnElement();
  90. })
  91. $('#timer_reset_btn').on('click', function () {
  92. if (!timerId) {
  93. return;
  94. }
  95. clearInterval(timerId);
  96. timerId = null;
  97. startTimerOnElement();
  98. });
  99. $('#timer_next_btn').on('click', function () {
  100. if (!timerId) {
  101. return;
  102. }
  103. clearInterval(timerId);
  104. timerId = null;
  105. let currElement = $('#task_list > .current_element').first();
  106. if (!currElement) {
  107. $('#spent_time').text('0:00');
  108. $('#rest_time').text('0:00');
  109. return;
  110. }
  111. startNextTimer(currElement);
  112. });
  113. });