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.

322 lines
7.8 KiB

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
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
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
7 years ago
  1. /* globals map:true, overpassFrontend:true, currentPath:true, options:true, baseCategory:true, overpassUrl:true */
  2. var LeafletGeoSearch = require('leaflet-geosearch')
  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. global.map = null
  12. global.baseCategory = null
  13. global.overpassUrl = null
  14. global.overpassFrontend = null
  15. global.currentPath = null
  16. var lastPopupClose = 0
  17. // Optional modules
  18. require('./options')
  19. require('./language')
  20. require('./overpassChooser')
  21. require('./fullscreen')
  22. require('./mapLayers')
  23. require('./twigFunctions')
  24. require('./markers')
  25. require('./categories')
  26. require('./wikipedia')
  27. require('./image')
  28. require('./addCategories')
  29. window.onload = function () {
  30. var initState = config.defaultView
  31. map = L.map('map')
  32. // due to php export, options may be an array -> fix
  33. if (Array.isArray(options)) {
  34. options = {}
  35. }
  36. call_hooks('init')
  37. call_hooks_callback('init_callback', initState, onload2.bind(this, initState))
  38. map.createPane('selected')
  39. map.getPane('selected').style.zIndex = 498
  40. map.createPane('hover')
  41. map.getPane('hover').style.zIndex = 499
  42. }
  43. function onload2 (initState) {
  44. // Add Geo Search
  45. var provider = new LeafletGeoSearch.OpenStreetMapProvider()
  46. var searchControl = new LeafletGeoSearch.GeoSearchControl({
  47. provider: provider,
  48. showMarker: false,
  49. retainZoomLevel: true
  50. })
  51. map.addControl(searchControl)
  52. // Geo location
  53. L.control.locate({
  54. keepCurrentZoomLevel: true,
  55. drawCircle: false,
  56. drawMarker: false,
  57. showPopup: false
  58. }).addTo(map)
  59. // Scale bar
  60. L.control.scale().addTo(map)
  61. if (!overpassUrl) {
  62. overpassUrl = config.overpassUrl
  63. if (Array.isArray(overpassUrl) && overpassUrl.length) {
  64. overpassUrl = overpassUrl[0]
  65. }
  66. }
  67. overpassFrontend = new OverpassFrontend(overpassUrl, {
  68. timeGap: 10,
  69. effortPerRequest: 100
  70. })
  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. OpenStreetBrowserLoader.getCategory('index', function (err, category) {
  84. if (err) {
  85. alert(err)
  86. return
  87. }
  88. baseCategory = category
  89. category.setParentDom(document.getElementById('contentList'))
  90. category.open()
  91. })
  92. map.on('popupopen', function (e) {
  93. if (e.popup.object) {
  94. var url = e.popup.object.layer_id + '/' + e.popup.object.id
  95. if (location.hash.substr(1) !== url && location.hash.substr(1, url.length + 1) !== url + '/') {
  96. currentPath = url
  97. // only push state, when last popup close happened >1sec earlier
  98. state.update(null, Date.now() - lastPopupClose > 1000)
  99. }
  100. OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) {
  101. if (err) {
  102. alert(err)
  103. return
  104. }
  105. category.notifyPopupOpen(e.popup.object, e.popup)
  106. })
  107. }
  108. })
  109. map.on('popupclose', function (e) {
  110. if (e.popup.object) {
  111. OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) {
  112. if (err) {
  113. alert(err)
  114. return
  115. }
  116. category.notifyPopupClose(e.popup.object, e.popup)
  117. })
  118. }
  119. lastPopupClose = Date.now()
  120. currentPath = null
  121. state.update(null, true)
  122. hide()
  123. })
  124. map.on('moveend', function (e) {
  125. state.update()
  126. })
  127. hash(function (loc) {
  128. state.apply(state.parse(loc.substr(1)))
  129. })
  130. state.update()
  131. call_hooks('initFinish')
  132. }
  133. window.setPath = function (path, state) {
  134. currentPath = path
  135. if (!path) {
  136. map.closePopup()
  137. return
  138. }
  139. var param = {
  140. showDetails: !!path.match(/\/details$/),
  141. hasLocation: state.lat && state.lon && state.zoom
  142. }
  143. show(path, param, function (err) {
  144. if (err) {
  145. alert(err)
  146. return
  147. }
  148. call_hooks('show', path, param)
  149. })
  150. }
  151. function show (id, options, callback) {
  152. if (options.showDetails) {
  153. call_hooks('hide-' + document.getElementById('content').className)
  154. document.getElementById('content').className = 'details'
  155. document.getElementById('contentDetails').innerHTML = lang('loading')
  156. }
  157. var m = id.match(/^(.*)\/([nwr]\d+)(\/details)?$/)
  158. if (!m) {
  159. return callback(new Error('unknown request'))
  160. }
  161. var categoryId = m[1]
  162. var featureId = m[2]
  163. OpenStreetBrowserLoader.getCategory(categoryId, function (err, category) {
  164. if (err) {
  165. return callback(new Error('error loading category "' + categoryId + '": ' + err))
  166. }
  167. if (!category.parentDom) {
  168. category.setParentDom(document.getElementById('contentList'))
  169. }
  170. category.show(
  171. featureId,
  172. options,
  173. function (err, data) {
  174. if (err) {
  175. return callback(new Error('error loading object "' + categoryId + '/' + featureId + '": ' + err))
  176. }
  177. if (!map._popup || map._popup !== data.popup) {
  178. data.feature.openPopup()
  179. }
  180. if (options.showDetails) {
  181. showDetails(data, category)
  182. }
  183. callback(err)
  184. }
  185. )
  186. category.open()
  187. })
  188. }
  189. window.showDetails = function (data, category) {
  190. var div, h, dt, dd
  191. var k
  192. var dom = document.getElementById('contentDetails')
  193. dom.innerHTML = ''
  194. div = document.createElement('h1')
  195. div.className = 'title'
  196. div.innerHTML = data.data.title
  197. dom.appendChild(div)
  198. div = document.createElement('div')
  199. div.className = 'description'
  200. div.innerHTML = data.data.description
  201. dom.appendChild(div)
  202. div = document.createElement('div')
  203. div.className = 'body'
  204. div.innerHTML = data.data.body
  205. dom.appendChild(div)
  206. div = document.createElement('div')
  207. div.className = 'body'
  208. dom.appendChild(div)
  209. category.renderTemplate(data, 'detailsBody', function (div, err, result) {
  210. div.innerHTML = result
  211. }.bind(this, div))
  212. call_hooks_callback('show-details', data, category, dom,
  213. function (err) {
  214. if (err.length) {
  215. console.log('show-details produced errors:', err)
  216. }
  217. }
  218. )
  219. h = document.createElement('h3')
  220. h.innerHTML = lang('header:attributes')
  221. dom.appendChild(h)
  222. div = document.createElement('dl')
  223. div.className = 'tags'
  224. for (k in data.object.tags) {
  225. dt = document.createElement('dt')
  226. dt.appendChild(document.createTextNode(k))
  227. div.appendChild(dt)
  228. dd = document.createElement('dd')
  229. dd.appendChild(document.createTextNode(data.object.tags[k]))
  230. div.appendChild(dd)
  231. }
  232. dom.appendChild(div)
  233. h = document.createElement('h3')
  234. h.innerHTML = lang('header:osm_meta')
  235. dom.appendChild(h)
  236. div = document.createElement('dl')
  237. div.className = 'meta'
  238. dt = document.createElement('dt')
  239. dt.appendChild(document.createTextNode('id'))
  240. div.appendChild(dt)
  241. dd = document.createElement('dd')
  242. var a = document.createElement('a')
  243. a.appendChild(document.createTextNode(data.object.type + '/' + data.object.osm_id))
  244. a.href = 'https://openstreetmap.org/' + data.object.type + '/' + data.object.osm_id
  245. a.target = '_blank'
  246. dd.appendChild(a)
  247. div.appendChild(dd)
  248. for (k in data.object.meta) {
  249. dt = document.createElement('dt')
  250. dt.appendChild(document.createTextNode(k))
  251. div.appendChild(dt)
  252. dd = document.createElement('dd')
  253. dd.appendChild(document.createTextNode(data.object.meta[k]))
  254. div.appendChild(dd)
  255. }
  256. dom.appendChild(div)
  257. }
  258. function hide () {
  259. call_hooks('hide-' + document.getElementById('content').className)
  260. document.getElementById('content').className = 'list'
  261. }
  262. window.showRootContent = hide