name values, starting with the Top Level
// e.g. array(0=>'Top Level', 16=>'England', 19=>'London', 217=>'Westminster');
// NB This function exists in both places.php and places_edit.php
function place_id_to_hierarchy($id) {
$statement=
WT_DB::prepare("SELECT pl_parent_id, pl_place FROM `##placelocation` WHERE pl_id=?");
$arr=array();
while ($id!=0) {
$row=$statement->execute(array($id))->fetchOneRow();
$arr=array($id=>$row->pl_place)+$arr;
$id=$row->pl_parent_id;
}
return $arr;
}
// NB This function exists in both admin_places.php and places_edit.php
function getHighestIndex() {
return (int)WT_DB::prepare("SELECT MAX(pl_id) FROM `##placelocation`")->fetchOne();
}
function getHighestLevel() {
return (int)WT_DB::prepare("SELECT MAX(pl_level) FROM `##placelocation`")->fetchOne();
}
/**
* Find all of the places in the hierarchy
*/
function get_place_list_loc($parent_id, $inactive=false) {
if ($inactive) {
$rows=
WT_DB::prepare("SELECT pl_id, pl_place, pl_lati, pl_long, pl_zoom, pl_icon FROM `##placelocation` WHERE pl_parent_id=? ORDER BY pl_place")
->execute(array($parent_id))
->fetchAll();
} else {
$rows=
WT_DB::prepare(
"SELECT DISTINCT pl_id, pl_place, pl_lati, pl_long, pl_zoom, pl_icon".
" FROM `##placelocation`".
" INNER JOIN `##places` ON `##placelocation`.pl_place=`##places`.p_place AND `##placelocation`.pl_level=`##places`.p_level".
" WHERE pl_parent_id=? ORDER BY pl_place"
)
->execute(array($parent_id))
->fetchAll();
}
$placelist=array();
foreach ($rows as $row) {
$placelist[]=array('place_id'=>$row->pl_id, 'place'=>$row->pl_place, 'lati'=>$row->pl_lati, 'long'=>$row->pl_long, 'zoom'=>$row->pl_zoom, 'icon'=>$row->pl_icon);
}
uasort($placelist, 'placesort');
return $placelist;
}
function outputLevel($parent_id) {
$tmp = place_id_to_hierarchy($parent_id);
$maxLevel = getHighestLevel();
if ($maxLevel>8) $maxLevel = 8;
$prefix = implode(';', $tmp);
if ($prefix!='')
$prefix.=';';
$suffix=str_repeat(';', $maxLevel-count($tmp));
$level=count($tmp);
$rows=
WT_DB::prepare("SELECT pl_id, pl_place, pl_long, pl_lati, pl_zoom, pl_icon FROM `##placelocation` WHERE pl_parent_id=? ORDER BY pl_place")
->execute(array($parent_id))
->fetchAll();
foreach ($rows as $row) {
echo $level,';',$prefix,$row->pl_place,$suffix,';',$row->pl_long,';',$row->pl_lati,';',$row->pl_zoom,';',$row->pl_icon,"\r\n";
if ($level < $maxLevel) {
outputLevel($row->pl_id);
}
}
}
/**
* recursively find all of the csv files on the server
*
* @param string $path
*/
function findFiles($path) {
global $placefiles;
if (file_exists($path)) {
$dir = dir($path);
while (false !== ($entry = $dir->read())) {
if ($entry!='.' && $entry!='..' && $entry!='.svn') {
if (is_dir($path.'/'.$entry)) {
findFiles($path.'/'.$entry);
} elseif (strstr($entry, '.csv')!==false) {
$placefiles[] = preg_replace('~'.WT_MODULES_DIR.'googlemap/extra~', '', $path).'/'.$entry;
}
}
}
$dir->close();
}
}
if (!WT_USER_IS_ADMIN) {
header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.'admin.php');
exit;
}
global $GOOGLEMAP_MAX_ZOOM;
if ($action=='ExportFile' && WT_USER_IS_ADMIN) {
$tmp = place_id_to_hierarchy($parent);
$maxLevel = getHighestLevel();
if ($maxLevel>8) $maxLevel=8;
$tmp[0] = 'places';
$outputFileName=preg_replace('/[:;\/\\\(\)\{\}\[\] $]/', '_', implode('-', $tmp)).'.csv';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$outputFileName.'"');
echo '"', WT_I18N::translate('Level'), '";"', WT_I18N::translate('Country'), '";';
if ($maxLevel>0) echo '"', WT_I18N::translate('State'), '";';
if ($maxLevel>1) echo '"', WT_I18N::translate('County'), '";';
if ($maxLevel>2) echo '"', WT_I18N::translate('City'), '";';
if ($maxLevel>3) echo '"', WT_I18N::translate('Place'), '";';
if ($maxLevel>4) echo '"', WT_I18N::translate('Place'), '";';
if ($maxLevel>5) echo '"', WT_I18N::translate('Place'), '";';
if ($maxLevel>6) echo '"', WT_I18N::translate('Place'), '";';
if ($maxLevel>7) echo '"', WT_I18N::translate('Place'), '";';
echo '"', WT_I18N::translate('Longitude'), '";"', WT_I18N::translate('Latitude'), '";';
echo '"', WT_I18N::translate('Zoom factor'), '";"', WT_I18N::translate('Icon'), '";', WT_EOL;
outputLevel($parent);
exit;
}
$controller=new WT_Controller_Base();
$controller->setPageTitle(WT_I18N::translate('Edit geographic place locations'));
$controller->pageHeader();
echo '
',
'| ', WT_I18N::translate('Google Maps configuration'), '', ' | ',
'', WT_I18N::translate('Edit geographic place locations'), '', ' | ',
'', WT_I18N::translate('Place Check'), '', help_link('GOOGLEMAP_PLACECHECK','googlemap'), ' | ',
'
';
if ($action=='ImportGedcom') {
$placelist=array();
$j=0;
if ($mode=='all') {
$statement=
WT_DB::prepare("SELECT i_gedcom FROM `##individuals` UNION ALL SELECT f_gedcom FROM `##families`")
->execute();
} else {
$statement=
WT_DB::prepare("SELECT i_gedcom FROM `##individuals` WHERE i_file=? UNION ALL SELECT f_gedcom FROM `##families` WHERE f_file=?")
->execute(array(WT_GED_ID, WT_GED_ID));
}
while ($gedrec=$statement->fetchColumn()) {
$i = 1;
$placerec = get_sub_record(2, '2 PLAC', $gedrec, $i);
while (!empty($placerec)) {
if (preg_match("/2 PLAC (.+)/", $placerec, $match)) {
$placelist[$j] = array();
$placelist[$j]['place'] = trim($match[1]);
if (preg_match("/4 LATI (.*)/", $placerec, $match)) {
$placelist[$j]['lati'] = trim($match[1]);
if (($placelist[$j]['lati'][0] != 'N') && ($placelist[$j]['lati'][0] != 'S')) {
if ($placelist[$j]['lati'] < 0) {
$placelist[$j]['lati'][0] = 'S';
} else {
$placelist[$j]['lati'] = 'N'.$placelist[$j]['lati'];
}
}
}
else $placelist[$j]['lati'] = NULL;
if (preg_match("/4 LONG (.*)/", $placerec, $match)) {
$placelist[$j]['long'] = trim($match[1]);
if (($placelist[$j]['long'][0] != 'E') && ($placelist[$j]['long'][0] != 'W')) {
if ($placelist[$j]['long'] < 0) {
$placelist[$j]['long'][0] = 'W';
} else {
$placelist[$j]['long'] = 'E'.$placelist[$j]['long'];
}
}
}
else $placelist[$j]['long'] = NULL;
$j = $j + 1;
}
$i = $i + 1;
$placerec = get_sub_record(2, '2 PLAC', $gedrec, $i);
}
}
asort($placelist);
$prevPlace = '';
$prevLati = '';
$prevLong = '';
$placelistUniq = array();
$j = 0;
foreach ($placelist as $k=>$place) {
if ($place['place'] != $prevPlace) {
$placelistUniq[$j] = array();
$placelistUniq[$j]['place'] = $place['place'];
$placelistUniq[$j]['lati'] = $place['lati'];
$placelistUniq[$j]['long'] = $place['long'];
$j = $j + 1;
} else if (($place['place'] == $prevPlace) && (($place['lati'] != $prevLati) || ($place['long'] != $prevLong))) {
if (($placelistUniq[$j-1]['lati'] == 0) || ($placelistUniq[$j-1]['long'] == 0)) {
$placelistUniq[$j-1]['lati'] = $place['lati'];
$placelistUniq[$j-1]['long'] = $place['long'];
} else if (($place['lati'] != '0') || ($place['long'] != '0')) {
echo 'Difference: previous value = ', $prevPlace, ', ', $prevLati, ', ', $prevLong, ' current = ', $place['place'], ', ', $place['lati'], ', ', $place['long'], '
';
}
}
$prevPlace = $place['place'];
$prevLati = $place['lati'];
$prevLong = $place['long'];
}
$highestIndex = getHighestIndex();
$default_zoom_level=array(4, 7, 10, 12);
foreach ($placelistUniq as $k=>$place) {
$parent=preg_split('/ *, */', $place['place']);
$parent=array_reverse($parent);
$parent_id=0;
for ($i=0; $iexecute(array($i, $parent_id, $escparent))
->fetchOneRow();
if ($i < count($parent)-1) {
// Create higher-level places, if necessary
if (empty($row)) {
$highestIndex++;
WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_zoom) VALUES (?, ?, ?, ?, ?)")
->execute(array($highestIndex, $parent_id, $i, $escparent, $default_zoom_level[$i]));
echo htmlspecialchars($escparent), '
';
$parent_id=$highestIndex;
} else {
$parent_id=$row->pl_id;
}
} else {
// Create lowest-level place, if necessary
if (empty($row->pl_id)) {
$highestIndex++;
WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_long, pl_lati, pl_zoom) VALUES (?, ?, ?, ?, ?, ?, ?)")
->execute(array($highestIndex, $parent_id, $i, $escparent, $place['long'], $place['lati'], $default_zoom_level[$i]));
echo htmlspecialchars($escparent), '
';
} else {
if (empty($row->pl_long) && empty($row->pl_lati) && $place['lati']!='0' && $place['long']!='0') {
WT_DB::prepare("UPDATE `##placelocation` SET pl_lati=?, pl_long=? WHERE pl_id=?")
->execute(array($place['lati'], $place['long'], $row->pl_id));
echo htmlspecialchars($escparent), '
';
}
}
}
}
}
$parent=0;
}
if ($action=='ImportFile') {
$placefiles = array();
findFiles(WT_MODULES_DIR.'googlemap/extra');
sort($placefiles);
?>
$value) {
$country_names[$key]=WT_I18N::translate($key);
}
if (isset($_POST['cleardatabase'])) {
WT_DB::exec("DELETE FROM `##placelocation` WHERE 1=1");
}
if (!empty($_FILES['placesfile']['tmp_name'])) {
$lines = file($_FILES['placesfile']['tmp_name']);
} elseif (!empty($_REQUEST['localfile'])) {
$lines = file(WT_MODULES_DIR.'googlemap/extra'.$_REQUEST['localfile']);
}
// Strip BYTE-ORDER-MARK, if present
if (!empty($lines[0]) && substr($lines[0], 0, 3)==WT_UTF8_BOM) $lines[0]=substr($lines[0], 3);
asort($lines);
$highestIndex = getHighestIndex();
$placelist = array();
$j = 0;
$maxLevel = 0;
foreach ($lines as $p => $placerec) {
$fieldrec = explode(';', $placerec);
if ($fieldrec[0] > $maxLevel) $maxLevel = $fieldrec[0];
}
$fields = count($fieldrec);
$set_icon = true;
if (!is_dir(WT_MODULES_DIR.'googlemap/places/flags/')) {
$set_icon = false;
}
foreach ($lines as $p => $placerec) {
$fieldrec = explode(';', $placerec);
if (is_numeric($fieldrec[0]) && $fieldrec[0]<=$maxLevel) {
$placelist[$j] = array();
$placelist[$j]['place'] = '';
for ($ii=$fields-4; $ii>1; $ii--) {
if ($fieldrec[0] > $ii-2) $placelist[$j]['place'] .= $fieldrec[$ii].',';
}
foreach ($country_names as $countrycode => $countryname) {
if ($countrycode == strtoupper($fieldrec[1])) {
$fieldrec[1] = $countryname;
break;
}
}
$placelist[$j]['place'] .= $fieldrec[1];
$placelist[$j]['long'] = $fieldrec[$fields-4];
$placelist[$j]['lati'] = $fieldrec[$fields-3];
$placelist[$j]['zoom'] = $fieldrec[$fields-2];
if($set_icon) {
$placelist[$j]['icon'] = trim($fieldrec[$fields-1]);
} else {
$placelist[$j]['icon'] = '';
}
$j = $j + 1;
}
}
$prevPlace = '';
$prevLati = '';
$prevLong = '';
$placelistUniq = array();
$j = 0;
foreach ($placelist as $k=>$place) {
if ($place['place'] != $prevPlace) {
$placelistUniq[$j] = array();
$placelistUniq[$j]['place'] = $place['place'];
$placelistUniq[$j]['lati'] = $place['lati'];
$placelistUniq[$j]['long'] = $place['long'];
$placelistUniq[$j]['zoom'] = $place['zoom'];
$placelistUniq[$j]['icon'] = $place['icon'];
$j = $j + 1;
} else if (($place['place'] == $prevPlace) && (($place['lati'] != $prevLati) || ($place['long'] != $prevLong))) {
if (($placelistUniq[$j-1]['lati'] == 0) || ($placelistUniq[$j-1]['long'] == 0)) {
$placelistUniq[$j-1]['lati'] = $place['lati'];
$placelistUniq[$j-1]['long'] = $place['long'];
$placelistUniq[$j-1]['zoom'] = $place['zoom'];
$placelistUniq[$j-1]['icon'] = $place['icon'];
} else if (($place['lati'] != '0') || ($place['long'] != '0')) {
echo 'Difference: previous value = ', $prevPlace, ', ', $prevLati, ', ', $prevLong, ' current = ', $place['place'], ', ', $place['lati'], ', ', $place['long'], '
';
}
}
$prevPlace = $place['place'];
$prevLati = $place['lati'];
$prevLong = $place['long'];
}
$default_zoom_level = array();
$default_zoom_level[0] = 4;
$default_zoom_level[1] = 7;
$default_zoom_level[2] = 10;
$default_zoom_level[3] = 12;
foreach ($placelistUniq as $k=>$place) {
$parent = explode(',', $place['place']);
$parent = array_reverse($parent);
$parent_id=0;
for ($i=0; $iexecute(array($i, $parent_id, $escparent))
->fetchOneRow();
if (empty($row)) { // this name does not yet exist: create entry
if (!isset($_POST['updateonly'])) {
$highestIndex = $highestIndex + 1;
if (($i+1) == count($parent)) {
$zoomlevel = $place['zoom'];
} elseif (isset($default_zoom_level[$i])) {
$zoomlevel = $default_zoom_level[$i];
} else {
$zoomlevel = $GOOGLEMAP_MAX_ZOOM;
}
if (($place['lati'] == '0') || ($place['long'] == '0') || (($i+1) < count($parent))) {
WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_zoom, pl_icon) VALUES (?, ?, ?, ?, ?, ?)")
->execute(array($highestIndex, $parent_id, $i, $escparent, $zoomlevel, $place['icon']));
} else {
//delete leading zero
$pl_lati = str_replace(array('N', 'S', ','), array('', '-', '.') , $place['lati']);
$pl_long = str_replace(array('E', 'W', ','), array('', '-', '.') , $place['long']);
if ($pl_lati >= 0) {
$place['lati'] = 'N'.abs($pl_lati);
} elseif ($pl_lati < 0) {
$place['lati'] = 'S'.abs($pl_lati);
}
if ($pl_long >= 0) {
$place['long'] = 'E'.abs($pl_long);
} elseif ($pl_long < 0) {
$place['long'] = 'W'.abs($pl_long);
}
WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_long, pl_lati, pl_zoom, pl_icon) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")
->execute(array($highestIndex, $parent_id, $i, $escparent, $place['long'], $place['lati'], $zoomlevel, $place['icon']));
}
$parent_id = $highestIndex;
}
} else {
$parent_id = $row->pl_id;
if ((isset($_POST['overwritedata'])) && ($i+1 == count($parent))) {
WT_DB::prepare("UPDATE `##placelocation` SET pl_lati=?, pl_long=?, pl_zoom=?, pl_icon=? WHERE pl_id=?")
->execute(array($place['lati'], $place['long'], $place['zoom'], $place['icon'], $parent_id));
} else {
if ((($row->pl_long == '0') || ($row->pl_long == null)) && (($row->pl_lati == '0') || ($row->pl_lati == null))) {
WT_DB::prepare("UPDATE `##placelocation` SET pl_lati=?, pl_long=? WHERE pl_id=?")
->execute(array($place['lati'], $place['long'], $parent_id));
}
if (empty($row->pl_icon) && !empty($place['icon'])) {
WT_DB::prepare("UPDATE `##placelocation` SET pl_icon=? WHERE pl_id=?")
->execute(array($place['icon'], $parent_id));
}
}
}
}
}
$parent=0;
}
if ($action=='DeleteRecord') {
$exists=
WT_DB::prepare("SELECT 1 FROM `##placelocation` WHERE pl_parent_id=?")
->execute(array($deleteRecord))
->fetchOne();
if (!$exists) {
WT_DB::prepare("DELETE FROM `##placelocation` WHERE pl_id=?")
->execute(array($deleteRecord));
} else {
echo '| ', WT_I18N::translate('Location not removed: this location contains sub-locations'), ' |
';
}
}
?>
';
$where_am_i=place_id_to_hierarchy($parent);
foreach (array_reverse($where_am_i, true) as $id=>$place) {
if ($id==$parent) {
if ($place != 'Unknown') {
echo PrintReady($place);
} else {
echo WT_I18N::translate('unknown');
}
} else {
echo '';
if ($place != 'Unknown') {
echo PrintReady($place), '';
} else {
echo WT_I18N::translate('unknown'), '';
}
}
echo ' - ';
}
echo '', WT_I18N::translate('Top Level'), '';
echo '';
$placelist=get_place_list_loc($parent, $inactive);
echo '';
echo '
';
echo '| ', WT_Gedcom_Tag::getLabel('PLAC'), ' | ';
echo '', WT_Gedcom_Tag::getLabel('LATI'), ' | ';
echo '', WT_Gedcom_Tag::getLabel('LONG'), ' | ';
echo '', WT_I18N::translate('Zoom factor'), ' | ';
echo '', WT_I18N::translate('Icon'), ' | ';
echo '';
echo WT_I18N::translate('Edit geographic location'), help_link('PL_EDIT_LOCATION','googlemap'), ' |
';
if (count($placelist) == 0)
echo '| ', WT_I18N::translate('No places found'), ' |
';
foreach ($placelist as $place) {
echo '| ';
if ($place['place'] != 'Unknown')
echo PrintReady($place['place']), ' | ';
else
echo WT_I18N::translate('unknown'), '';
echo '', $place['lati'], ' | ';
echo '', $place['long'], ' | ';
echo '', $place['zoom'], ' | ';
echo '';
if (($place['icon'] == NULL) || ($place['icon'] == '')) {
if (($place['lati'] == NULL) || ($place['long'] == NULL) || (($place['lati'] == '0') && ($place['long'] == '0'))) {
echo ' ';
echo ' ';
}
else {
echo ' ';
echo ' ';
}
} else {
echo ' ';
}
echo ' | ';
echo ' | ';
$noRows=
WT_DB::prepare("SELECT COUNT(pl_id) FROM `##placelocation` WHERE pl_parent_id=?")
->execute(array($place['place_id']))
->fetchOne();
if ($noRows==0) { ?>
'; ?> |
|
';
if (empty($SEARCH_SPIDER)) {
} else {
echo WT_I18N::translate('Search Engine Spider Detected'), ': ', $SEARCH_SPIDER;
echo '