You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.7 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. var httpGet = require('./httpGet')
  2. var ImageLoader = require('./ImageLoader')
  3. var showTimer
  4. function showImage (image, dom) {
  5. var div = document.createElement('div')
  6. div.innerHTML = '<a target="_blank" href="' + image.url + '"><img src="' + image.url + '"></a>'
  7. dom.appendChild(div)
  8. }
  9. function showWikimediaImage (image, dom) {
  10. httpGet(
  11. 'https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(image.id),
  12. {
  13. forceServerLoad: true
  14. },
  15. function (err, result) {
  16. if (!result) {
  17. return
  18. }
  19. let m = result.body.match('img .* src="([^"]+)" .* data-file-width="([0-9]+)" data-file-height="([0-9]+)"')
  20. let src = m[1]
  21. var div = document.createElement('div')
  22. div.innerHTML = '<a target="_blank" href="https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(image.id) + '"><img src="' + src + '"/></a>'
  23. dom.appendChild(div)
  24. }
  25. )
  26. }
  27. // feature: { id: 'File:xxx.jpg', type: 'wikimedia|url', url: 'https://...' }
  28. function show (img, options, div) {
  29. div.innerHTML = ''
  30. switch (img.type) {
  31. case 'wikimedia':
  32. showWikimediaImage(img, div)
  33. break
  34. case 'url':
  35. showImage(img, div)
  36. break
  37. default:
  38. }
  39. }
  40. register_hook('show-details', function (data, category, dom, callback) {
  41. var div = document.createElement('div')
  42. div.className = 'images loading'
  43. var imageWrapper
  44. var nextImageWrapper = document.createElement('div')
  45. dom.appendChild(div)
  46. if (showTimer) {
  47. window.clearInterval(showTimer)
  48. }
  49. var l = document.createElement('div')
  50. l.innerHTML = '<i class="fa fa-spinner fa-pulse fa-fw"></i><span class="sr-only">Loading...</span>'
  51. l.className = 'loadingIndicator'
  52. div.appendChild(l)
  53. var currentLoader = new ImageLoader(data)
  54. data.detailsImageCounter = {}
  55. currentLoader.next({
  56. counter: data.detailsImageCounter,
  57. wrap: true
  58. },function (err, img) {
  59. div.classList.remove('loading')
  60. if (!img) {
  61. return callback(err)
  62. }
  63. var h = document.createElement('h3')
  64. h.appendChild(document.createTextNode(lang('images')))
  65. div.insertBefore(h, div.firstChild)
  66. imageWrapper = document.createElement('div')
  67. imageWrapper.className = 'imageWrapper'
  68. div.appendChild(imageWrapper)
  69. showTimer = window.setInterval(showNext, 5000)
  70. show(img, {}, imageWrapper)
  71. loadNext()
  72. })
  73. function loadNext () {
  74. currentLoader.next({
  75. counter: data.detailsImageCounter,
  76. wrap: true
  77. }, function (err, img) {
  78. if (err) {
  79. return console.log("Can't load next image", err)
  80. }
  81. show(img, {}, nextImageWrapper)
  82. })
  83. }
  84. function showNext () {
  85. // when nothing was loaded, skip showing
  86. if (nextImageWrapper.firstChild) {
  87. while (imageWrapper.firstChild) {
  88. imageWrapper.removeChild(imageWrapper.firstChild)
  89. }
  90. while (nextImageWrapper.firstChild) {
  91. imageWrapper.appendChild(nextImageWrapper.firstChild)
  92. }
  93. }
  94. loadNext()
  95. }
  96. })
  97. register_hook('hide-details', function () {
  98. if (showTimer) {
  99. window.clearInterval(showTimer)
  100. }
  101. })
  102. register_hook('show-popup', function (data, category, dom, callback) {
  103. var div = document.createElement('div')
  104. div.className = 'images loading'
  105. var imageWrapper
  106. dom.insertBefore(div, dom.firstChild)
  107. var currentLoader = new ImageLoader(data)
  108. data.popupImageCounter = {}
  109. currentLoader.first({
  110. counter: data.popupImageCounter
  111. },function (err, img) {
  112. div.classList.remove('loading')
  113. if (!img) {
  114. return callback(err)
  115. }
  116. imageWrapper = document.createElement('div')
  117. imageWrapper.className = 'imageWrapper'
  118. div.appendChild(imageWrapper)
  119. show(img, {}, imageWrapper)
  120. callback(null)
  121. })
  122. })