function geo_geocode_string($string)
{
    $service = $GLOBALS['cfg']['geo_geocoding_service'];
    $func = "geo_geocode_{$service}";
    if (!$service || !is_callable($func)) {
        return array('ok' => 0, 'error' => 'Unknown or undefined service');
    }
    $rsp = call_user_func($func, $string);
    $map = geo_geocode_service_map('string keys');
    $rsp['service_id'] = $map[$service];
    return $rsp;
}
function dots_derive_location_from_address(&$data)
{
    $geocode_rsp = geo_geocode_string($data['address']);
    if (!$geocode_rsp['ok']) {
        return array('ok' => 0);
    }
    # stuff to be marked as "derived_from"
    $derived_keys = array('latitude', 'longitude');
    $data['latitude'] = $geocode_rsp['latitude'];
    $data['longitude'] = $geocode_rsp['longitude'];
    $geocoded_by = $geocode_rsp['service_id'];
    $geo_map = geo_geocode_service_map();
    $geocoder_name = $geo_map[$geocoded_by];
    $derived_map = dots_derive_derived_from_map('string keys');
    $derived_from = $derived_map["geocoded ({$geocoder_name})"];
    foreach ($geocode_rsp['extras'] as $k => $v) {
        $extra = "{$geocoder_name}:{$k}";
        $derived_keys[] = $extra;
        $data[$extra] = $v;
    }
    # Happy happy
    $rsp = array('ok' => 1, 'keys' => array());
    foreach ($derived_keys as $key) {
        $rsp['keys'][$key] = $derived_from;
    }
    return $rsp;
}
if ($dots) {
    $to_json = array();
    foreach ($dots as $dot) {
        $tmp = array();
        foreach ($json_fields as $fi) {
            if (isset($dot[$fi])) {
                if ($fi == "details") {
                    $_details = array();
                    foreach ($dot[$fi] as $de) {
                        $_details[] = array('label' => $de[0]['label'], 'value' => $de[0]['value']);
                    }
                    $tmp[$fi] = $_details;
                } else {
                    $tmp[$fi] = $dot[$fi];
                }
            }
        }
        $to_json[] = $tmp;
    }
    //if( isset($owner.username) )$ddd[] = array('owner'=>$owner.username);
    $smarty->assign("dots_simple", $to_json);
}
$is_own = $owner['id'] == $GLOBALS['cfg']['user']['id'] ? 1 : 0;
$smarty->assign('is_own', $is_own);
if ($is_own) {
    $smarty->assign("permissions_map", dots_permissions_map());
    $smarty->assign("geocoder_map", geo_geocode_service_map());
}
$smarty->assign("pagination_url", urls_dots_for_user($owner));
$smarty->display('page_user_dots.txt');
exit;