'use strict'; pandora.ui.placesDialog = function(options) { // options can be {id: '...'} or {name: '...'} var height = Math.round((window.innerHeight - 48) * 0.9), width = Math.round(window.innerWidth * 0.9), $content = Ox.MapEditor({ addPlace: function(place, callback) { pandora.api.addPlace(place, function(result) { Ox.Request.clearCache(); // fixme: remove callback(result); }); }, editPlace: function(place, callback) { pandora.api.editPlace(place, function(result) { Ox.Request.clearCache(); // fixme: remove callback(result); }); }, getMatches: function(names, callback) { // fixme: the results of this are of course // not identical to actual place matches var conditions = [], keys, operator; if (names.length == 0) { callback(0); } else { keys = pandora.site.layers.filter(function(layer) { return layer.type == 'place' || layer.hasPlaces; }).map(function(layer) { return layer.id; }); keys.forEach(function(key) { operator = Ox.getObjectById( pandora.site.layers, key ).type == 'place' ? '==' : '='; names.forEach(function(name) { conditions.push({key: key, value: name, operator: operator}); }); }); pandora.api.findClips({ query: { conditions: conditions, operator: conditions.length == 1 ? '&' : '|' } }, function(result) { callback(result.data.items); }); } }, hasMatches: true, // FIXME: getMatches is enough height: height - 48, mode: pandora.site.map == 'auto' ? 'add' : 'define', names: pandora.hasPlacesLayer ? function(callback) { pandora.api.getPlaces(function(result) { callback(result.data.items); }); } : null, places: function(data, callback) { data.keys && data.keys.push('matches'); return pandora.api.findPlaces(Ox.extend({ query: {conditions: [], operator: ''} }, data), callback); }, removePlace: function(place, callback) { pandora.api.removePlace(place, function(result) { Ox.Request.clearCache(); // fixme: remove callback(result); }); }, selected: options ? options.id : '', showControls: pandora.user.ui.showMapControls, showLabels: pandora.user.ui.showMapLabels, showTypes: true, width: width }), that = Ox.Dialog({ buttons: [ Ox.Button({ id: 'manageEvents', title: Ox._('Manage Events...') }).bindEvent({ click: function() { that.close(); (pandora.$ui.eventsDialog || ( pandora.$ui.eventsDialog = pandora.ui.eventsDialog() )).open(); } }), {}, Ox.Button({ id: 'exportPlaces', title: Ox._('Export Places...') }).bindEvent({ click: function() { var $button = this, keys = [ 'name', 'alternativeNames', 'geoname', 'lat', 'lng', 'south', 'west', 'north', 'east' ]; $button.options({disabled: true}); pandora.api.findPlaces({ query: {conditions: [], operator: '&'}, keys: keys, range: [0, 1000000], sort: [{key: 'name', operator: '+'}] }, function(result) { pandora.ui.exportDialog({ data: JSON.stringify(result.data.items.map(function(item) { Object.keys(item).filter(function(key) { return !Ox.contains(keys, key); }).forEach(function(key) { delete item[key]; }); return item; }), null, ' '), title: Ox._('Places') }).open(); $button.options({disabled: false}); }); } }), Ox.Button({ id: 'done', title: Ox._('Done'), width: 48 }).bindEvent({ click: function() { that.close(); } }) ], closeButton: true, content: $content, height: height, maximizeButton: true, minHeight: 256, minWidth: 512, //keys: {enter: 'done', escape: 'done'}, padding: 0, title: Ox._('Manage Places'), width: width }) .bindEvent({ resize: function(data) { $content.options({width: width, height: height}); } }); return that; };