The version of vichan running on lainchan.org
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

218 Zeilen
6.4KB

  1. /*
  2. * inline-expanding.js
  3. * https://github.com/savetheinternet/Tinyboard/blob/master/js/inline-expanding.js
  4. *
  5. * Released under the MIT license
  6. * Copyright (c) 2012-2013 Michael Save <savetheinternet@tinyboard.org>
  7. * Copyright (c) 2013-2014 Marcin Łabanowski <marcin@6irc.net>
  8. *
  9. * Usage:
  10. * $config['additional_javascript'][] = 'js/jquery.min.js';
  11. * $config['additional_javascript'][] = 'js/inline-expanding.js';
  12. *
  13. */
  14. $(document).ready(function(){
  15. 'use strict';
  16. var DEFAULT_MAX = 5; // default maximum image loads
  17. var inline_expand_post = function() {
  18. var link = this.getElementsByTagName('a');
  19. var loadingQueue = (function () {
  20. var MAX_IMAGES = localStorage.inline_expand_max || DEFAULT_MAX; // maximum number of images to load concurrently, 0 to disable
  21. var loading = 0; // number of images that is currently loading
  22. var waiting = []; // waiting queue
  23. var enqueue = function (ele) {
  24. waiting.push(ele);
  25. };
  26. var dequeue = function () {
  27. return waiting.shift();
  28. };
  29. var update = function() {
  30. var ele;
  31. while (loading < MAX_IMAGES || MAX_IMAGES === 0) {
  32. ele = dequeue();
  33. if (ele) {
  34. ++loading;
  35. ele.deferred.resolve();
  36. } else {
  37. return;
  38. }
  39. }
  40. };
  41. return {
  42. remove: function (ele) {
  43. var i = waiting.indexOf(ele);
  44. if (i > -1) {
  45. waiting.splice(i, 1);
  46. }
  47. if ($(ele).data('imageLoading') === 'true') {
  48. $(ele).data('imageLoading', 'false');
  49. clearTimeout(ele.timeout);
  50. --loading;
  51. }
  52. },
  53. add: function (ele) {
  54. ele.deferred = $.Deferred();
  55. ele.deferred.done(function () {
  56. var $loadstart = $.Deferred();
  57. var thumb = ele.childNodes[0];
  58. var img = ele.childNodes[1];
  59. var onLoadStart = function (img) {
  60. if (img.naturalWidth) {
  61. $loadstart.resolve(img, thumb);
  62. } else {
  63. return (ele.timeout = setTimeout(onLoadStart, 30, img));
  64. }
  65. };
  66. $(img).one('load', function () {
  67. $.when($loadstart).done(function () {
  68. // once fully loaded, update the waiting queue
  69. --loading;
  70. $(ele).data('imageLoading', 'false');
  71. update();
  72. });
  73. });
  74. $loadstart.done(function (img, thumb) {
  75. thumb.style.display = 'none';
  76. img.style.display = '';
  77. });
  78. img.setAttribute('src', ele.href);
  79. $(ele).data('imageLoading', 'true');
  80. ele.timeout = onLoadStart(img);
  81. });
  82. if (loading < MAX_IMAGES || MAX_IMAGES === 0) {
  83. ++loading;
  84. ele.deferred.resolve();
  85. } else {
  86. enqueue(ele);
  87. }
  88. }
  89. };
  90. })();
  91. for (var i = 0; i < link.length; i++) {
  92. if (typeof link[i] == "object" && link[i].childNodes && typeof link[i].childNodes[0] !== 'undefined' &&
  93. link[i].childNodes[0].src && link[i].childNodes[0].className.match(/post-image/) && !link[i].className.match(/file/)) {
  94. link[i].onclick = function(e) {
  95. var img, post_body, still_open, canvas, scroll;
  96. var thumb = this.childNodes[0];
  97. var padding = 5;
  98. var boardlist = $('.boardlist')[0];
  99. if (thumb.className == 'hidden')
  100. return false;
  101. if (e.which == 2 || e.ctrlKey) // open in new tab
  102. return true;
  103. if (!$(this).data('expanded')) {
  104. if (~this.parentNode.className.indexOf('multifile'))
  105. $(this).data('width', this.parentNode.style.width);
  106. this.parentNode.removeAttribute('style');
  107. $(this).data('expanded', 'true');
  108. if (thumb.tagName === 'CANVAS') {
  109. canvas = thumb;
  110. thumb = thumb.nextSibling;
  111. this.removeChild(canvas);
  112. canvas.style.display = 'block';
  113. }
  114. thumb.style.opacity = '0.4';
  115. thumb.style.filter = 'alpha(opacity=40)';
  116. img = document.createElement('img');
  117. img.className = 'full-image';
  118. img.style.display = 'none';
  119. img.setAttribute('alt', 'Fullsized image');
  120. this.appendChild(img);
  121. loadingQueue.add(this);
  122. } else {
  123. loadingQueue.remove(this);
  124. scroll = false;
  125. // scroll to thumb if not triggered by 'shrink all image'
  126. if (e.target.className == 'full-image') {
  127. scroll = true;
  128. }
  129. if (~this.parentNode.className.indexOf('multifile'))
  130. this.parentNode.style.width = $(this).data('width');
  131. thumb.style.opacity = '';
  132. thumb.style.display = '';
  133. if (thumb.nextSibling) this.removeChild(thumb.nextSibling); //full image loaded or loading
  134. $(this).removeData('expanded');
  135. delete thumb.style.filter;
  136. // do the scrolling after page reflow
  137. if (scroll) {
  138. post_body = $(thumb).parentsUntil('form > div').last();
  139. // on multifile posts, determin how many other images are still expanded
  140. still_open = post_body.find('.post-image').filter(function(){
  141. return $(this).parent().data('expanded') == 'true';
  142. }).length;
  143. // deal with differnt boards' menu styles
  144. if ($(boardlist).css('position') == 'fixed')
  145. padding += boardlist.getBoundingClientRect().height;
  146. if (still_open > 0) {
  147. if (thumb.getBoundingClientRect().top - padding < 0)
  148. $(document).scrollTop($(thumb).parent().parent().offset().top - padding);
  149. } else {
  150. if (post_body[0].getBoundingClientRect().top - padding < 0)
  151. $(document).scrollTop(post_body.offset().top - padding);
  152. }
  153. }
  154. if (localStorage.no_animated_gif === 'true' && typeof unanimate_gif === 'function') {
  155. unanimate_gif(thumb);
  156. }
  157. }
  158. return false;
  159. };
  160. }
  161. }
  162. };
  163. // setting up user option
  164. if (window.Options && Options.get_tab('general')) {
  165. Options.extend_tab('general', '<span id="inline-expand-max">'+ _('Number of simultaneous image downloads (0 to disable): ') +
  166. '<input type="number" step="1" min="0" size="4"></span>');
  167. $('#inline-expand-max input')
  168. .css('width', '50px')
  169. .val(localStorage.inline_expand_max || DEFAULT_MAX)
  170. .on('change', function (e) {
  171. // validation in case some fucktard tries to enter a negative floating point number
  172. var n = parseInt(e.target.value);
  173. var val = (n<0) ? 0 : n;
  174. localStorage.inline_expand_max = val;
  175. });
  176. }
  177. if (window.jQuery) {
  178. $('div[id^="thread_"]').each(inline_expand_post);
  179. // allow to work with auto-reload.js, etc.
  180. $(document).on('new_post', function(e, post) {
  181. inline_expand_post.call(post);
  182. });
  183. } else {
  184. inline_expand_post.call(document);
  185. }
  186. });