diff --git a/source/Ox.UI/js/Map/Map.js b/source/Ox.UI/js/Map/Map.js index 6a1c8022..4797ac8f 100644 --- a/source/Ox.UI/js/Map/Map.js +++ b/source/Ox.UI/js/Map/Map.js @@ -127,12 +127,17 @@ Ox.Map = function(options, self) { place.id = Ox.encodeBase32(Ox.uid()); } }); + if (self.options.selected && !Ox.getObjectById( + self.options.places, self.options.selected + )) { + self.options.selected = ''; + selectPlace(null); + } self.options.places = Ox.api(self.options.places, { geo: true, sort: '-area' }); } - addPlaces(); getMapBounds(function(mapBounds) { if (mapBounds) { self.map.fitBounds(mapBounds); @@ -143,15 +148,8 @@ Ox.Map = function(options, self) { // fixme: the following is just a guess self.boundsChanged = true; mapChanged(); + self.options.selected && selectPlace(self.options.selected); }); - if (self.options.selected) { - if (getSelectedPlace()) { - selectPlace(self.options.selected); - } else { - self.options.selected = ''; - that.triggerEvent('select', null); - } - } }, selected: function() { selectPlace(self.options.selected || null); @@ -188,16 +186,7 @@ Ox.Map = function(options, self) { key_left: function() { pan(-1, 0); }, - // FIXME: - 'key_meta.left': function() { - self.metaKey = true; - $(document).one({ - keyup: function() { - self.metaKey = false; - } - }); - }, - 'key_meta.right': function() { + 'key_meta': function() { self.metaKey = true; $(document).one({ keyup: function() { @@ -277,6 +266,7 @@ Ox.Map = function(options, self) { 'lat', 'lng', 'south', 'west', 'north', 'east', 'area', 'editable' ].concat(self.options.keys); + self.places = [], self.resultPlace = null; self.scaleMeters = [ 50000000, 20000000, 10000000, @@ -543,25 +533,6 @@ Ox.Map = function(options, self) { ); } - function addPlaces() { - Ox.forEach(self.$placeControls, function($placeControl) { - $placeControl.hide(); - }); - self.places && self.places.forEach(function(place) { - place.remove(); - }); - self.places = []; - /* - if (!self.isAsync) { - self.options.places.forEach(function(place) { - self.places.push(new Ox.MapPlace(Ox.extend({ - map: that - }, place))); - }); - } - */ - } - function addPlaceToMap(place) { // via find, click, shift-click, or new place button Ox.Log('Map', 'addPlaceToMap', place) @@ -607,7 +578,7 @@ Ox.Map = function(options, self) { function addPlaceToPlaces(data) { var place = getSelectedPlace(), - country = Ox.getCountryByGeoname(place.geoname); + country = place ? Ox.getCountryByGeoname(place.geoname) : {}; Ox.extend(place, data); self.options.selected = place.id; place.countryCode = country ? country.code : ''; @@ -906,8 +877,6 @@ Ox.Map = function(options, self) { } that.overlayView.draw(); - addPlaces(); - Ox.forEach(self.$controls, function($control) { $control.appendTo(self.$map); }); @@ -971,7 +940,8 @@ Ox.Map = function(options, self) { } function mapChanged() { - // gets called after panning or zooming + // This is the handler that actually adds the places to the map. + // Gets called after panning or zooming, and when the map is idle. if (self.boundsChanged) { var bounds = self.map.getBounds(), southWest = bounds.getSouthWest(), @@ -997,29 +967,34 @@ Ox.Map = function(options, self) { range: [0, self.options.maxMarkers], sort: [{key: 'area', operator: '-'}] }, function(result) { - Ox.Log('Map', 'RESULT', result) - var ids = []; + var ids = self.options.selected ? [self.options.selected] : [], + previousIds = self.places.map(function(place) { + return place.id; + }); + // add new places result.data.items.forEach(function(item, i) { var place = getPlaceById(item.id); if (!place) { - self.places.push( - new Ox.MapPlace(Ox.extend({ - map: that - }, item)).add() - ); + place = new Ox.MapPlace(Ox.extend({ + map: that + }, item)).add(); + self.places.push(place); } else if (!place.visible) { place.add(); } - ids.push(item.id); + item.id != self.options.selected && ids.push(item.id); }); - self.places.forEach(function(place) { - if ( - !place.selected && place.visible - && ids.indexOf(place.id) == -1 - ) { + // remove old places + previousIds.forEach(function(id) { + var place = getPlaceById(id); + if (place && ids.indexOf(id) == -1) { place.remove(); } }); + // update places array + self.places = self.places.filter(function(place) { + return place.visible; + }); }); self.boundsChanged = false; }