From 7b227fd1c06ff6f3ba078b73348dd02419d44e38 Mon Sep 17 00:00:00 2001
From: Evan Prodromou <evan@status.net>
Date: Wed, 16 Sep 2009 11:46:10 -0400
Subject: [PATCH] start getting locations from remote services

---
 lib/default.php  |  2 ++
 lib/location.php | 54 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/lib/default.php b/lib/default.php
index 30e43eefbd..c896d54084 100644
--- a/lib/default.php
+++ b/lib/default.php
@@ -229,4 +229,6 @@ $default =
         array('contentlimit' => null),
         'http' =>
         array('client' => 'curl'), // XXX: should this be the default?
+        'location' =>
+        array('namespace' => 1), // 1 = geonames, 2 = Yahoo Where on Earth
         );
diff --git a/lib/location.php b/lib/location.php
index cbd03f33a4..f4ce7f67ac 100644
--- a/lib/location.php
+++ b/lib/location.php
@@ -50,11 +50,63 @@ class Location
 
     var $names;
 
-    static function fromName($name, $language=null)
+    const geonames = 1;
+    const whereOnEarth = 2;
+
+    static function fromName($name, $language=null, $location_ns=null)
     {
         if (is_null($language)) {
             $language = common_language();
         }
+        if (is_null($location_ns)) {
+            $location_ns = common_config('location', 'namespace');
+        }
+
+        $location = null;
+
+        if (Event::handle('LocationFromName', array($name, $language, $location_ns, &$location))) {
+
+            switch ($location_ns) {
+             case Location::geonames:
+                return Location::fromGeonamesName($name, $language);
+                break;
+             case Location::whereOnEarth:
+                return Location::fromWhereOnEarthName($name, $language);
+                break;
+            }
+        }
+
+        return $location;
+    }
+
+    static function fromGeonamesName($name, $language)
+    {
+        $location = null;
+        $client = HTTPClient::start();
+
+        // XXX: break down a name by commas, narrow by each
+
+        $str = http_build_query(array('maxRows' => 1,
+                                      'q' => $name,
+                                      'lang' => $language,
+                                      'type' => 'json'));
+
+        $result = $client->get('http://ws.geonames.org/search?'.$str);
+
+        if ($result->code == "200") {
+            $rj = json_decode($result->body);
+            if (count($rj['geonames']) > 0) {
+                $n = $rj['geonames'][0];
+                $location = new Location();
+                $location->lat = $n->lat;
+                $location->lon = $n->lon;
+                $location->name = $n->name;
+                $location->location_id = $n->geonameId;
+                $location->location_ns = Location:geonames;
+            }
+        }
+
+        return $location;
     }
 
     static function fromId($location_id, $location_ns = null)
-- 
2.39.5