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.

307 lines
7.4 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. 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. }
  39. function onload2 (initState) {
  40. // Add Geo Search
  41. var provider = new LeafletGeoSearch.OpenStreetMapProvider()
  42. var searchControl = new LeafletGeoSearch.GeoSearchControl({
  43. provider: provider,
  44. showMarker: false,
  45. retainZoomLevel: true
  46. })
  47. map.addControl(searchControl)
  48. // Geo location
  49. L.control.locate({
  50. keepCurrentZoomLevel: true,
  51. drawCircle: false,
  52. drawMarker: false,
  53. showPopup: false
  54. }).addTo(map)
  55. // Scale bar
  56. L.control.scale().addTo(map)
  57. if (!overpassUrl) {
  58. overpassUrl = config.overpassUrl
  59. if (Array.isArray(overpassUrl) && overpassUrl.length) {
  60. overpassUrl = overpassUrl[0]
  61. }
  62. }
  63. overpassFrontend = new OverpassFrontend(overpassUrl, {
  64. timeGap: 10,
  65. effortPerRequest: 100
  66. })
  67. OpenStreetBrowserLoader.setMap(map)
  68. var newState
  69. if (location.hash && location.hash.length > 1) {
  70. newState = state.parse(location.hash.substr(1))
  71. } else {
  72. newState = initState
  73. }
  74. // make sure the map has an initial location
  75. if (!('zoom' in newState) && !('lat' in newState) && !('lon' in newState)) {
  76. newState.zoom = initState.zoom
  77. newState.lat = initState.lat
  78. newState.lon = initState.lon
  79. }
  80. state.apply(newState)
  81. OpenStreetBrowserLoader.getCategory('index', function (err, category) {
  82. if (err) {
  83. alert(err)
  84. return
  85. }
  86. baseCategory = category
  87. category.setParentDom(document.getElementById('contentList'))
  88. category.open()
  89. })
  90. map.on('popupopen', function (e) {
  91. if (e.popup.object) {
  92. var url = e.popup.object.layer_id + '/' + e.popup.object.id
  93. if (location.hash.substr(1) !== url && location.hash.substr(1, url.length + 1) !== url + '/') {
  94. currentPath = url
  95. // only push state, when last popup close happened >1sec earlier
  96. state.update(null, Date.now() - lastPopupClose > 1000)
  97. }
  98. OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) {
  99. if (err) {
  100. alert(err)
  101. return
  102. }
  103. category.notifyPopupOpen(e.popup.object, e.popup)
  104. })
  105. }
  106. })
  107. map.on('popupclose', function (e) {
  108. lastPopupClose = Date.now()
  109. currentPath = null
  110. state.update(null, true)
  111. hide()
  112. })
  113. map.on('moveend', function (e) {
  114. state.update()
  115. })
  116. hash(function (loc) {
  117. state.apply(state.parse(loc.substr(1)))
  118. })
  119. state.update()
  120. }
  121. window.setPath = function (path) {
  122. currentPath = path
  123. if (!path) {
  124. map.closePopup()
  125. return
  126. }
  127. var param = {
  128. showDetails: !!path.match(/\/details$/)
  129. }
  130. show(path, param, function (err) {
  131. if (err) {
  132. alert(err)
  133. return
  134. }
  135. call_hooks('show', path, param)
  136. })
  137. }
  138. function show (id, options, callback) {
  139. if (options.showDetails) {
  140. call_hooks('hide-' + document.getElementById('content').className)
  141. document.getElementById('content').className = 'details'
  142. document.getElementById('contentDetails').innerHTML = 'Loading ...'
  143. }
  144. var m = id.match(/^(.*)\/([nwr]\d+)(\/details)?$/)
  145. if (!m) {
  146. return callback(new Error('unknown request'))
  147. }
  148. var categoryId = m[1]
  149. var featureId = m[2]
  150. OpenStreetBrowserLoader.getCategory(categoryId, function (err, category) {
  151. if (err) {
  152. return callback(new Error('error loading category "' + categoryId + '": ' + err))
  153. }
  154. if (!category.parentDom) {
  155. category.setParentDom(document.getElementById('contentList'))
  156. }
  157. category.show(
  158. featureId,
  159. {
  160. },
  161. function (err, data) {
  162. if (err) {
  163. return callback(new Error('error loading object "' + categoryId + '/' + featureId + '": ' + err))
  164. }
  165. if (!map._popup || map._popup !== data.popup) {
  166. data.feature.openPopup()
  167. }
  168. if (options.showDetails) {
  169. showDetails(data, category)
  170. }
  171. callback(err)
  172. }
  173. )
  174. category.open()
  175. })
  176. }
  177. window.showDetails = function (data, category) {
  178. var div, h, dt, dd
  179. var k
  180. var dom = document.getElementById('contentDetails')
  181. dom.innerHTML = ''
  182. div = document.createElement('h1')
  183. div.className = 'title'
  184. div.innerHTML = data.data.title
  185. dom.appendChild(div)
  186. div = document.createElement('div')
  187. div.className = 'description'
  188. div.innerHTML = data.data.description
  189. dom.appendChild(div)
  190. div = document.createElement('div')
  191. div.className = 'body'
  192. div.innerHTML = data.data.body
  193. dom.appendChild(div)
  194. div = document.createElement('div')
  195. div.className = 'body'
  196. dom.appendChild(div)
  197. category.renderTemplate(data, 'detailsBody', function (div, err, result) {
  198. div.innerHTML = result
  199. }.bind(this, div))
  200. call_hooks_callback('show-details', data, category, dom,
  201. function (err) {
  202. if (err.length) {
  203. console.log('show-details produced errors:', err)
  204. }
  205. }
  206. )
  207. h = document.createElement('h3')
  208. h.innerHTML = 'Attributes'
  209. dom.appendChild(h)
  210. div = document.createElement('dl')
  211. div.className = 'tags'
  212. for (k in data.object.tags) {
  213. dt = document.createElement('dt')
  214. dt.appendChild(document.createTextNode(k))
  215. div.appendChild(dt)
  216. dd = document.createElement('dd')
  217. dd.appendChild(document.createTextNode(data.object.tags[k]))
  218. div.appendChild(dd)
  219. }
  220. dom.appendChild(div)
  221. h = document.createElement('h3')
  222. h.innerHTML = 'OSM Meta'
  223. dom.appendChild(h)
  224. div = document.createElement('dl')
  225. div.className = 'meta'
  226. dt = document.createElement('dt')
  227. dt.appendChild(document.createTextNode('id'))
  228. div.appendChild(dt)
  229. dd = document.createElement('dd')
  230. var a = document.createElement('a')
  231. a.appendChild(document.createTextNode(data.object.type + '/' + data.object.osm_id))
  232. a.href = 'https://openstreetmap.org/' + data.object.type + '/' + data.object.osm_id
  233. a.target = '_blank'
  234. dd.appendChild(a)
  235. div.appendChild(dd)
  236. for (k in data.object.meta) {
  237. dt = document.createElement('dt')
  238. dt.appendChild(document.createTextNode(k))
  239. div.appendChild(dt)
  240. dd = document.createElement('dd')
  241. dd.appendChild(document.createTextNode(data.object.meta[k]))
  242. div.appendChild(dd)
  243. }
  244. dom.appendChild(div)
  245. }
  246. function hide () {
  247. call_hooks('hide-' + document.getElementById('content').className)
  248. document.getElementById('content').className = 'list'
  249. }
  250. window.showRootContent = hide