image.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. var imglist = null;
  2. var dirname = null;
  3. var filename = null;
  4. var currId = 0;
  5. function makeImageUrl(dir, file) {
  6. var res = scriptUrlPrefix + 'image.php?dir=' + dirname + '&file=' + filename;
  7. if (mode && mode.length > 0) {
  8. res += '&mode=' + mode;
  9. }
  10. return res;
  11. }
  12. function setLinks(e) {
  13. var doPush = false;
  14. /* browser navigation handling */
  15. if (e === undefined || e.type != 'popstate') {
  16. doPush = true;
  17. } else {
  18. currId = e.state;
  19. }
  20. /* replace the content */
  21. filename = imglist[currId].name;
  22. if (currId > 0) {
  23. $('#poprz').attr('href', makeImageUrl(dirname, imglist[currId-1].name));
  24. $('#poprz').show();
  25. } else {
  26. $('#poprz').hide();
  27. }
  28. if (currId < imglist.length - 1) {
  29. var url = makeImageUrl(dirname, imglist[currId+1].name);
  30. $('#nast').attr('href', url);
  31. $('#imagelink').attr('href', url);
  32. $('#nast').show();
  33. } else {
  34. $('#nast').hide();
  35. $('#imagelink').removeAttr('href');
  36. }
  37. var image = $("#image");
  38. image.removeClass('expanded');
  39. image.css('opacity', '0.2');
  40. image.attr('src', imageUrlPrefix + dirname + '/' + filename);
  41. image.off('load').on('load', function() {
  42. image.css('opacity', '1');
  43. scrollToImage();
  44. });
  45. if (doPush)
  46. window.history.pushState(currId, '', makeImageUrl(dirname, filename));
  47. commentsImageReplace(imglist[currId]);
  48. refreshComments();
  49. }
  50. function nextImage(e) {
  51. if (e)
  52. e.preventDefault();
  53. if (currId >= imglist.length - 1)
  54. return;
  55. currId++;
  56. setLinks();
  57. }
  58. function prevImage(e) {
  59. if (e)
  60. e.preventDefault();
  61. if (currId == 0)
  62. return;
  63. currId--;
  64. setLinks();
  65. }
  66. function imglistReceived(data) {
  67. imglist = data;
  68. /* find current id by url */
  69. var found = false;
  70. for (var i=0; i<data.length; i++) {
  71. file = data[i];
  72. if(file.name == filename) {
  73. currId = file.ord;
  74. found = true;
  75. break;
  76. }
  77. }
  78. if (!found) /* don't know where i am */
  79. return;
  80. $('#poprz').click(prevImage);
  81. $('#imagelink').click(nextImage);
  82. $('#nast').click(nextImage);
  83. window.onpopstate = setLinks;
  84. window.history.replaceState(currId, '', makeImageUrl(dirname, filename));
  85. }
  86. function getImgList() {
  87. var queryString = window.location.search;
  88. if (URLSearchParams === undefined)
  89. return; /* browser not supported */
  90. var urlParams = new URLSearchParams(queryString);
  91. dirname = urlParams.get('dir');
  92. filename = urlParams.get('file');
  93. if (dirname === null || filename === null) /* invalid params */
  94. return;
  95. var args = 'dir=' + dirname;
  96. if (mode && mode.length > 0) {
  97. args += '&mode=' + mode;
  98. }
  99. $.ajax({
  100. dataType: 'json',
  101. url: scriptUrlPrefix+'dirlist.php?'+args,
  102. success: imglistReceived
  103. });
  104. }
  105. $(document).keydown(function(e) {
  106. switch (e.which) {
  107. case 37:
  108. prevImage();
  109. return false;
  110. case 39:
  111. nextImage();
  112. return false;
  113. }
  114. });
  115. function initImageInteraction() {
  116. var img = document.getElementById('image');
  117. var imagelink = document.getElementById('imagelink');
  118. var isDragging = false;
  119. var hasDragged = false;
  120. var startX, startY, scrollLeft, scrollTop;
  121. var clickCount = 0;
  122. var clickTimer = null;
  123. var suppressNextClick = false;
  124. /* intercept clicks in capture phase to distinguish single vs double click */
  125. imagelink.addEventListener('click', function(e) {
  126. e.stopPropagation();
  127. e.preventDefault();
  128. if (suppressNextClick) {
  129. suppressNextClick = false;
  130. return;
  131. }
  132. clickCount++;
  133. clearTimeout(clickTimer);
  134. if (clickCount >= 2) {
  135. clickCount = 0;
  136. img.classList.toggle('expanded');
  137. if (!img.classList.contains('expanded')) {
  138. img.scrollIntoView({behavior: 'smooth', block: 'nearest', inline: 'nearest'});
  139. }
  140. } else {
  141. clickTimer = setTimeout(function() {
  142. clickCount = 0;
  143. if (!img.classList.contains('expanded')) {
  144. nextImage();
  145. }
  146. }, 250);
  147. }
  148. }, true);
  149. img.addEventListener('mousedown', function(e) {
  150. if (!img.classList.contains('expanded') || e.button !== 0) return;
  151. isDragging = true;
  152. hasDragged = false;
  153. startX = e.clientX;
  154. startY = e.clientY;
  155. scrollLeft = window.scrollX;
  156. scrollTop = window.scrollY;
  157. img.classList.add('dragging');
  158. e.preventDefault();
  159. });
  160. document.addEventListener('mousemove', function(e) {
  161. if (!isDragging) return;
  162. var dx = e.clientX - startX;
  163. var dy = e.clientY - startY;
  164. if (Math.abs(dx) > 3 || Math.abs(dy) > 3) hasDragged = true;
  165. window.scrollTo(scrollLeft - dx, scrollTop - dy);
  166. });
  167. document.addEventListener('mouseup', function() {
  168. if (!isDragging) return;
  169. isDragging = false;
  170. img.classList.remove('dragging');
  171. if (hasDragged) suppressNextClick = true;
  172. });
  173. img.addEventListener('touchstart', function(e) {
  174. if (!img.classList.contains('expanded') || e.touches.length !== 1) return;
  175. isDragging = true;
  176. hasDragged = false;
  177. startX = e.touches[0].clientX;
  178. startY = e.touches[0].clientY;
  179. scrollLeft = window.scrollX;
  180. scrollTop = window.scrollY;
  181. }, {passive: true});
  182. img.addEventListener('touchmove', function(e) {
  183. if (!isDragging || e.touches.length !== 1) return;
  184. var dx = e.touches[0].clientX - startX;
  185. var dy = e.touches[0].clientY - startY;
  186. if (Math.abs(dx) > 3 || Math.abs(dy) > 3) hasDragged = true;
  187. window.scrollTo(scrollLeft - dx, scrollTop - dy);
  188. e.preventDefault();
  189. }, {passive: false});
  190. img.addEventListener('touchend', function() {
  191. isDragging = false;
  192. });
  193. }
  194. function scrollToImage() {
  195. var img = document.getElementById('image');
  196. img.scrollIntoView({behavior: 'smooth', block: 'nearest', inline: 'nearest'});
  197. }
  198. $(document).ready(function() {
  199. getImgList();
  200. $('body').on('swipeleft', nextImage);
  201. $('body').on('swiperight', prevImage);
  202. initImageInteraction();
  203. var img = document.getElementById('image');
  204. if (img.complete) {
  205. scrollToImage();
  206. } else {
  207. img.addEventListener('load', scrollToImage, {once: true});
  208. }
  209. });