diff --git a/package.json b/package.json index 902b04e3..06ec81a9 100644 --- a/package.json +++ b/package.json @@ -33,5 +33,8 @@ "browserify": "^14.4.0", "standard": "^10.0.2", "watchify": "^3.9.0" + }, + "standard": { + "global": [ "lang", "ui_lang", "config", "options", "alert", "L", "register_hook", "call_hooks", "call_hooks_callback", "XMLHttpRequest", "map", "overpassFrontend", "location", "baseCategory", "currentPath", "overpassUrl" ] } } diff --git a/src/CategoryBase.js b/src/CategoryBase.js index 84ff44a3..e942d0d8 100644 --- a/src/CategoryBase.js +++ b/src/CategoryBase.js @@ -1,3 +1,4 @@ +/* global lang, ui_lang, options, alert */ var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader') function CategoryBase (id, data) { @@ -9,6 +10,7 @@ function CategoryBase (id, data) { this.dom = document.createElement('div') this.dom.className = 'category category-' + data.type var name + var a if (this.id !== 'index') { var domHeader = document.createElement('header') @@ -26,14 +28,14 @@ function CategoryBase (id, data) { name = lang('category:' + this.id) } - var a = document.createElement('a') + a = document.createElement('a') a.appendChild(document.createTextNode(name)) a.href = '#' a.onclick = this.toggle.bind(this) domHeader.appendChild(a) if (options.debug) { - var a = document.createElement('a') + a = document.createElement('a') a.appendChild(document.createTextNode('⟳')) a.title = lang('reload') a.className = 'reload' @@ -84,8 +86,9 @@ CategoryBase.prototype.setParentDom = function (parentDom) { } CategoryBase.prototype.open = function () { - if (this.isOpen) + if (this.isOpen) { return + } if (this.parentCategory) { this.parentCategory.open() @@ -105,8 +108,9 @@ CategoryBase.prototype.open = function () { } CategoryBase.prototype.close = function () { - if (!this.isOpen) + if (!this.isOpen) { return + } this.dom.classList.remove('open') @@ -153,7 +157,6 @@ CategoryBase.prototype.recalc = function () { } CategoryBase.prototype.notifyChildLoadStart = function (category) { - console.log(this.id, this.childrenLoadingCount) if (this.childrenLoadingCount === 0 && this.parentCategory) { this.parentCategory.notifyChildLoadStart(this) } else { @@ -163,7 +166,6 @@ CategoryBase.prototype.notifyChildLoadStart = function (category) { } CategoryBase.prototype.notifyChildLoadEnd = function (category) { - console.log(this.id, this.childrenLoadingCount) this.childrenLoadingCount-- if (this.childrenLoadingCount === 0 && this.parentCategory) { this.parentCategory.notifyChildLoadEnd(this) diff --git a/src/CategoryIndex.js b/src/CategoryIndex.js index ec7a0364..47f7d712 100644 --- a/src/CategoryIndex.js +++ b/src/CategoryIndex.js @@ -1,3 +1,4 @@ +/* global alert */ var async = require('async') var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader') var CategoryBase = require('./CategoryBase') @@ -10,20 +11,22 @@ function CategoryIndex (id, data) { this.childrenDoms = {} this.childrenCategories = null - this._loadChildrenCategories(function (err) { + if (err) { + console.log('error loading child categories:', err) + } }) } CategoryIndex.prototype.open = function () { - if (this.isOpen) + if (this.isOpen) { return + } CategoryBase.prototype.open.call(this) if (this.childrenCategories !== null) { this.isOpen = true - return } } @@ -75,8 +78,9 @@ CategoryIndex.prototype._loadChildCategory = function (callback, err, category) } CategoryIndex.prototype.close = function () { - if (!this.isOpen) + if (!this.isOpen) { return + } CategoryBase.prototype.close.call(this) diff --git a/src/CategoryOverpass.js b/src/CategoryOverpass.js index 2d584057..1c1ffa39 100644 --- a/src/CategoryOverpass.js +++ b/src/CategoryOverpass.js @@ -6,7 +6,7 @@ var state = require('./state') var defaultValues = { feature: { title: "{{ localizedTag(tags, 'name') |default(localizedTag(tags, 'operator')) | default(localizedTag(tags, 'ref')) | default(trans('unnamed')) }}", - markerSign: "", + markerSign: '', 'style:hover': { color: 'black', weight: 3, @@ -23,6 +23,8 @@ var defaultValues = { CategoryOverpass.prototype = Object.create(CategoryBase.prototype) CategoryOverpass.prototype.constructor = CategoryOverpass function CategoryOverpass (id, data) { + var p + CategoryBase.call(this, id, data) data.id = this.id @@ -94,12 +96,12 @@ function CategoryOverpass (id, data) { this.updatePopupContent(ob, ob.popup) }.bind(this) - var p = document.createElement('div') + p = document.createElement('div') p.className = 'loadingIndicator' p.innerHTML = 'Loading...' this.dom.appendChild(p) - var p = document.createElement('div') + p = document.createElement('div') p.className = 'loadingIndicator2' p.innerHTML = '
' this.dom.appendChild(p) @@ -170,8 +172,9 @@ CategoryOverpass.prototype.updateStatus = function () { } CategoryOverpass.prototype.open = function () { - if (this.isOpen) + if (this.isOpen) { return + } CategoryBase.prototype.open.call(this) @@ -191,8 +194,9 @@ CategoryOverpass.prototype.recalc = function () { } CategoryOverpass.prototype.close = function () { - if (!this.isOpen) + if (!this.isOpen) { return + } CategoryBase.prototype.close.call(this) @@ -220,7 +224,6 @@ CategoryOverpass.prototype.updatePopupContent = function (object, popup) { div.className = 'description' div.innerHTML = object.data.popupDescription || object.data.description popup._contentNode.insertBefore(div, popup._contentNode.firstChild.nextSibling) - } if (this.popupBodyTemplate) { @@ -242,7 +245,7 @@ CategoryOverpass.prototype.updatePopupContent = function (object, popup) { CategoryOverpass.prototype.renderTemplate = function (object, templateId, callback) { OpenStreetBrowserLoader.getTemplate(templateId, function (err, template) { if (err) { - err = "can't load " + templateId + ": " + err + err = "can't load " + templateId + ': ' + err return callback(err, null) } diff --git a/src/OpenStreetBrowserLoader.js b/src/OpenStreetBrowserLoader.js index 894dd686..25f87224 100644 --- a/src/OpenStreetBrowserLoader.js +++ b/src/OpenStreetBrowserLoader.js @@ -47,10 +47,9 @@ OpenStreetBrowserLoader.prototype.getCategory = function (id, callback) { } var req = new XMLHttpRequest() - req.addEventListener("load", reqListener.bind(this, req)) - req.open("GET", config.categoriesDir + '/' + id + ".json?" + config.categoriesRev) + req.addEventListener('load', reqListener.bind(this, req)) + req.open('GET', config.categoriesDir + '/' + id + '.json?' + config.categoriesRev) req.send() - } OpenStreetBrowserLoader.prototype.getTemplate = function (id, callback) { @@ -71,33 +70,32 @@ OpenStreetBrowserLoader.prototype.getTemplate = function (id, callback) { } var req = new XMLHttpRequest() - req.addEventListener("load", reqListener.bind(this, req)) - req.open("GET", config.categoriesDir + '/' + id + ".html?" + config.categoriesRev) + req.addEventListener('load', reqListener.bind(this, req)) + req.open('GET', config.categoriesDir + '/' + id + '.html?' + config.categoriesRev) req.send() - } OpenStreetBrowserLoader.prototype.getCategoryFromData = function (id, data, callback) { if (!data.type) { - callback('no type defined', null) - return - } else if (!(data.type in this.types)) { - callback('unknown type', null) - return - } else { - var layer = new this.types[data.type](id, data) + return callback(new Error('no type defined'), null) + } - layer.setMap(this.map) + if (!(data.type in this.types)) { + return callback(new Error('unknown type'), null) + } - this.categories[id] = layer + var layer = new this.types[data.type](id, data) - if ('load' in layer) { - layer.load(function (err) { - callback(err, layer) - }) - } else { - callback(null, layer) - } + layer.setMap(this.map) + + this.categories[id] = layer + + if ('load' in layer) { + layer.load(function (err) { + callback(err, layer) + }) + } else { + callback(null, layer) } } diff --git a/src/categories.js b/src/categories.js index bf5e7f24..445c084d 100644 --- a/src/categories.js +++ b/src/categories.js @@ -9,7 +9,7 @@ register_hook('state-apply', function (state) { list.forEach(function (id) { OpenStreetBrowserLoader.getCategory(id, function (err, category) { if (err) { - console.log("Can't load category " + id + ": ", err) + console.log("Can't load category " + id + ': ', err) return } @@ -22,4 +22,4 @@ register_hook('state-apply', function (state) { } }) }) -}.bind(this)) +}) diff --git a/src/fullscreen.js b/src/fullscreen.js index 374e3888..e44bc5e5 100644 --- a/src/fullscreen.js +++ b/src/fullscreen.js @@ -1,7 +1,7 @@ -var fullscreenControl = L.Control.extend({ +var FullscreenControl = L.Control.extend({ options: { - position: 'topleft' - //control position - allowed: 'topleft', 'topright', 'bottomleft', 'bottomright' + position: 'topleft' + // control position - allowed: 'topleft', 'topright', 'bottomleft', 'bottomright' }, onAdd: function (map) { var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control-fullscreen') @@ -19,7 +19,7 @@ var fullscreenControl = L.Control.extend({ }) register_hook('init', function (callback) { - map.addControl(new fullscreenControl()) + map.addControl(new FullscreenControl()) }) register_hook('show', function (url, options) { diff --git a/src/index.js b/src/index.js index 4e9fcba7..5244c8ec 100644 --- a/src/index.js +++ b/src/index.js @@ -1,22 +1,21 @@ +/* globals map:true, overpassFrontend:true, currentPath:true, options:true, baseCategory:true, overpassUrl:true */ + var LeafletGeoSearch = require('leaflet-geosearch') -var OverpassLayer = require('overpass-layer') -var OverpassLayerList = require('overpass-layer').List var OverpassFrontend = require('overpass-frontend') var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader') var state = require('./state') var hash = require('sheet-router/hash') -var queryString = require('query-string') -window.OpenStreetBrowserLoader = OpenStreetBrowserLoader +global.OpenStreetBrowserLoader = OpenStreetBrowserLoader require('./CategoryIndex') require('./CategoryOverpass') -global.map -window.baseCategory -window.overpassUrl -window.overpassFrontend -window.currentPath = null +global.map = null +global.baseCategory = null +global.overpassUrl = null +global.overpassFrontend = null +global.currentPath = null var lastPopupClose = 0 // Optional modules @@ -29,7 +28,7 @@ require('./mapLayers') require('./twigFunctions') require('./categories') -window.onload = function() { +window.onload = function () { var initState = {} map = L.map('map') @@ -54,9 +53,9 @@ function onload2 (initState) { drawCircle: false, drawMarker: false, showPopup: false - }).addTo(map); + }).addTo(map) - if (typeof overpassUrl === 'undefined') { + if (!overpassUrl) { overpassUrl = config.overpassUrl if (Array.isArray(overpassUrl) && overpassUrl.length) { overpassUrl = overpassUrl[0] @@ -98,17 +97,19 @@ function onload2 (initState) { map.on('popupopen', function (e) { if (e.popup.object) { var url = e.popup.object.layer_id + '/' + e.popup.object.id - if (location.hash.substr(1) !== url && location.hash.substr(1, url.length + 1) !== url + '/' ) { - + if (location.hash.substr(1) !== url && location.hash.substr(1, url.length + 1) !== url + '/') { currentPath = url // only push state, when last popup close happened >1sec earlier state.update(null, Date.now() - lastPopupClose > 1000) - } OpenStreetBrowserLoader.getCategory(e.popup.object.layer_id, function (err, category) { - category.notifyPopupOpen(e.popup.object, e.popup) + if (err) { + alert(err) + return + } + category.notifyPopupOpen(e.popup.object, e.popup) }) } }) @@ -160,12 +161,12 @@ function show (id, options, callback) { id = id.split('/') if (id.length < 2) { - return callback('unknown request') + return callback(new Error('unknown request')) } OpenStreetBrowserLoader.getCategory(id[0], function (err, category) { if (err) { - return callback('error loading category "' + id[0] + '": ' + err) + return callback(new Error('error loading category "' + id[0] + '": ' + err)) } if (!category.parentDom) { @@ -178,7 +179,7 @@ function show (id, options, callback) { }, function (err, data) { if (err) { - return callback('error loading object "' + id[0] + '/' + id[1] +'": ' + err) + return callback(new Error('error loading object "' + id[0] + '/' + id[1] + '": ' + err)) } if (!map._popup || map._popup !== data.popup) { @@ -198,58 +199,61 @@ function show (id, options, callback) { } function showDetails (data, category) { + var div, h, dt, dd + var k var dom = document.getElementById('contentDetails') dom.innerHTML = '' - var div = document.createElement('h1') + div = document.createElement('h1') div.className = 'title' div.innerHTML = data.data.title dom.appendChild(div) - var div = document.createElement('div') + div = document.createElement('div') div.className = 'description' div.innerHTML = data.data.description dom.appendChild(div) - var div = document.createElement('div') + div = document.createElement('div') div.className = 'body' div.innerHTML = data.data.body dom.appendChild(div) - var div = document.createElement('div') + div = document.createElement('div') div.className = 'body' dom.appendChild(div) category.renderTemplate(data, 'detailsBody', function (div, err, result) { div.innerHTML = result }.bind(this, div)) - var h = document.createElement('h3') + h = document.createElement('h3') h.innerHTML = 'Attributes' dom.appendChild(h) - var div = document.createElement('dl') + div = document.createElement('dl') div.className = 'tags' - for (var k in data.object.tags) { - var dt = document.createElement('dt') + for (k in data.object.tags) { + dt = document.createElement('dt') dt.appendChild(document.createTextNode(k)) div.appendChild(dt) - var dd = document.createElement('dd') + + dd = document.createElement('dd') dd.appendChild(document.createTextNode(data.object.tags[k])) div.appendChild(dd) } dom.appendChild(div) - var h = document.createElement('h3') + h = document.createElement('h3') h.innerHTML = 'OSM Meta' dom.appendChild(h) - var div = document.createElement('dl') + div = document.createElement('dl') div.className = 'meta' - var dt = document.createElement('dt') + dt = document.createElement('dt') dt.appendChild(document.createTextNode('id')) div.appendChild(dt) - var dd = document.createElement('dd') + dd = document.createElement('dd') var a = document.createElement('a') a.appendChild(document.createTextNode(data.object.type + '/' + data.object.osm_id)) a.href = 'https://openstreetmap.org/' + data.object.type + '/' + data.object.osm_id @@ -257,11 +261,12 @@ function showDetails (data, category) { dd.appendChild(a) div.appendChild(dd) - for (var k in data.object.meta) { - var dt = document.createElement('dt') + for (k in data.object.meta) { + dt = document.createElement('dt') dt.appendChild(document.createTextNode(k)) div.appendChild(dt) - var dd = document.createElement('dd') + + dd = document.createElement('dd') dd.appendChild(document.createTextNode(data.object.meta[k])) div.appendChild(dd) } diff --git a/src/ip-location.js b/src/ip-location.js index 599c46a7..6d098e5f 100644 --- a/src/ip-location.js +++ b/src/ip-location.js @@ -4,7 +4,7 @@ ipLocation.httpGet = function (url, callback) { var xhr = new XMLHttpRequest() xhr.open('get', url, true) xhr.responseType = 'text' - xhr.onreadystatechange = function() { + xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(null, { body: xhr.responseText }) diff --git a/src/language.js b/src/language.js index 08a7470c..06383eb6 100644 --- a/src/language.js +++ b/src/language.js @@ -1,7 +1,8 @@ +/* global languages:false, lang_str:false */ var tagTranslations = require('./tagTranslations') function getPreferredDataLanguage () { - var m = (navigator.language || navigator.userLanguage).match(/^([^\-]+)(\-.*|)$/) + var m = (navigator.language || navigator.userLanguage).match(/^([^-]+)(-.*|)$/) if (m) { return m[1].toLocaleLowerCase() } else { @@ -14,18 +15,19 @@ function getAcceptLanguages () { } function getUiLanguages () { + var i, code var ret = {} var acceptLanguages = getAcceptLanguages() - for (var i = 0; i < acceptLanguages.length; i++) { - var code = acceptLanguages[i] + for (i = 0; i < acceptLanguages.length; i++) { + code = acceptLanguages[i] if (languages.indexOf(code) !== -1) { ret[code] = langName(code) } } - for (var i = 0; i < languages.length; i++) { - var code = languages[i] + for (i = 0; i < languages.length; i++) { + code = languages[i] if (!(code in ret)) { ret[code] = langName(code) } @@ -35,18 +37,19 @@ function getUiLanguages () { } function getDataLanguages () { + var code var ret = {} var acceptLanguages = getAcceptLanguages() for (var i = 0; i < acceptLanguages.length; i++) { - var code = acceptLanguages[i] + code = acceptLanguages[i] ret[code] = langName(code) } for (var k in lang_str) { - var m - if (m = k.match(/^lang:(.*)$/)) { - var code = m[1] + var m = k.match(/^lang:(.*)$/) + if (m) { + code = m[1] if (code === 'current') { continue } diff --git a/src/location.js b/src/location.js index bc8cf90f..9fad968f 100644 --- a/src/location.js +++ b/src/location.js @@ -8,12 +8,10 @@ register_hook('init_callback', function (initState, callback) { } ipLocation('', function (err, ipLoc) { - var ret - if (typeof ipLoc === 'object' && 'latitude' in ipLoc) { initState.map = '14/' + ipLoc.latitude + '/' + ipLoc.longitude } - callback() + callback(err) }) }) diff --git a/src/mapLayers.js b/src/mapLayers.js index 7e80b6e8..65456a22 100644 --- a/src/mapLayers.js +++ b/src/mapLayers.js @@ -3,13 +3,13 @@ var currentMapLayer = null register_hook('init', function () { if (!config.baseMaps) { - var osm_mapnik = L.tileLayer('//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + var osmMapnik = L.tileLayer('//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: config.maxZoom || 19, attribution: '© OpenStreetMap' } ) - osm_mapnik.addTo(map) + osmMapnik.addTo(map) return } diff --git a/src/options.js b/src/options.js index 2c41c080..8a760646 100644 --- a/src/options.js +++ b/src/options.js @@ -1,3 +1,4 @@ +/* globals form, ajax, options:true, showRootContent */ var moduleOptions = {} register_hook('init', function () { @@ -26,18 +27,18 @@ moduleOptions.open = function () { call_hooks('options_form', def) - var options_form = new form('options', def) + var optionsForm = new form('options', def) document.getElementById('content').className = 'options' var dom = document.getElementById('contentOptions') dom.innerHTML = '' - options_form.set_data(options) + optionsForm.set_data(options) var f = document.createElement('form') - f.onsubmit = moduleOptions.submit.bind(this, options_form) + f.onsubmit = moduleOptions.submit.bind(this, optionsForm) dom.appendChild(f) - options_form.show(f) + optionsForm.show(f) var input = document.createElement('button') input.innerHTML = lang('save') @@ -46,12 +47,12 @@ moduleOptions.open = function () { return false } -moduleOptions.submit = function (options_form) { - var data = options_form.get_data() +moduleOptions.submit = function (optionsForm) { + var data = optionsForm.get_data() var reload = false for (var k in data) { - if (options_form.def[k].reloadOnChange && options[k] != data[k]) { + if (optionsForm.def[k].reloadOnChange && options[k] !== data[k]) { reload = true } } diff --git a/src/overpassChooser.js b/src/overpassChooser.js index 0e4a811d..7c1cfe87 100644 --- a/src/overpassChooser.js +++ b/src/overpassChooser.js @@ -1,3 +1,5 @@ +/* globals overpassUrl:true */ + register_hook('init', function () { if (options.overpassUrl) { overpassUrl = options.overpassUrl diff --git a/src/state.js b/src/state.js index 0913dc00..48858c7a 100644 --- a/src/state.js +++ b/src/state.js @@ -1,3 +1,5 @@ +/* globals setPath, history */ + var queryString = require('query-string') function get () { @@ -63,11 +65,12 @@ function stringify (state) { var locPrecision = 5 if (state.zoom) { locPrecision = - state.zoom > 16 ? 5 : - state.zoom > 8 ? 4 : - state.zoom > 4 ? 3 : - state.zoom > 2 ? 2 : - state.zoom > 1 ? 1 : 0 + state.zoom > 16 ? 5 + : state.zoom > 8 ? 4 + : state.zoom > 4 ? 3 + : state.zoom > 2 ? 2 + : state.zoom > 1 ? 1 + : 0 } if (state.zoom && state.lat && state.lon) { @@ -110,7 +113,7 @@ function parse (link) { newPath = link.substr(0, firstAmp) } } else { - if (firstAmp === -1) { + if (firstAmp === -1) { urlNonPathPart = link } else if (firstAmp < firstEquals) { newPath = link.substr(0, firstAmp) @@ -145,13 +148,8 @@ function update (state, push) { if (push) { history.pushState(null, null, newHash) - console.log('push', newHash, state) } else if (location.hash !== newHash && (location.hash !== '' || newHash !== '#')) { - history.replaceState(null, null, newHash) - console.log('replace', newHash, state) - } else { - console.log('ignore', newHash, state) } } diff --git a/src/tagTranslations.js b/src/tagTranslations.js index 16c97666..39f08578 100644 --- a/src/tagTranslations.js +++ b/src/tagTranslations.js @@ -1,5 +1,4 @@ var OverpassLayer = require('overpass-layer') -var translations = null var tagLang = null OverpassLayer.twig.extendFunction('keyTrans', function () { @@ -23,12 +22,9 @@ OverpassLayer.twig.extendFunction('trans', function () { }) function tagTranslationsTrans () { - var ret = null - var fallback = null - - tag = arguments[0] - value = undefined - count = undefined + var tag = arguments[0] + var value + var count if (arguments.length > 1) { value = typeof arguments[1] === 'undefined' ? null : arguments[1] } @@ -54,9 +50,9 @@ function tagTranslationsTransList (key, values) { return tagTranslationsTrans(key, value.trim()) }.bind(this, key)) - if (values.length > 1) + if (values.length > 1) { return values.slice(0, -1).join(', ') + ' and ' + values.slice(-1)[0] - + } return values[0] } diff --git a/src/twigFunctions.js b/src/twigFunctions.js index 3f501278..68f84caf 100644 --- a/src/twigFunctions.js +++ b/src/twigFunctions.js @@ -12,18 +12,18 @@ OverpassLayer.twig.extendFunction('tagsPrefix', function (tags, prefix) { } } - if (count == 0) { + if (count === 0) { return null } return ret }) -OverpassLayer.twig.extendFunction('openingHoursState', function (opening_hours) { +OverpassLayer.twig.extendFunction('openingHoursState', function (openingHours) { try { - var oh = new OpeningHours(opening_hours) + var oh = new OpeningHours(openingHours) } catch (err) { - console.log("Error in opening_hours: " + err) + console.log('Error in opening_hours: ' + err) return 'unknown' }