handlers.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. 'use strict';
  2. (function () {
  3. var video_player = document.getElementById('player_html5_api');
  4. if (video_player) {
  5. video_player.onmouseenter = function () { video_player['data-title'] = video_player['title']; video_player['title'] = ''; };
  6. video_player.onmouseleave = function () { video_player['title'] = video_player['data-title']; video_player['data-title'] = ''; };
  7. video_player.oncontextmenu = function () { video_player['title'] = video_player['data-title']; };
  8. }
  9. // For dynamically inserted elements
  10. addEventListener('click', function (e) {
  11. if (!e || !e.target) return;
  12. var t = e.target;
  13. var handler_name = t.getAttribute('data-onclick');
  14. switch (handler_name) {
  15. case 'jump_to_time':
  16. e.preventDefault();
  17. var time = t.getAttribute('data-jump-time');
  18. player.currentTime(time);
  19. break;
  20. case 'get_youtube_replies':
  21. var load_more = t.getAttribute('data-load-more') !== null;
  22. var load_replies = t.getAttribute('data-load-replies') !== null;
  23. get_youtube_replies(t, load_more, load_replies);
  24. break;
  25. case 'toggle_parent':
  26. e.preventDefault();
  27. toggle_parent(t);
  28. break;
  29. default:
  30. break;
  31. }
  32. });
  33. document.querySelectorAll('[data-mouse="switch_classes"]').forEach(function (el) {
  34. var classes = el.getAttribute('data-switch-classes').split(',');
  35. var classOnEnter = classes[0];
  36. var classOnLeave = classes[1];
  37. function toggle_classes(toAdd, toRemove) {
  38. el.classList.add(toAdd);
  39. el.classList.remove(toRemove);
  40. }
  41. el.onmouseenter = function () { toggle_classes(classOnEnter, classOnLeave); };
  42. el.onmouseleave = function () { toggle_classes(classOnLeave, classOnEnter); };
  43. });
  44. document.querySelectorAll('[data-onsubmit="return_false"]').forEach(function (el) {
  45. el.onsubmit = function () { return false; };
  46. });
  47. document.querySelectorAll('[data-onclick="mark_watched"]').forEach(function (el) {
  48. el.onclick = function () { mark_watched(el); };
  49. });
  50. document.querySelectorAll('[data-onclick="mark_unwatched"]').forEach(function (el) {
  51. el.onclick = function () { mark_unwatched(el); };
  52. });
  53. document.querySelectorAll('[data-onclick="add_playlist_video"]').forEach(function (el) {
  54. el.onclick = function () { add_playlist_video(el); };
  55. });
  56. document.querySelectorAll('[data-onclick="add_playlist_item"]').forEach(function (el) {
  57. el.onclick = function () { add_playlist_item(el); };
  58. });
  59. document.querySelectorAll('[data-onclick="remove_playlist_item"]').forEach(function (el) {
  60. el.onclick = function () { remove_playlist_item(el); };
  61. });
  62. document.querySelectorAll('[data-onclick="revoke_token"]').forEach(function (el) {
  63. el.onclick = function () { revoke_token(el); };
  64. });
  65. document.querySelectorAll('[data-onclick="remove_subscription"]').forEach(function (el) {
  66. el.onclick = function () { remove_subscription(el); };
  67. });
  68. document.querySelectorAll('[data-onclick="notification_requestPermission"]').forEach(function (el) {
  69. el.onclick = function () { Notification.requestPermission(); };
  70. });
  71. document.querySelectorAll('[data-onrange="update_volume_value"]').forEach(function (el) {
  72. function update_volume_value() {
  73. document.getElementById('volume-value').textContent = el.value;
  74. }
  75. el.oninput = update_volume_value;
  76. el.onchange = update_volume_value;
  77. });
  78. function revoke_token(target) {
  79. var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
  80. row.style.display = 'none';
  81. var count = document.getElementById('count');
  82. count.textContent--;
  83. var url = '/token_ajax?action_revoke_token=1&redirect=false' +
  84. '&referer=' + encodeURIComponent(location.href) +
  85. '&session=' + target.getAttribute('data-session');
  86. var payload = 'csrf_token=' + target.parentNode.querySelector('input[name="csrf_token"]').value;
  87. helpers.xhr('POST', url, {payload: payload}, {
  88. onNon200: function (xhr) {
  89. count.textContent++;
  90. row.style.display = '';
  91. }
  92. });
  93. }
  94. function remove_subscription(target) {
  95. var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
  96. row.style.display = 'none';
  97. var count = document.getElementById('count');
  98. count.textContent--;
  99. var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
  100. '&referer=' + encodeURIComponent(location.href) +
  101. '&c=' + target.getAttribute('data-ucid');
  102. var payload = 'csrf_token=' + target.parentNode.querySelector('input[name="csrf_token"]').value;
  103. helpers.xhr('POST', url, {payload: payload}, {
  104. onNon200: function (xhr) {
  105. count.textContent++;
  106. row.style.display = '';
  107. }
  108. });
  109. }
  110. // Handle keypresses
  111. addEventListener('keydown', function (event) {
  112. // Ignore modifier keys
  113. if (event.ctrlKey || event.metaKey) return;
  114. // Ignore shortcuts if any text input is focused
  115. let focused_tag = document.activeElement.tagName.toLowerCase();
  116. const allowed = /^(button|checkbox|file|radio|submit)$/;
  117. if (focused_tag === 'textarea') return;
  118. if (focused_tag === 'input') {
  119. let focused_type = document.activeElement.type.toLowerCase();
  120. if (!allowed.test(focused_type)) return;
  121. }
  122. // Focus search bar on '/'
  123. if (event.key === '/') {
  124. document.getElementById('searchbox').focus();
  125. event.preventDefault();
  126. }
  127. });
  128. })();