The version of vichan running on lainchan.org
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

218 lignes
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. });