Upgrade jquery for next release.
[platal.git] / classes / geocoder.php
index 357891e..89727a1 100644 (file)
@@ -39,21 +39,40 @@ abstract class Geocoder {
             'subAdministrativeArea' => 'geoloc_subadministrativeareas',
             'locality'              => 'geoloc_localities',
         );
+        static $extras = array(
+            'subAdministrativeArea' => array(
+                'field' => 'administrativearea',
+                'name'  => 'administrativeAreaName'
+            )
+        );
 
         $areaName = $area . 'Name';
+        $areaNameLocal = $areaName . 'Local';
         $areaId = $area . 'Id';
         if (!is_null($address->$areaName) && isset($databases[$area])) {
-            $res = XDB::query('SELECT  id
+            $extra = (isset($extras[$area]) ? $extras[$area]['administrativeAreaName'] : false);
+
+            $res = XDB::query('SELECT  id, nameLocal
                                  FROM  ' . $databases[$area] . '
                                 WHERE  name = {?}',
                               $address->$areaName);
             if ($res->numRows() == 0) {
-                XDB::execute('INSERT INTO  ' . $databases[$area] . ' (name, country)
-                                   VALUES  ({?}, {?})',
-                             $address->$areaName, $address->countryId);
+                XDB::execute('INSERT INTO  ' . $databases[$area] . ' (name, nameLocal, country' .
+                                           ($extra ? ', ' . $extras[$area]['field'] : '') . ')
+                                   VALUES  ({?}, {?}, {?}' . ($extra ? ', {?}' : '') . ')',
+                             $address->$areaName, $address->$areaNameLocal, $address->countryId,
+                             ($extra ? $address->$extra : null));
                 $address->$areaId = XDB::insertId();
             } else {
-                $address->$areaId = $res->fetchOneCell();
+                // XXX: remove this once all areas have both nameLocal and name.
+                list($id, $name) = $res->fetchOneRow();
+                if (is_null($name) && !is_null($address->$areaNameLocal)) {
+                    XDB::execute('UPDATE  ' . $databases[$area] . '
+                                     SET  nameLocal = {?}
+                                   WHERE  id = {?}',
+                                 $address->$areaNameLocal, $id);
+                }
+                $address->$areaId = $id;
             }
         } elseif (empty($address->$areaId)) {
             $address->$areaId = null;
@@ -64,14 +83,23 @@ abstract class Geocoder {
     // and the city name, within the limit of $limit number of lines.
     static public function getFirstLines($text, $postalCode, $limit)
     {
-        $textArray  = explode("\n", $text);
+        $text = str_replace("\r", '', $text);
+        $textArray = explode("\n", $text);
+        $linesNb = $limit;
+
         for ($i = 0; $i < count($textArray); ++$i) {
-            if ($i > $limit || strpos($textLine, $postalCode) !== false) {
-                $limit = $i;
+            if ($i > $limit || strpos($textArray[$i], $postalCode) !== false) {
+                $linesNb = $i;
                 break;
             }
         }
-        return implode("\n", array_slice($textArray, 0, $limit));
+        $firstLines = implode("\n", array_slice($textArray, 0, $linesNb));
+
+        // Adds empty lines to complete the $limit lines required.
+        for (; $i < $limit; ++$i) {
+            $firstLines .= "\n";
+        }
+        return $firstLines;
     }
 
     // Returns the number of non geocoded addresses for a user.