<?php 
header
('Access-Control-Allow-Origin: *');
 
#error_reporting( E_ALL );
 #ini_set("display_errors",1);


/*
    This script is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    Copyright (C) 2009 Johannes 'josch' Schauer <josch@pyneo.org>
    
    This script is a rewrite of marks.php
    by Kolossos <http://de.wikipedia.org/wiki/User:Kolossos>
*/

$earth_radius 6378137.0;

function 
wfImageDir$fname,$w ) {
    if(
$fname=="") {
        return 
"";
    } else {
        
$wgUploadDirectory="http://upload.wikimedia.org/wikipedia/commons";
        
$hash md5$fname );
        
$fname urlencode($fname);
        if(!
$w) {
            return 
"$wgUploadDirectory/{$hash[0]}/{$hash[0]}{$hash[1]}/$fname";
        } else {
            return 
"$wgUploadDirectory/thumb/{$hash[0]}/{$hash[0]}{$hash[1]}/$fname/{$w}px-$fname";        }
    }
}

function 
calculate_distance($from_lat_dec,$from_long_dec,$to_lat_dec,$to_long_dec) {
    
# given two coordinates, calculate the great circle distance
    
global $earth_radius;
    
$from_theta $from_lat_dec/180.0 M_PI;
    
$from_landa $from_long_dec/180.0 M_PI;
    
$to_theta $to_lat_dec/180.0 M_PI;
    
$to_landa $to_long_dec/180.0 M_PI;

    return 
$earth_radius*acos(sin($from_theta)*sin($to_theta) + cos($from_theta)*cos($to_theta)*cos($to_landa-$from_landa));
}

function 
calculate_bearing($from_lat_dec,$from_long_dec,$to_lat_dec,$to_long_dec) {
    
# given two coordinates calculate the bearing from the first to the second
    
$from_theta $from_lat_dec/180.0 M_PI;
    
$from_landa $from_long_dec/180.0 M_PI;
    
$to_theta $to_lat_dec/180.0 M_PI;
    
$to_landa $to_long_dec/180.0 M_PI;

    return 
180.0/M_PI*atan2(sin($to_landa-$from_landa)*cos($to_theta),
                          
cos($from_theta)*sin($to_theta) - sin($from_theta)*cos($to_theta)*cos($to_landa-$from_landa));
}

$lang=addslashes($_REQUEST[LANG]);
$maxRows = (int)$_REQUEST[maxRows];
$BOX pg_escape_string(urldecode$_REQUEST["BBOX"] ));
if (
$BOX==""){$BOX pg_escape_string(urldecode$_REQUEST["bbox"] ));}

$bbox addslashes($_REQUEST[bbox]);
$lon addslashes($_REQUEST[lon]);
$lat addslashes($_REQUEST[lat]);
$radius addslashes($_REQUEST[radius]);


if(
$lang=="wikidata"){$wpurl="";} else {$wpurl=".wikipedia";}


####
#$lang = "de";
#$lon = 13.37;
#$lat = 52.51;
#$radius = 500;
####

$red_table=0;
if (
abs($coords1-$coords3)>1) {$red_table=2;} 
if (
abs($coords1-$coords3)>10) {$red_table=3;}
if (
abs($coords1-$coords3)>100) {$red_table=4;}

 if (
$style<>""){$styleinsert=" AND style like '$style'";}
 if (
$photo=="yes"){$photoinsert=" AND imagejpg IS NOT NULL";}
 if (
$photo=="no"){$photoinsert=" AND imagejpg IS NULL";}

 if (
$source<>""){$sourceinsert=" AND lang like '$source'";}  
 if (
$notsource<>""){$sourceinsert=" AND lang not like '$notsource'";}      


if(
$maxRows>0) {
    
$maxRows min($maxRows80);
} else {
    
$maxRows 20;
}

if(
$bbox!="") {
    
$coords split(","$bbox);
    
$lon1 $coords[0];
    
$lat1 $coords[1];
    
$lon2 $coords[2];
    
$lat2 $coords[3];
} else if(
$lon!="" && $lat!="" && $radius!= "") {
    
# convert metric radius to lat/lon delta
    
$m2lat $radius*180.0/M_PI/$earth_radius;
    
$m2lon $m2lat/cos($lat/180.0*M_PI);
    
# calculate bounding box
    
$lon1 $lon $m2lon;
    
$lat1 $lat $m2lat;
    
$lon2 $lon $m2lon;
    
$lat2 $lat $m2lat;
} else {
    exit(
"invalid query string");
}

if (
in_array($lang,array('wikidata','en','de','es','fr','nl','pt','ru','fi','eo','cs','ca','it','ja','pl','sv','no','sk','da','tr','zh','ca','is'))) {
    
$title "Titel_$lang";
} else {
    
$title "titel";
    
$lang "de";
}

if (
$lang==""){$Titel_Column='"Titel"';} else {$Titel_Column='"T_'.$lang.'"';}

#SELECT `$title`, `pop`,`lon`,`lat`,`style`,`lang`,`imagejpg`,`name`, `Height`, `Country`, `Subregion`"
#        0          1     2     3      4       5       6        7        8        9            10 


$sql='(SELECT '.$Titel_Column.' as title, pop,lon,lat,style,lang,image,imagejpg,name,"Height","Country","Subregion"'
        
." FROM wp_coords_red".$red_table."  WHERE the_geom && 
ST_SetSRID(ST_MakeBox2D(ST_Point(
$coords[0],$coords[1]), 
            ST_Point(
$coords[2],$coords[3])),4326)".
' and '.$Titel_Column.' IS NOT NULL'.
$styleinsert$photoinsert$regioninsert$sourceinsert ORDER BY psize DESC LIMIT $maxRows) ";

#echo $sql;

// open psql connection
$pg pg_connect('host=osmdb.eqiad.wmnet dbname=gis user=osm');
 

// query the database
$res pg_query($sql);

// check for query error
if($e pg_last_error()) {echo $sql;die($e);}

$response "";

while(
$row pg_fetch_assoc($res))
{   
$articleurl urlencode(str_replace(" ""_"$row[title]));
      if(
$row[name]!=0) {
        
$articleurl .= "#".urlencode(str_replace(" ""_"$row[name]));
    }
    
    
$distance 0;
    
$bearing 0;
    if(
$bbox=="") {
        
$distance calculate_distance($lat$lon$row[lat], $row[lon]);
        
$bearing calculate_bearing($lat$lon$row[lat], $row[lon]);
    }

    
$response .= "{";
   
$response .= "\"countryCode\":\"$row[Country]\", ";
    
$response .= "\"distance\":$distance, ";
    
$response .= "\"bearing\":$bearing, ";
    
$response .= "\"elevation\":$row[Height], ";
    
$response .= "\"feature\":\"$row[style]\", ";
    
$response .= "\"lang\":\"$row[lang]\", ";
    
$response .= "\"lat\":$row[lat], ";
    
$response .= "\"lon\":$row[lon], ";
    
$response .= "\"population\":$row[pop], ";
    
#$response .= "\"summary\":\"\", ";
    
$response .= "\"title\":\"$row[title]\", ";
    
$response .= "\"wikipediaUrl\":\"http://$lang".$wpurl.".org/wiki/$articleurl\", ";
    
$response .= "\"image\":\"".wfImageDir($row[imagejpg])."\", ";
    
$response .= "\"thumbnail\":\"".wfImageDir($row[imagejpg], 180)."\", ";
    
$response .= "\"region\":\"$row[Subregion]\"";
    
$response .= "},\n";
}

mysql_close();

header('Content-type: application/json');
?>{"geonames": [<?php echo $response?>]}