mxn.register('openspace', { Geocoder : { init : function() { this.geocoders[this.api] = {}; this.geocoders[this.api].gazetteer = new OpenSpace.Gazetteer(); this.geocoders[this.api].postcodeService = new OpenSpace.Postcode(); }, geocode : function(query, rowlimit) { var me = this; var isPostCode = false; // result var geocode_request_object = {}; if (typeof (query) == 'object') { // query is a LatLonPoint object (reverse // geocode) if (query.hasOwnProperty('lat') && query.hasOwnProperty('lon')) { geocode_request_object.latLng = query.toProprietary(this.api); } else if (query.hasOwnProperty('postcode')) { isPostCode = true; geocode_request_object.address = query.postcode; } // query is an address object else { geocode_request_object.address = query.locality || query.region; // use locality if present or just region } } // query is an address string else { geocode_request_object.address = query; // If the query contains numbers then interpret // it as a postcode perhaps? var matches = query.match(/\d+/g); if (matches !== null) { isPostCode = true; } } // Is Query a postcode search? if (isPostCode) { this.geocoders[this.api].postcodeService.getLonLat(geocode_request_object.address, function(mapPoint) { me.geocode_callback(mapPoint, 1); }); } else { this.geocoders[this.api].gazetteer.getLonLat(geocode_request_object.address, function(results) { me.geocode_callback(results, rowlimit); }); } }, geocode_callback: function(results, rowlimit) { var place; var places = []; if (results.hasOwnProperty('lat')) { //This is a single postcode result place = {}; place.point = new mxn.LatLonPoint(); if (results !== null) { place.point.fromProprietary(this.api, results); places.push(place); } } else { for (i=0; i rowlimit) { places.length = rowlimit; } this.callback(places); } } });