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.

270 lines
6.9 KiB

6 years ago
7 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. /* globals map:true, overpassFrontend:true, currentPath:true, options:true, baseCategory:true, overpassUrl:true */
  2. const tabs = require('modulekit-tabs')
  3. var OverpassFrontend = require('overpass-frontend')
  4. var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader')
  5. var state = require('./state')
  6. var hash = require('sheet-router/hash')
  7. global.OpenStreetBrowserLoader = OpenStreetBrowserLoader
  8. require('./CategoryIndex')
  9. require('./CategoryOverpass')
  10. require('./category.css')
  11. const mapMetersPerPixel = require('./map-getMetersPerPixel')
  12. global.map = null
  13. global.baseCategory = null
  14. global.overpassUrl = null
  15. global.overpassFrontend = null
  16. global.currentPath = null
  17. global.mainRepo = ''
  18. global.tabs = null
  19. var lastPopupClose = 0
  20. // Optional modules
  21. require('./options')
  22. require('./language')
  23. require('./overpassChooser')
  24. require('./fullscreen')
  25. require('./mapLayers')
  26. require('./twigFunctions')
  27. require('./markers')
  28. require('./categories')
  29. require('./wikipedia')
  30. require('./image')
  31. require('./moreCategories')
  32. require('./addCategories')
  33. require('./permalink')
  34. //require('./leaflet-geo-search')
  35. require('./nominatim-search')
  36. require('./CategoryOverpassFilter')
  37. require('./GeoInfo')
  38. require('./PluginMeasure')
  39. require('./PluginGeoLocate')
  40. require('./tagsDisplay-tag2link')
  41. require('./customCategory')
  42. const ObjectDisplay = require('./ObjectDisplay')
  43. let currentObjectDisplay = null
  44. window.onload = function () {
  45. var initState = config.defaultView
  46. map = L.map('map')
  47. map.getMetersPerPixel = mapMetersPerPixel.bind(map)
  48. map.attributionControl.setPrefix('<a target="_blank" href="https://wiki.openstreetmap.org/wiki/OpenStreetBrowser">OpenStreetBrowser</a>')
  49. // due to php export, options may be an array -> fix
  50. if (Array.isArray(options)) {
  51. options = {}
  52. }
  53. global.tabs = new tabs.Tabs(document.getElementById('globalTabs'))
  54. call_hooks('init')
  55. call_hooks_callback('init_callback', initState, onload2.bind(this, initState))
  56. map.createPane('selected')
  57. map.getPane('selected').style.zIndex = 498
  58. map.createPane('casing')
  59. map.getPane('casing').style.zIndex = 399
  60. }
  61. function onload2 (initState) {
  62. // Scale bar
  63. L.control.scale().addTo(map)
  64. if (!overpassUrl) {
  65. overpassUrl = config.overpassUrl
  66. if (Array.isArray(overpassUrl) && overpassUrl.length) {
  67. overpassUrl = overpassUrl[0]
  68. }
  69. }
  70. overpassFrontend = new OverpassFrontend(overpassUrl, config.overpassOptions)
  71. OpenStreetBrowserLoader.setMap(map)
  72. var newState
  73. if (location.hash && location.hash.length > 1) {
  74. newState = state.parse(location.hash.substr(1))
  75. } else {
  76. newState = initState
  77. }
  78. // make sure the map has an initial location
  79. if (!('zoom' in newState) && !('lat' in newState) && !('lon' in newState)) {
  80. state.apply(initState)
  81. }
  82. state.apply(newState)
  83. if ('repo' in newState) {
  84. global.mainRepo = newState.repo
  85. }
  86. loadBaseCategory()
  87. map.on('popupopen', function (e) {
  88. if (e.popup.object) {
  89. var url = e.popup.object.layer_id + '/' + (e.popup.object.sublayer_id === 'main' ? '' : e.popup.object.sublayer_id + ':') + e.popup.object.id
  90. if (location.hash.substr(1) !== url && location.hash.substr(1, url.length + 1) !== url + '/') {
  91. currentPath = url
  92. // only push state, when last popup close happened >1sec earlier
  93. state.update(null, Date.now() - lastPopupClose > 1000)
  94. }
  95. OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) {
  96. if (err) {
  97. alert(err)
  98. return
  99. }
  100. category.notifyPopupOpen(e.popup.object, e.popup)
  101. })
  102. }
  103. })
  104. map.on('popupclose', function (e) {
  105. if (e.popup.object) {
  106. OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) {
  107. if (err) {
  108. alert(err)
  109. return
  110. }
  111. category.notifyPopupClose(e.popup.object, e.popup)
  112. })
  113. }
  114. lastPopupClose = Date.now()
  115. currentPath = null
  116. state.update(null, true)
  117. hide()
  118. })
  119. map.on('moveend', function (e) {
  120. state.update()
  121. })
  122. hash(function (loc) {
  123. state.apply(state.parse(loc.substr(1)))
  124. })
  125. state.update()
  126. call_hooks('initFinish')
  127. }
  128. function loadBaseCategory () {
  129. let repo = global.mainRepo + (global.mainRepo === '' ? '' : '/')
  130. OpenStreetBrowserLoader.getCategory(repo + 'index', function (err, category) {
  131. if (err) {
  132. alert(err)
  133. return
  134. }
  135. baseCategory = category
  136. category.setParentDom(document.getElementById('contentListBaseCategory'))
  137. category.open()
  138. category.dom.classList.add('baseCategory')
  139. })
  140. }
  141. global.allMapFeatures = function (callback) {
  142. global.baseCategory.allMapFeatures(callback)
  143. }
  144. window.setPath = function (path, state) {
  145. currentPath = path
  146. if ('repo' in state && state.repo !== global.mainRepo && baseCategory) {
  147. baseCategory.remove()
  148. global.mainRepo = state.repo
  149. loadBaseCategory()
  150. }
  151. if (!path) {
  152. map.closePopup()
  153. return
  154. }
  155. var param = {
  156. showDetails: !!path.match(/\/details$/),
  157. hasLocation: 'lat' in state && 'lon' in state && 'zoom' in state
  158. }
  159. show(path, param, function (err) {
  160. if (err) {
  161. alert(err)
  162. return
  163. }
  164. call_hooks('show', path, param)
  165. })
  166. }
  167. function show (id, options, callback) {
  168. if (options.showDetails) {
  169. call_hooks('hide-' + document.getElementById('content').className)
  170. document.getElementById('content').className = 'details'
  171. document.getElementById('contentDetails').innerHTML = lang('loading')
  172. }
  173. var m = id.match(/^(.*)\/((?:[\w\d-]+:)?[nwr]\d+)(\/details)?$/)
  174. if (!m) {
  175. return callback(new Error('unknown request'))
  176. }
  177. var categoryId = m[1]
  178. var featureId = m[2]
  179. OpenStreetBrowserLoader.getCategory(categoryId, function (err, category) {
  180. if (err) {
  181. return callback(new Error('error loading category "' + categoryId + '": ' + err))
  182. }
  183. if (!category.parentDom) {
  184. category.setParentDom(document.getElementById('contentListAddCategories'))
  185. }
  186. category.show(
  187. featureId,
  188. options,
  189. function (err, data) {
  190. if (err) {
  191. return callback(new Error('error loading object "' + categoryId + '/' + featureId + '": ' + err))
  192. }
  193. if (!map._popup || map._popup !== data.popup) {
  194. data.feature.openPopup()
  195. }
  196. if (options.showDetails) {
  197. currentObjectDisplay = new ObjectDisplay({
  198. feature: data,
  199. dom: document.getElementById('contentDetails'),
  200. category,
  201. displayId: 'details',
  202. fallbackIds: ['popup']
  203. }, err => callback(err))
  204. } else {
  205. callback(err)
  206. }
  207. }
  208. )
  209. category.open()
  210. })
  211. }
  212. function hide () {
  213. if (currentObjectDisplay) {
  214. currentObjectDisplay.close()
  215. currentObjectDisplay = null
  216. }
  217. call_hooks('hide-' + document.getElementById('content').className)
  218. document.getElementById('content').className = 'list'
  219. }
  220. window.showRootContent = hide