diff options
Diffstat (limited to 'modules/googlemap/googlemap.php')
| -rw-r--r-- | modules/googlemap/googlemap.php | 953 |
1 files changed, 953 insertions, 0 deletions
diff --git a/modules/googlemap/googlemap.php b/modules/googlemap/googlemap.php new file mode 100644 index 0000000000..c20ad028ed --- /dev/null +++ b/modules/googlemap/googlemap.php @@ -0,0 +1,953 @@ +<?php +/** + * Google map module for phpGedView + * + * webtrees: Web based Family History software + * Copyright (C) 2010 webtrees development team. + * + * Derived from PhpGedView + * Copyright (C) 2002 to 2010 PGV Development Team. All rights reserved. + * + * Modifications Copyright (c) 2010 Greg Roach + * + * This program 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @package webtrees + * @subpackage Module + * $Id$ + * @author Johan Borkhuis + */ + +if (!defined('WT_WEBTREES')) { + header('HTTP/1.0 403 Forbidden'); + exit; +} + +require WT_ROOT.'modules/googlemap/defaultconfig.php'; + +global $SESSION_HIDE_GOOGLEMAP; +$SESSION_HIDE_GOOGLEMAP = "empty"; +if ((isset($_REQUEST["HIDE_GOOGLEMAP"])) && (empty($SEARCH_SPIDER))) { + if(stristr("true", $_REQUEST["HIDE_GOOGLEMAP"])) { + $SESSION_HIDE_GOOGLEMAP = "true"; + } + if(stristr("false", $_REQUEST["HIDE_GOOGLEMAP"])) { + $SESSION_HIDE_GOOGLEMAP = "false"; + } +} + +// change the session values and store if needed. +if($SESSION_HIDE_GOOGLEMAP == "true") $_SESSION['hide_googlemap'] = true; +if($SESSION_HIDE_GOOGLEMAP == "false") $_SESSION['hide_googlemap'] = false; +if($SESSION_HIDE_GOOGLEMAP == "empty") { + if((isset($_SESSION['hide_googlemap'])) && ($_SESSION['hide_googlemap'] == true)) + $SESSION_HIDE_GOOGLEMAP = "true"; + else + $SESSION_HIDE_GOOGLEMAP = "false"; +} + +// functions copied from print_fact_place +function print_fact_place_map($factrec) { + $ct = preg_match("/2 PLAC (.*)/", $factrec, $match); + if ($ct>0) { + $retStr = " "; + $levels = explode(",", $match[1]); + $place = trim($match[1]); + // reverse the array so that we get the top level first + $levels = array_reverse($levels); + $retStr .= "<a href=\"placelist.php?action=show&"; + foreach($levels as $pindex=>$ppart) { + // routine for replacing ampersands + $ppart = preg_replace("/amp\%3B/", "", trim($ppart)); + $retStr .= "parent[$pindex]=".PrintReady($ppart)."&"; + } + $retStr .= "level=".count($levels); + $retStr .= "\"> ".PrintReady($place)."</a>"; + return $retStr; + } + return ""; +} + + +function print_address_structure_map($factrec, $level) { + global $WORD_WRAPPED_NOTES; + global $POSTAL_CODE; + + // $POSTAL_CODE = 'false' - before city, 'true' - after city and/or state + //-- define per gedcom till can do per address countries in address languages + //-- then this will be the default when country not recognized or does not exist + //-- both Finland and Suomi are valid for Finland etc. + //-- see http://www.bitboost.com/ref/international-address-formats.html + + $nlevel = $level+1; + $ct = preg_match_all("/$level ADDR(.*)/", $factrec, $omatch, PREG_SET_ORDER); + for($i=0; $i<$ct; $i++) { + $arec = get_sub_record($level, "$level ADDR", $factrec, $i+1); + $resultText = ""; + $cn = preg_match("/$nlevel _NAME (.*)/", $arec, $cmatch); + if ($cn>0) $resultText .= str_replace("/", "", $cmatch[1])."<br />"; + $resultText .= PrintReady(trim($omatch[$i][1])); + $cont = get_cont($nlevel, $arec); + if (!empty($cont)) $resultText .= str_replace(array(" ", "<br "), array(" ", "<br "), PrintReady($cont)); + else { + if (strlen(trim($omatch[$i][1])) > 0) echo "<br />"; + $cs = preg_match("/$nlevel ADR1 (.*)/", $arec, $cmatch); + if ($cs>0) { + if ($cn==0) { + $resultText .= "<br />"; + $cn=0; + } + $resultText .= PrintReady($cmatch[1]); + } + $cs = preg_match("/$nlevel ADR2 (.*)/", $arec, $cmatch); + if ($cs>0) { + if ($cn==0) { + $resultText .= "<br />"; + $cn=0; + } + $resultText .= PrintReady($cmatch[1]); + } + + if ($POSTAL_CODE) { + if (preg_match("/$nlevel CITY (.*)/", $arec, $cmatch)) + $resultText.=" ".PrintReady($cmatch[1]); + if (preg_match("/$nlevel STAE (.*)/", $arec, $cmatch)) + $resultText.=", ".PrintReady($cmatch[1]); + if (preg_match("/$nlevel POST (.*)/", $arec, $cmatch)) + $resultText.="<br />".PrintReady($cmatch[1]); + } else { + if (preg_match("/$nlevel POST (.*)/", $arec, $cmatch)) + $resultText.="<br />".PrintReady($cmatch[1]); + if (preg_match("/$nlevel CITY (.*)/", $arec, $cmatch)) + $resultText.=" ".PrintReady($cmatch[1]); + if (preg_match("/$nlevel STAE (.*)/", $arec, $cmatch)) + $resultText.=", ".PrintReady($cmatch[1]); + } + } + if (preg_match("/$nlevel CTRY (.*)/", $arec, $cmatch)) + $resultText.="<br />".PrintReady($cmatch[1]); + $resultText.= "<br />"; + // Here we can examine the resultant text and remove empty tags + echo str_replace(chr(10), ' ' , $resultText); + } + $resultText = "<table>"; + $ct = preg_match_all("/$level PHON (.*)/", $factrec, $omatch, PREG_SET_ORDER); + for($i=0; $i<$ct; $i++) { + $resultText .= "<tr><td><span class=\"label\"><b>".i18n::translate('PHON').": </b></span></td><td><span class=\"field\">"; + $resultText .= getLRM() . $omatch[$i][1]. getLRM(); + $resultText .= "</span></td></tr>"; + } + $ct = preg_match_all("/$level FAX (.*)/", $factrec, $omatch, PREG_SET_ORDER); + for($i=0; $i<$ct; $i++) { + $resultText .= "<tr><td><span class=\"label\"><b>".i18n::translate('FAX').": </b></span></td><td><span class=\"field\">"; + $resultText .= getLRM() . $omatch[$i][1] . getLRM(); + $resultText .= "</span></td></tr>"; + } + $ct = preg_match_all("/$level EMAIL (.*)/", $factrec, $omatch, PREG_SET_ORDER); + for($i=0; $i<$ct; $i++) { + $resultText .= "<tr><td><span class=\"label\"><b>".i18n::translate('EMAIL').": </b></span></td><td><span class=\"field\">"; + $resultText .= "<a href=\"mailto:".$omatch[$i][1]."\">".$omatch[$i][1]."</a>"; + $resultText .= "</span></td></tr>"; + } + $ct = preg_match_all("/$level (WWW|URL) (.*)/", $factrec, $omatch, PREG_SET_ORDER); + for($i=0; $i<$ct; $i++) { + $resultText .= "<tr><td><span class=\"label\"><b>".i18n::translate('URL').": </b></span></td><td><span class=\"field\">"; + $resultText .= "<a href=\"".$omatch[$i][2]."\" target=\"_blank\">".$omatch[$i][2]."</a>"; + $resultText .= "</span></td></tr>"; + } + $resultText .= "</table>"; + if ($resultText!="<table></table>") echo str_replace(chr(10), ' ' , $resultText); +} + +function rem_prefix_from_placename($prefix_list, $place, $placelist) { + $prefix_split = explode(";", $prefix_list); + foreach ($prefix_split as $prefix) { + if (!empty($prefix)) { + if (preg_match('/^'.$prefix.' (.*)/', $place, $matches) != 0) { + $placelist[] = $matches[1]; + } + } + } + return $placelist; +} + +function rem_postfix_from_placename($postfix_list, $place, $placelist) { + $postfix_split = explode (";", $postfix_list); + foreach ($postfix_split as $postfix) { + if (!empty($postfix)) { + if (preg_match('/^(.*) '.$postfix.'$/', $place, $matches) != 0) { + $placelist[] = $matches[1]; + } + } + } + return $placelist; +} + +function rem_prefix_postfix_from_placename($prefix_list, $postfix_list, $place, $placelist) { + $prefix_split = explode (";", $prefix_list); + $postfix_split = explode (";", $postfix_list); + foreach ($prefix_split as $prefix) { + if (!empty($prefix)) { + foreach ($postfix_split as $postfix) { + if (!empty($postfix)) { + if (preg_match('/^'.$prefix.' (.*) '.$postfix.'$/', $place, $matches) != 0) { + $placelist[] = $matches[1]; + } + } + } + } + } + return $placelist; +} + +function create_possible_place_names ($placename, $level) { + global $GM_PREFIX, $GM_POSTFIX, $GM_PRE_POST_MODE; + + $retlist = array(); + + switch (@$GM_PRE_POST_MODE[$level]) { + case 0: // 0: no pre/postfix + $retlist[] = $placename; + break; + case 1: // 1 = Normal name, Prefix, Postfix, Both + $retlist[] = $placename; + $retlist = rem_prefix_from_placename($GM_PREFIX[$level], $placename, $retlist); + $retlist = rem_postfix_from_placename($GM_POSTFIX[$level], $placename, $retlist); + $retlist = rem_prefix_postfix_from_placename($GM_PREFIX[$level], $GM_POSTFIX[$level], $placename, $retlist); + break; + case 2: // 2 = Normal name, Postfix, Prefxi, Both + $retlist[] = $placename; + $retlist = rem_postfix_from_placename($GM_POSTFIX[$level], $placename, $retlist); + $retlist = rem_prefix_from_placename($GM_PREFIX[$level], $placename, $retlist); + $retlist = rem_prefix_postfix_from_placename($GM_PREFIX[$level], $GM_POSTFIX[$level], $placename, $retlist); + break; + case 3: // 3 = Prefix, Postfix, Both, Normal name + $retlist = rem_prefix_from_placename($GM_PREFIX[$level], $placename, $retlist); + $retlist = rem_postfix_from_placename($GM_POSTFIX[$level], $placename, $retlist); + $retlist = rem_prefix_postfix_from_placename($GM_PREFIX[$level], $GM_POSTFIX[$level], $placename, $retlist); + $retlist[] = $placename; + break; + case 4: // 4 = Postfix, Prefix, Both, Normal name + $retlist = rem_postfix_from_placename($GM_POSTFIX[$level], $placename, $retlist); + $retlist = rem_prefix_from_placename($GM_PREFIX[$level], $placename, $retlist); + $retlist = rem_prefix_postfix_from_placename($GM_PREFIX[$level], $GM_POSTFIX[$level], $placename, $retlist); + $retlist[] = $placename; + break; + case 5: // 5 = Prefix, Postfix, Normal name, Both + $retlist = rem_prefix_from_placename($GM_PREFIX[$level], $placename, $retlist); + $retlist = rem_postfix_from_placename($GM_POSTFIX[$level], $placename, $retlist); + $retlist[] = $placename; + $retlist = rem_prefix_postfix_from_placename($GM_PREFIX[$level], $GM_POSTFIX[$level], $placename, $retlist); + break; + case 6: // 6 = Postfix, Prefix, Normal name, Both + $retlist = rem_postfix_from_placename($GM_POSTFIX[$level], $placename, $retlist); + $retlist = rem_prefix_from_placename($GM_PREFIX[$level], $placename, $retlist); + $retlist[] = $placename; + $retlist = rem_prefix_postfix_from_placename($GM_PREFIX[$level], $GM_POSTFIX[$level], $placename, $retlist); + break; + } + return $retlist; +} + +function abbreviate($text) { + if (utf8_strlen($text)>13) { + if (trim(utf8_substr($text, 10, 1))!="") + $desc = utf8_substr($text, 0, 11)."."; + else $desc = trim(utf8_substr($text, 0, 11)); + } + else $desc = $text; + return $desc; +} + +function get_lati_long_placelocation ($place) { + global $TBLPREFIX; + $parent = explode (",", $place); + $parent = array_reverse($parent); + $place_id = 0; + for($i=0; $i<count($parent); $i++) { + $parent[$i] = trim($parent[$i]); + if (empty($parent[$i])) $parent[$i]="unknown";// GoogleMap module uses "unknown" while GEDCOM uses , , + $placelist = create_possible_place_names($parent[$i], $i+1); + foreach ($placelist as $key => $placename) { + $pl_id= + WT_DB::prepare("SELECT pl_id FROM {$TBLPREFIX}placelocation WHERE pl_level=? AND pl_parent_id=? AND pl_place LIKE ? ORDER BY pl_place") + ->execute(array($i, $place_id, $placename)) + ->fetchOne(); + if (!empty($pl_id)) break; + } + if (empty($pl_id)) break; + $place_id = $pl_id; + } + + $row= + WT_DB::prepare("SELECT pl_lati, pl_long, pl_zoom, pl_icon, pl_level FROM {$TBLPREFIX}placelocation WHERE pl_id=? ORDER BY pl_place") + ->execute(array($place_id)) + ->fetchOneRow(); + if ($row) { + return array('lati'=>$row->pl_lati, 'long'=>$row->pl_long, 'zoom'=>$row->pl_zoom, 'icon'=>$row->pl_icon, 'level'=>$row->pl_level); + } else { + return array(); + } +} + +function setup_map() { + global $GOOGLEMAP_ENABLED, $GOOGLEMAP_API_KEY, $GOOGLEMAP_MAP_TYPE, $GOOGLEMAP_MIN_ZOOM, $GOOGLEMAP_MAX_ZOOM; + if (!$GOOGLEMAP_ENABLED) { + return; + } + ?> + <script src="http://maps.google.com/maps?file=api&v=2&sensor=false&key=<?php echo $GOOGLEMAP_API_KEY; ?>" type="text/javascript"></script> + <script src="modules/googlemap/pgvGoogleMap.js" type="text/javascript"></script> + <script type="text/javascript"> + // <![CDATA[ + if (window.attachEvent) { + window.attachEvent("onunload", function() { + GUnload(); // Internet Explorer + }); + } else { + window.addEventListener("unload", function() { + GUnload(); // Firefox and standard browsers + }, false); + } + var GOOGLEMAP_MAP_TYPE =<?php echo $GOOGLEMAP_MAP_TYPE;?>; + var minZoomLevel = <?php echo $GOOGLEMAP_MIN_ZOOM;?>; + var maxZoomLevel = <?php echo $GOOGLEMAP_MAX_ZOOM;?>; + var startZoomLevel = <?php echo $GOOGLEMAP_MAX_ZOOM;?>; + //]]> + </script> + <?php + +} + +function tool_tip_text($marker) { + $tool_tip=$marker['fact']; + if (!empty($marker['info'])) + $tool_tip.=": {$marker['info']}"; + if (!empty($marker['name'])) { + $person=Person::getInstance($marker['name']); + if ($person && $person->canDisplayName()) { + $tool_tip.=": ".PrintReady($person->getFullName()); + } + } + if (!empty($marker['date'])) { + $date=new GedcomDate($marker['date']); + $tool_tip.=" - ".$date->Display(false); + } + return $tool_tip; +// dates & RTL is not OK - adding PrintReady does not solve it +} + +function create_indiv_buttons() { + ?> + <style type="text/css"> + #map_type + { + margin: 0; + padding: 0; + font-family: Arial; + font-size: 10px; + list-style: none; + } + #map_type li + { + display: block; + width: 70px; + text-align: center; + padding: 2px; + border: 1px solid black; + cursor: pointer; + float: left; + margin-left: 2px; + } + #map_type li.non_active + { + background: white; + color: black; + font-weight: normal; + } + #map_type li.active + { + background: gray; + color: white; + font-weight: bold; + } + #map_type li:hover + { + background: #ddd; + } + #map_nav + { + position: relative; + top: -484px; + left: 101%; + } + + </style> + <script type='text/javascript'> + <!-- + function Map_type() {} + Map_type.prototype = new GControl(); + + Map_type.prototype.refresh = function() + { + this.button1.className = 'non_active'; + if(this.map.getCurrentMapType() != G_NORMAL_MAP) + this.button2.className = 'non_active'; + else + this.button2.className = 'active'; + if(this.map.getCurrentMapType() != G_SATELLITE_MAP) + this.button3.className = 'non_active'; + else + this.button3.className = 'active'; + if(this.map.getCurrentMapType() != G_HYBRID_MAP) + this.button4.className = 'non_active'; + else + this.button4.className = 'active'; + if(this.map.getCurrentMapType() != G_PHYSICAL_MAP) + this.button5.className = 'non_active'; + else + this.button5.className = 'active'; + } + + Map_type.prototype.initialize = function(place_map) + { + var list = document.createElement("ul"); + list.id = 'map_type'; + + var button1 = document.createElement('li'); + var button2 = document.createElement('li'); + var button3 = document.createElement('li'); + var button4 = document.createElement('li'); + var button5 = document.createElement('li'); + + button1.innerHTML = '<?php echo i18n::translate('Redraw map')?>'; + button2.innerHTML = '<?php echo i18n::translate('Map')?>'; + button3.innerHTML = '<?php echo i18n::translate('Satellite')?>'; + button4.innerHTML = '<?php echo i18n::translate('Hybrid')?>'; + button5.innerHTML = '<?php echo i18n::translate('Terrain')?>'; + + button1.onclick = function() { javascript:ResizeMap(); return false; }; + button2.onclick = function() { map.setMapType(G_NORMAL_MAP); return false; }; + button3.onclick = function() { map.setMapType(G_SATELLITE_MAP); return false; }; + button4.onclick = function() { map.setMapType(G_HYBRID_MAP); return false; }; + button5.onclick = function() { map.setMapType(G_PHYSICAL_MAP); return false; }; + + list.appendChild(button1); + list.appendChild(button2); + list.appendChild(button3); + list.appendChild(button4); + list.appendChild(button5); + + this.button1 = button1; + this.button2 = button2; + this.button3 = button3; + this.button4 = button4; + this.button5 = button5; + this.map = map; + map.getContainer().appendChild(list); + return list; + } + + Map_type.prototype.getDefaultPosition = function() + { + return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(2, 2)); + } + var map_type; + </script> + <?php +} + +function build_indiv_map($indifacts, $famids) { + global $GOOGLEMAP_API_KEY, $GOOGLEMAP_MAP_TYPE, $GOOGLEMAP_MIN_ZOOM, $GOOGLEMAP_MAX_ZOOM, $GEDCOM; + global $GOOGLEMAP_XSIZE, $GOOGLEMAP_YSIZE, $SHOW_LIVING_NAMES; + global $GOOGLEMAP_ENABLED, $TBLPREFIX, $TEXT_DIRECTION, $GM_DEFAULT_TOP_VALUE, $GOOGLEMAP_COORD; + + if (!$GOOGLEMAP_ENABLED) { + echo "<table class=\"facts_table\">\n"; + echo "<tr><td colspan=\"2\" class=\"facts_value\">", i18n::translate('GoogleMap module disabled'), "<script language=\"JavaScript\" type=\"text/javascript\">tabstyles[5]='tab_cell_inactive_empty'; document.getElementById('pagetab5').className='tab_cell_inactive_empty';</script></td></tr>\n"; + echo "<script type=\"text/javascript\">\n"; + echo "function ResizeMap ()\n{\n}\nfunction SetMarkersAndBounds ()\n{\n}\n</script>\n"; + if (WT_USER_IS_ADMIN) { + echo "<tr><td align=\"center\" colspan=\"2\">\n"; + echo "<a href=\"module.php?mod=googlemap&pgvaction=editconfig\">", i18n::translate('Manage GoogleMap configuration'), "</a>"; + echo "</td></tr>\n"; + } + echo "\n\t</table>\n<br />"; + ?> + <script type="text/javascript"> + document.getElementById("googlemap_left").innerHTML = document.getElementById("googlemap_content").innerHTML; + document.getElementById("googlemap_content").innerHTML = ""; + </script> + <?php + return; + } + + $markers=array(); + + $zoomLevel = $GOOGLEMAP_MAX_ZOOM; + $placelocation=WT_DB::table_exists("{$TBLPREFIX}placelocation"); + //-- sort the facts + //sort_facts($indifacts); facts should already be sorted + $i = 0; + foreach ($indifacts as $key => $value) { + $fact = $value->getTag(); + $fact_data=$value->getDetail(); + $factrec = $value->getGedComRecord(); + $placerec = null; + if ($value->getPlace()!=null) { + $placerec = get_sub_record(2, "2 PLAC", $factrec); + $addrFound = false; + } else { + if (preg_match("/\d ADDR (.*)/", $factrec, $match)) { + $placerec = get_sub_record(1, "\d ADDR", $factrec); + $addrFound = true; + } + } + if (!empty($placerec)) { + $ctla = preg_match("/\d LATI (.*)/", $placerec, $match1); + $ctlo = preg_match("/\d LONG (.*)/", $placerec, $match2); + $spouserec = get_sub_record(2, "2 _PGVS", $factrec); + $ctlp = preg_match("/\d _PGVS @(.*)@/", $spouserec, $spouseid); + if ($ctlp>0) { + $useThisItem = displayDetailsById($spouseid[1]); + } else { + $useThisItem = true; + } + if (($ctla>0) && ($ctlo>0) && ($useThisItem==true)) { + $i = $i + 1; + $markers[$i]=array('class'=>'optionbox', 'index'=>'', 'tabindex'=>'', 'placed'=>'no'); + if ($fact == "EVEN" || $fact=="FACT") { + $eventrec = get_sub_record(1, "2 TYPE", $factrec); + if (preg_match("/\d TYPE (.*)/", $eventrec, $match3)) { + $markers[$i]["fact"]=i18n::translate($match3[1]); + } else { + $markers[$i]["fact"]=i18n::translate($fact); + } + } else { + $markers[$i]["fact"]=i18n::translate($fact); + } + if (!empty($fact_data) && $fact_data!='Y') + $markers[$i]["info"] = $fact_data; + $markers[$i]["placerec"] = $placerec; + $match1[1] = trim($match1[1]); + $match2[1] = trim($match2[1]); + $markers[$i]["lati"] = str_replace(array('N', 'S', ','), array('', '-', '.') , $match1[1]); + $markers[$i]["lng"] = str_replace(array('E', 'W', ','), array('', '-', '.') , $match2[1]); + $ctd = preg_match("/2 DATE (.+)/", $factrec, $match); + if ($ctd>0) + $markers[$i]["date"] = $match[1]; + if ($ctlp>0) + $markers[$i]["name"]=$spouseid[1]; + } else { + if (($placelocation == true) && ($useThisItem==true) && ($addrFound==false)) { + $ctpl = preg_match("/\d PLAC (.*)/", $placerec, $match1); + $latlongval = get_lati_long_placelocation($match1[1]); + if ((count($latlongval) == 0) && (!empty($GM_DEFAULT_TOP_VALUE))) { + $latlongval = get_lati_long_placelocation($match1[1].", ".$GM_DEFAULT_TOP_VALUE); + if ((count($latlongval) != 0) && ($latlongval["level"] == 0)) { + $latlongval["lati"] = NULL; + $latlongval["long"] = NULL; + } + } + if ((count($latlongval) != 0) && ($latlongval["lati"] != NULL) && ($latlongval["long"] != NULL)) { + $i = $i + 1; + $markers[$i]=array('class'=>'optionbox', 'index'=>'', 'tabindex'=>'', 'placed'=>'no'); + if ($fact == "EVEN" || $fact=="FACT") { + $eventrec = get_sub_record(1, "2 TYPE", $factrec); + if (preg_match("/\d TYPE (.*)/", $eventrec, $match3)) { + $markers[$i]["fact"]=i18n::translate($match3[1]); + } else { + $markers[$i]["fact"]=i18n::translate($fact); + } + } else { + $markers[$i]["fact"]=i18n::translate($fact); + } + if (!empty($fact_data) && $fact_data!='Y') + $markers[$i]["info"] = $fact_data; + $markers[$i]["icon"] = $latlongval["icon"]; + $markers[$i]["placerec"] = $placerec; + if ($zoomLevel > $latlongval["zoom"]) $zoomLevel = $latlongval["zoom"]; + $markers[$i]["lati"] = str_replace(array('N', 'S', ','), array('', '-', '.') , $latlongval["lati"]); + $markers[$i]["lng"] = str_replace(array('E', 'W', ','), array('', '-', '.') , $latlongval["long"]); + $ctd = preg_match("/2 DATE (.+)/", $factrec, $match); + if ($ctd>0) + $markers[$i]["date"] = $match[1]; + if ($ctlp>0) + $markers[$i]["name"]=$spouseid[1]; + } + } + } + } + } + + // Add children to the list + if (count($famids)>0) { + $hparents=false; + for($f=0; $f<count($famids); $f++) { + if (!empty($famids[$f])) { + $famrec = find_family_record($famids[$f], WT_GED_ID); + if (empty($famrec)) $famrec = find_updated_record($famids[$f], WT_GED_ID); + if ($famrec) { + $num = preg_match_all("/1\s*CHIL\s*@(.*)@/", $famrec, $smatch, PREG_SET_ORDER); + for($j=0; $j<$num; $j++) { + $person=Person::getInstance($smatch[$j][1]); + if ($person->canDisplayDetails()) { + $srec = find_person_record($smatch[$j][1], WT_GED_ID); + $birthrec = ''; + $placerec = ''; + foreach ($person->getAllFactsByType('BIRT') as $sEvent) { + $birthrec = $sEvent->getGedcomRecord(); + $placerec = get_sub_record(2, "2 PLAC", $birthrec); + if (!empty($placerec)) { + $ctd = preg_match("/\d DATE (.*)/", $birthrec, $matchd); + $ctla = preg_match("/\d LATI (.*)/", $placerec, $match1); + $ctlo = preg_match("/\d LONG (.*)/", $placerec, $match2); + if (($ctla>0) && ($ctlo>0)) { + $i = $i + 1; + $markers[$i]=array('index'=>'', 'tabindex'=>'', 'placed'=>'no'); + if (strpos($srec, "\n1 SEX F")!==false) { + $markers[$i]["fact"] = i18n::translate('Daughter'); + $markers[$i]["class"] = "person_boxF"; + } else + if (strpos($srec, "\n1 SEX M")!==false) { + $markers[$i]["fact"] = i18n::translate('Son'); + $markers[$i]["class"] = "person_box"; + } else { + $markers[$i]["fact"] = i18n::translate('CHIL'); + $markers[$i]["class"] = "person_boxNN"; + } + $markers[$i]["placerec"] = $placerec; + $match1[1] = trim($match1[1]); + $match2[1] = trim($match2[1]); + $markers[$i]["lati"] = str_replace(array('N', 'S', ','), array('', '-', '.'), $match1[1]); + $markers[$i]["lng"] = str_replace(array('E', 'W', ','), array('', '-', '.'), $match2[1]); + if ($ctd > 0) + $markers[$i]["date"] = $matchd[1]; + $markers[$i]["name"] = $smatch[$j][1]; + } else { + if ($placelocation == true) { + $ctpl = preg_match("/\d PLAC (.*)/", $placerec, $match1); + $latlongval = get_lati_long_placelocation($match1[1]); + if ((count($latlongval) == 0) && (!empty($GM_DEFAULT_TOP_VALUE))) { + $latlongval = get_lati_long_placelocation($match1[1].", ".$GM_DEFAULT_TOP_VALUE); + if ((count($latlongval) != 0) && ($latlongval["level"] == 0)) { + $latlongval["lati"] = NULL; + $latlongval["long"] = NULL; + } + } + if ((count($latlongval) != 0) && ($latlongval["lati"] != NULL) && ($latlongval["long"] != NULL)) { + $i = $i + 1; + $markers[$i]=array('index'=>'', 'tabindex'=>'', 'placed'=>'no'); + $markers[$i]["fact"] = i18n::translate('CHIL'); + $markers[$i]["class"] = "option_boxNN"; + if (strpos($srec, "\n1 SEX F")!==false) { + $markers[$i]["fact"] = i18n::translate('Daughter'); + $markers[$i]["class"] = "person_boxF"; + } + if (strpos($srec, "\n1 SEX M")!==false) { + $markers[$i]["fact"] = i18n::translate('Son'); + $markers[$i]["class"] = "person_box"; + } + $markers[$i]["icon"] = $latlongval["icon"]; + $markers[$i]["placerec"] = $placerec; + if ($zoomLevel > $latlongval["zoom"]) $zoomLevel = $latlongval["zoom"]; + $markers[$i]["lati"] = str_replace(array('N', 'S', ','), array('', '-', '.'), $latlongval["lati"]); + $markers[$i]["lng"] = str_replace(array('E', 'W', ','), array('', '-', '.'), $latlongval["long"]); + if ($ctd > 0) + $markers[$i]["date"] = $matchd[1]; + $markers[$i]["name"] = $smatch[$j][1]; + } + } + } + } + } + } + } + } + } + } + } + + if ($i == 0) { + echo "<table class=\"facts_table\">\n"; + echo "<tr><td colspan=\"2\" class=\"facts_value\">".i18n::translate('No map data for this person'); + //echo "<script language=\"JavaScript\" type=\"text/javascript\">tabstyles[5]='tab_cell_inactive_empty'; document.getElementById('pagetab5').className='tab_cell_inactive_empty';</script>"; + echo "</td></tr>\n"; + echo "<script type=\"text/javascript\">\n"; + echo "function ResizeMap ()\n{\n}\n</script>\n"; + if (WT_USER_IS_ADMIN) { + echo "<tr><td align=\"center\" colspan=\"2\">\n"; + echo "<a href=\"module.php?mod=googlemap&pgvaction=editconfig\">", i18n::translate('Manage GoogleMap configuration'), "</a>"; + echo "</td></tr>\n"; + } + } else { + ?> + <script type="text/javascript"> + function SetMarkersAndBounds () { + var bounds = new GLatLngBounds(); + <?php + foreach ($markers as $marker) + echo "bounds.extend(new GLatLng({$marker["lati"]}, {$marker["lng"]}));\n"; + echo "SetBoundaries(bounds);\n"; + + echo "var icon = new GIcon();"; + echo "icon.image = \"http://maps.google.com/intl/pl_ALL/mapfiles/marker.png\";"; + echo "icon.shadow = \"modules/googlemap/images/shadow50.png\";"; + echo "icon.iconAnchor = new GPoint(10, 34);"; + echo "icon.infoWindowAnchor = new GPoint(5, 1);"; + + echo "\nmarkers.clear();\n"; + $indexcounter = 0; + for ($j=1; $j<=$i; $j++) { + // Use @ because some installations give warnings (but not errors?) about UTF-8 + $tooltip=@html_entity_decode(strip_tags(tool_tip_text($markers[$j])), ENT_QUOTES, 'UTF-8'); + if ($markers[$j]["placed"] == "no") { + $multimarker = -1; + // Count nr of locations where the long/lati is identical + for($k=$j; $k<=$i; $k++) + if (($markers[$j]["lati"] == $markers[$k]["lati"]) && ($markers[$j]["lng"] == $markers[$k]["lng"])) + $multimarker = $multimarker + 1; + + if ($multimarker == 0) { // Only one location with this long/lati combination + $markers[$j]["placed"] = "yes"; + if (($markers[$j]["lati"] == NULL) || ($markers[$j]["lng"] == NULL) || (($markers[$j]["lati"] == "0") && ($markers[$j]["lng"] == "0"))) { + echo "var Marker{$j}_flag = new GIcon();\n"; + echo " Marker{$j}_flag.image = \"modules/googlemap/images/marker_yellow.png\";\n"; + echo " Marker{$j}_flag.shadow = \"modules/googlemap/images/shadow50.png\";\n"; + echo " Marker{$j}_flag.iconSize = new GSize(20, 34);\n"; + echo " Marker{$j}_flag.shadowSize = new GSize(37, 34);\n"; + echo " Marker{$j}_flag.iconAnchor = new GPoint(10, 34);\n"; + echo " Marker{$j}_flag.infoWindowAnchor = new GPoint(5, 1);\n"; + echo "var Marker{$j} = new GMarker(new GLatLng(0, 0), {icon:Marker{$j}_flag, title:\"", addslashes($tooltip), "\"});\n"; + } else if (empty($markers[$j]["icon"])) { + echo "var Marker{$j} = new GMarker(new GLatLng({$markers[$j]["lati"]}, {$markers[$j]["lng"]}), {icon:icon, title:\"", addslashes($tooltip), "\"});\n"; + } else { + echo "var Marker{$j}_flag = new GIcon();\n"; + echo " Marker{$j}_flag.image = \"", $markers[$j]["icon"], "\";\n"; + echo " Marker{$j}_flag.shadow = \"modules/googlemap/images/flag_shadow.png\";\n"; + echo " Marker{$j}_flag.iconSize = new GSize(25, 15);\n"; + echo " Marker{$j}_flag.shadowSize = new GSize(35, 45);\n"; + echo " Marker{$j}_flag.iconAnchor = new GPoint(1, 45);\n"; + echo " Marker{$j}_flag.infoWindowAnchor = new GPoint(5, 1);\n"; + echo "var Marker{$j} = new GMarker(new GLatLng(", $markers[$j]["lati"], ", ", $markers[$j]["lng"], "), {icon:Marker{$j}_flag, title:\"", addslashes($tooltip), "\"});\n"; + } + echo "GEvent.addListener(Marker{$j}, \"click\", function() {\n"; + echo "Marker{$j}.openInfoWindowHtml(\"<div class='iwstyle'>"; + echo PrintReady($markers[$j]["fact"]); + if (!empty($markers[$j]['info'])) + echo ': ', addslashes($markers[$j]['info']); + if (!empty($markers[$j]["name"])) { + $person=Person::getInstance($markers[$j]['name']); + if ($person) { + echo ': <a href=\"', $person->getLinkUrl(), '\">', $person->canDisplayName() ? PrintReady(addcslashes($person->getFullName(), '"')) : i18n::translate('Private'), '</a>'; + } + } + echo "<br />"; + if (preg_match("/2 PLAC (.*)/", $markers[$j]["placerec"]) == 0) { + print_address_structure_map($markers[$j]["placerec"], 1); + } else { + echo preg_replace("/\"/", "\\\"", print_fact_place_map($markers[$j]["placerec"])); + } + if (!empty($markers[$j]["date"])) { + $date=new GedcomDate($markers[$j]["date"]); + echo "<br />", addslashes($date->Display(true)); + } + if (($markers[$j]["lati"] == NULL) || ($markers[$j]["lng"] == NULL) || (($markers[$j]["lati"] == "0") && ($markers[$j]["lng"] == "0"))) { + echo "<br /><br />", i18n::translate('This place has no coordinates'); + if (WT_USER_IS_ADMIN) + echo '<br /><a href=\"module.php?mod=googlemap&pgvaction=places&display=inactive\">', i18n::translate('Edit geographic location'), '</a>'; + echo "\");\n"; + } + else if (!$GOOGLEMAP_COORD){ + echo "\");\n"; + } else { + echo "<br /><br />"; + if ($markers[$j]["lati"]>'0'){echo "N", str_replace('-', '', $markers[$j]["lati"]);}else{ echo str_replace('-', 'S', $markers[$j]["lati"]);} + echo ", "; + if ($markers[$j]["lng"]>'0'){echo "E", str_replace('-', '', $markers[$j]["lng"]);}else{ echo str_replace('-', 'W', $markers[$j]["lng"]);} + echo "\");\n"; + } + echo "});\n"; + echo "markers.push(Marker{$j});\n"; + echo "map.addOverlay(Marker{$j});\n"; + $markers[$j]["index"] = $indexcounter; + $markers[$j]["tabindex"] = 0; + $indexcounter = $indexcounter + 1; + } else { + $tabcounter = 0; + $markersindex = 0; + $markers[$j]["placed"] = "yes"; + if (empty($markers[$j]["icon"])) { + echo "var Marker{$j}_{$markersindex} = new GMarker(new GLatLng(", $markers[$j]["lati"], ", ", $markers[$j]["lng"], "), {icon:icon, title:\"", addslashes($tooltip), "\"});\n"; + } else { + echo "var Marker{$j}_{$markersindex}_flag = new GIcon();\n"; + echo " Marker{$j}_{$markersindex}_flag.image = \"", $markers[$j]["icon"], "\";\n"; + echo " Marker{$j}_{$markersindex}_flag.shadow = \"modules/googlemap/images/flag_shadow.png\";\n"; + echo " Marker{$j}_{$markersindex}_flag.iconSize = new GSize(25, 15);\n"; + echo " Marker{$j}_{$markersindex}_flag.shadowSize = new GSize(35, 45);\n"; + echo " Marker{$j}_{$markersindex}_flag.iconAnchor = new GPoint(1, 45);\n"; + echo " Marker{$j}_{$markersindex}_flag.infoWindowAnchor = new GPoint(5, 1);\n"; + echo "var Marker{$j}_{$markersindex} = new GMarker(new GLatLng(", $markers[$j]["lati"], ", ", $markers[$j]["lng"], "), {icon:Marker{$j}_{$markersindex}_flag, title:\"", addslashes($tooltip), "\"});\n"; + } + echo "var Marker{$j}_{$markersindex}Info = [\n"; + $markers[$j]["index"] = $indexcounter; + $markers[$j]["tabindex"] = $tabcounter; + $tabcounter = $tabcounter + 1; + echo "new GInfoWindowTab(\"", abbreviate($markers[$j]["fact"]), "\", \"<div class='iwstyle'>", PrintReady($markers[$j]["fact"]); + if (!empty($markers[$j]['info'])) + echo ': ', addslashes($markers[$j]['info']); + if (!empty($markers[$j]["name"])) { + $person=Person::getInstance($markers[$j]['name']); + if ($person) { + echo ': <a href=\"', $person->getLinkUrl(), '\">', $person->canDisplayName() ? PrintReady(addcslashes($person->getFullName(), '"')) : i18n::translate('Private'), '</a>'; + } + } + echo "<br />"; + if (preg_match("/2 PLAC (.*)/", $markers[$j]["placerec"]) == 0) { + print_address_structure_map($markers[$j]["placerec"], 1); + } else { + echo preg_replace("/\"/", "\\\"", print_fact_place_map($markers[$j]["placerec"])); + } + if (!empty($markers[$j]["date"])) { + $date=new GedcomDate($markers[$j]["date"]); + echo "<br />", addslashes($date->Display(true)); + } + if (!$GOOGLEMAP_COORD){ + echo "\")"; + } else { + echo "<br /><br />"; + if ($markers[$j]["lati"]>='0'){echo "N", str_replace('-', '', $markers[$j]["lati"]);}else{ echo str_replace('-', 'S', $markers[$j]["lati"]);} + echo ", "; + if ($markers[$j]["lng"]>='0'){echo "E", str_replace('-', '', $markers[$j]["lng"]);}else{ echo str_replace('-', 'W', $markers[$j]["lng"]);} + echo "\")"; + } + for($k=$j+1; $k<=$i; $k++) { + if (($markers[$j]["lati"] == $markers[$k]["lati"]) && ($markers[$j]["lng"] == $markers[$k]["lng"])) { + $markers[$k]["placed"] = "yes"; + $markers[$k]["index"] = $indexcounter; + if ($tabcounter == 4) { + // Use @ because some installations give warnings (but not errors?) about UTF-8 + $tooltip=@html_entity_decode(strip_tags(tool_tip_text($markers[$k])), ENT_QUOTES, 'UTF-8'); + echo "\n"; + echo "];\n"; + echo "GEvent.addListener(Marker{$j}_{$markersindex}, \"click\", function(tabToSelect) {\n"; + echo "if (tabToSelect>0) \n"; + echo "Marker{$j}_{$markersindex}.openInfoWindowTabsHtml(Marker{$j}_{$markersindex}Info, {selectedTab: tabToSelect});\n"; + echo "else Marker{$j}_{$markersindex}.openInfoWindowTabsHtml(Marker{$j}_{$markersindex}Info);\n"; + echo "});\n"; + echo "markers.push(Marker{$j}_{$markersindex});\n"; + echo "map.addOverlay(Marker{$j}_{$markersindex});\n"; + $indexcounter = $indexcounter + 1; + $tabcounter = 0; + $markersindex = $markersindex + 1; + + if (empty($markers[$j]["icon"])) { + echo "var Marker{$j}_{$markersindex} = new GMarker(new GLatLng(", ($markers[$j]["lati"]-(0.0015*$markersindex)), ", ", ($markers[$j]["lng"]+(0.0025*$markersindex)), "), {icon:icon, title:\"", addslashes($tooltip), "\"});\n"; + } else { + echo "var Marker{$j}_{$markersindex}_flag = new GIcon();\n"; + echo " Marker{$j}_{$markersindex}_flag.image = \"", $markers[$j]["icon"], "\";\n"; + echo " Marker{$j}_{$markersindex}_flag.shadow = \"modules/googlemap/images/flag_shadow.png\";\n"; + echo " Marker{$j}_{$markersindex}_flag.iconSize = new GSize(25, 15);\n"; + echo " Marker{$j}_{$markersindex}_flag.shadowSize = new GSize(35, 45);\n"; + echo " Marker{$j}_{$markersindex}_flag.iconAnchor = new GPoint(1, 45);\n"; + echo " Marker{$j}_{$markersindex}_flag.infoWindowAnchor = new GPoint(5, 1);\n"; + echo "var Marker{$j}_{$markersindex} = new GMarker(new GLatLng(", ($markers[$j]["lati"]-(0.0015*$markersindex)), ", ", ($markers[$j]["lng"]+(0.0025*$markersindex)), "), {icon:Marker{$j}_{$markersindex}_flag, title:\"", addslashes($tooltip), "\"});\n"; + } + echo "var Marker{$j}_{$markersindex}Info = [\n"; + } else { + echo ", \n"; + } + $markers[$k]["index"] = $indexcounter; + $markers[$k]["tabindex"] = $tabcounter; + $tabcounter = $tabcounter + 1; + echo "new GInfoWindowTab(\"", abbreviate($markers[$k]["fact"]), "\", \"<div class='iwstyle'>", $markers[$k]["fact"]; + if (!empty($markers[$k]['info'])) + echo ': ', addslashes($markers[$k]['info']); + if (!empty($markers[$k]["name"])) { + $person=Person::getInstance($markers[$k]['name']); + if ($person) { + echo ': <a href=\"', $person->getLinkUrl(), '\">', $person->canDisplayName() ? PrintReady(addcslashes($person->getFullName(), '"')) : i18n::translate('Private'), '</a>'; + } + } + echo "<br />"; + if (preg_match("/2 PLAC (.*)/", $markers[$k]["placerec"]) == 0) { + print_address_structure_map($markers[$k]["placerec"], 1); + } else { + echo preg_replace("/\"/", "\\\"", print_fact_place_map($markers[$k]["placerec"])); + } + if (!empty($markers[$k]["date"])) { + $date=new GedcomDate($markers[$k]["date"]); + echo "<br />", addslashes($date->Display(true)); + } + if (!$GOOGLEMAP_COORD){ + echo "\")"; + } else { + echo "<br /><br />"; + if ($markers[$j]["lati"]>='0'){echo "N", str_replace('-', '', $markers[$j]["lati"]);}else{ echo str_replace('-', 'S', $markers[$j]["lati"]);} + echo ", "; + if ($markers[$j]["lng"]>='0'){echo "E", str_replace('-', '', $markers[$j]["lng"]);}else{ echo str_replace('-', 'W', $markers[$j]["lng"]);} + echo "\")"; + } + } + } + echo "\n"; + echo "];\n"; + echo "GEvent.addListener(Marker{$j}_{$markersindex}, \"click\", function(tabToSelect) {\n"; + echo "if (tabToSelect>0) \n"; + echo "Marker{$j}_{$markersindex}.openInfoWindowTabsHtml(Marker{$j}_{$markersindex}Info, {selectedTab: tabToSelect});\n"; + echo "else Marker{$j}_{$markersindex}.openInfoWindowTabsHtml(Marker{$j}_{$markersindex}Info);\n"; + echo "});\n"; + echo "markers.push(Marker{$j}_{$markersindex});\n"; + echo "map.addOverlay(Marker{$j}_{$markersindex});\n"; + $indexcounter = $indexcounter + 1; + } + } + } + ?> + } </script> + <?php + echo "<div style=\"overflow: auto; overflow-x: hidden; overflow-y: auto; height: {$GOOGLEMAP_YSIZE}px;\"><table class=\"facts_table\">"; + foreach($markers as $marker) { + echo "<tr><td class=\"facts_label\">"; + echo "<a href=\"javascript:highlight({$marker["index"]}, {$marker["tabindex"]})\">{$marker["fact"]}</a></td>"; + echo "<td class=\"{$marker['class']}\" style=\"white-space: normal\">"; + if (!empty($marker["info"])) + echo "<span class=\"field\">{$marker["info"]}</span><br />"; + if (!empty($marker["name"])) { + $person=Person::getInstance($marker['name']); + if ($person) { + echo '<a href="', $person->getLinkUrl(), '">', $person->canDisplayName() ? PrintReady($person->getFullName()) : i18n::translate('Private'), '</a>'; + } + echo '<br />'; + } + if (preg_match("/2 PLAC (.*)/", $marker["placerec"]) == 0) { + print_address_structure_map($marker["placerec"], 1); + } else { + echo print_fact_place_map($marker["placerec"]), "<br />"; + } + if (!empty($marker['date'])) { + $date=new GedcomDate($marker['date']); + echo $date->Display(true), "<br />"; + } + echo "</td></tr>"; + } + echo "</table></div><br />"; + } + echo "\n<br />"; + + return $i; +} + +?> |
