"; echo "
"; echo ""; return false; } if ($count==0) $count = rand(); $lbwidth = $bwidth*.75; if ($lbwidth < 150) $lbwidth = 150; $tmp=array('M'=>'', 'F'=>'F', 'U'=>'NN'); $isF=$tmp[$person->getSex()]; $personlinks = ""; $icons = ""; $classfacts = ""; $genderImage = ""; $BirthDeath = ""; $outBoxAdd = ""; $thumbnail = ""; $showid = ""; $iconsStyleAdd = "float: right; "; if ($TEXT_DIRECTION=="rtl") $iconsStyleAdd="float: left; "; $disp=$person->canDisplayDetails(); $boxID = $pid.".".$personcount.".".$count; $mouseAction1 = "onmouseover=\"clear_family_box_timeout('".$boxID."');\" onmouseout=\"family_box_timeout('".$boxID."');\""; $mouseAction2 = " onmouseover=\"expandbox('".$boxID."', $style); return false;\" onmouseout=\"restorebox('".$boxID."', $style); return false;\""; $mouseAction3 = " onmousedown=\"expandbox('".$boxID."', $style); return false;\" onmouseup=\"restorebox('".$boxID."', $style); return false;\""; $mouseAction4 = " onclick=\"expandbox('".$boxID."', $style); return false;\""; if ($person->canDisplayName()) { if ($show_famlink && (empty($SEARCH_SPIDER))) { if ($LINK_ICONS!="disabled") { //-- draw a box for the family popup // NOTE: Start div I.$pid.$personcount.$count.links $personlinks .= "
"; // NOTE: Zoom if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Pedigree Chart').": ".$pid; else $title = $pid." :".i18n::translate('Pedigree Chart'); $personlinks .= "".i18n::translate('Pedigree Tree').""; if (file_exists(WT_ROOT.'modules/googlemap/pedigree_map.php')) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Pedigree Map').": ".$pid; else $title = $pid." :".i18n::translate('Pedigree Map'); $personlinks .= "
".i18n::translate('Pedigree Map').""; } $username = WT_USER_NAME; if (!empty($username)) { $myid=WT_USER_GEDCOM_ID; if ($myid && $myid!=$pid) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Relationship Chart').": ".$pid; else $title = $pid." :".i18n::translate('Relationship Chart'); $personlinks .= "
".i18n::translate('Relationship to me').""; } } if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Descendancy chart').": ".$pid; else $title = $pid." :".i18n::translate('Descendancy chart'); $personlinks .= "
".i18n::translate('Descendancy chart')."
"; if (file_exists(WT_ROOT.'ancestry.php')) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Ancestry chart').": ".$pid; else $title = $pid." :".i18n::translate('Ancestry chart'); $personlinks .= "".i18n::translate('Ancestry chart')."
"; } if (file_exists(WT_ROOT.'compact.php')) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Compact Chart').": ".$pid; else $title = $pid." :".i18n::translate('Compact Chart'); $personlinks .= "".i18n::translate('Compact Chart')."
"; } if (file_exists(WT_ROOT.'fanchart.php') and defined("IMG_ARC_PIE") and function_exists("imagettftext")) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Circle diagram').": ".$pid; else $title = $pid." :".i18n::translate('Circle diagram'); $personlinks .= "".i18n::translate('Circle diagram')."
"; } if (file_exists(WT_ROOT.'hourglass.php')) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Hourglass chart').": ".$pid; else $title = $pid." :".i18n::translate('Hourglass chart'); $personlinks .= "".i18n::translate('Hourglass chart')."
"; } if (file_exists(WT_ROOT.'treenav.php')) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Interactive tree').": ".$pid; else $title = $pid." :".i18n::translate('Interactive tree'); $personlinks .= "".i18n::translate('Interactive tree')."
"; } $fams = $person->getSpouseFamilies(); /* @var $family Family */ foreach($fams as $famid=>$family) { if (!is_null($family)) { $spouse = $family->getSpouse($person); $children = $family->getChildren(); $num = count($children); if ((!empty($spouse))||($num>0)) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Family book chart').": ".$famid; else $title = $famid." :".i18n::translate('Family book chart'); $personlinks .= "".i18n::translate('Family with spouse')."
"; if (!empty($spouse)) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Individual information').": ".$spouse->getXref(); else $title = $spouse->getXref()." :".i18n::translate('Individual information'); $personlinks .= "getLinkUrl())."\" title=\"$title\" $mouseAction1>"; if ($spouse->canDisplayName()) $personlinks .= PrintReady($spouse->getFullName()); else $personlinks .= i18n::translate('Private'); $personlinks .= "
"; } } /* @var $child Person */ foreach($children as $c=>$child) { if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Individual information').": ".$child->getXref(); else $title = $child->getXref()." :".i18n::translate('Individual information'); $personlinks .= "  getLinkUrl())."\" title=\"$title\" $mouseAction1>"; if ($child->canDisplayName()) $personlinks .= PrintReady($child->getFullName()); else $personlinks .= i18n::translate('Private'); $personlinks .= "
"; } } } $personlinks .= "
"; } // NOTE: Start div out-$pid.$personcount.$count if ($style==1) $outBoxAdd .= " class=\"person_box$isF\" style=\"width: ".$bwidth."px; height: ".$bheight."px; padding: 2px; overflow: hidden; z-index:'-1';\""; else $outBoxAdd .= " style=\"padding: 2px;\""; // NOTE: Zoom if (($ZOOM_BOXES!="disabled")&&(!$show_full)) { if ($ZOOM_BOXES=="mouseover") $outBoxAdd .= $mouseAction2; if ($ZOOM_BOXES=="mousedown") $outBoxAdd .= $mouseAction3; if (($ZOOM_BOXES=="click")&&($view!="preview")) $outBoxAdd .= $mouseAction4; } //-- links and zoom icons // NOTE: Start div icons-$personcount.$pid.$count if ($show_full) $iconsStyleAdd .= " display: block;"; else $iconsStyleAdd .= " display: none;"; //echo "\">"; // NOTE: Zoom if (($ZOOM_BOXES!="disabled")&&($show_full)) { $icons .= ""; } if ($LINK_ICONS!="disabled") { $click_link="javascript:;"; if (WT_SCRIPT_NAME=='pedigree.php') { $click_link=encode_url("pedigree.php?rootid={$pid}&show_full={$PEDIGREE_FULL_DETAILS}&PEDIGREE_GENERATIONS={$OLD_PGENS}&talloffset={$talloffset}&ged={$GEDCOM}"); $whichID=$pid; } if (WT_SCRIPT_NAME=='hourglass.php') { $click_link=encode_url("hourglass.php?pid={$pid}&show_full={$PEDIGREE_FULL_DETAILS}&generations={$generations}&box_width={$box_width}&ged={$GEDCOM}"); $whichID=$pid; } if (WT_SCRIPT_NAME=='ancestry.php') { $click_link=encode_url("ancestry.php?rootid={$pid}&show_full={$PEDIGREE_FULL_DETAILS}&chart_style={$chart_style}&PEDIGREE_GENERATIONS={$OLD_PGENS}&box_width={$box_width}&ged={$GEDCOM}"); $whichID=$pid; } if (WT_SCRIPT_NAME=='descendancy.php') { $click_link=encode_url("descendancy.php?&show_full={$PEDIGREE_FULL_DETAILS}&pid={$pid}&agenerations={$generations}&box_width={$box_width}&ged={$GEDCOM}"); $whichID=$pid; } if (WT_SCRIPT_NAME=='family.php' && !empty($famid)) { $click_link=encode_url("family.php?famid={$famid}&show_full=1&ged={$GEDCOM}"); $whichID=$famid; } if (WT_SCRIPT_NAME=='individual.php') { $click_link=encode_url("individual.php?pid={$pid}&ged={$GEDCOM}"); $whichID=$pid; } $icons .= ""; } } else { if ($style==1) { $outBoxAdd .= "class=\"person_box$isF\" style=\"width: ".$bwidth."px; height: ".$bheight."px; padding: 2px; overflow: hidden;\""; } else { $outBoxAdd .= "class=\"person_box$isF\" style=\"padding: 2px; overflow: hidden;\""; } // NOTE: Zoom if (($ZOOM_BOXES!="disabled")&&(empty($SEARCH_SPIDER))) { if ($ZOOM_BOXES=="mouseover") $outBoxAdd .= $mouseAction2; if ($ZOOM_BOXES=="mousedown") $outBoxAdd .= $mouseAction3; if (($ZOOM_BOXES=="click")&&($view!="preview")) $outBoxAdd .= $mouseAction4; } } } else { if ($style==1) $outBoxAdd .= "class=\"person_box$isF\" style=\"width: ".$bwidth."px; height: ".$bheight."px; padding: 2px; overflow: hidden;\""; else $outBoxAdd .= "class=\"person_box$isF\" style=\"padding: 2px; overflow: hidden;\""; } //-- find the name $name = $person->getFullName(); if ($MULTI_MEDIA && $SHOW_HIGHLIGHT_IMAGES) { if (showFact("OBJE", $pid)) { $object = $person->findHighlightedMedia(); if (!empty($object)) { $whichFile = thumb_or_main($object); // Do we send the main image or a thumbnail? $size = findImageSize($whichFile); $class = "pedigree_image_portrait"; if ($size[0]>$size[1]) $class = "pedigree_image_landscape"; if ($TEXT_DIRECTION == "rtl") $class .= "_rtl"; // NOTE: IMG ID $imgsize = findImageSize($object["file"]); $imgwidth = $imgsize[0]+50; $imgheight = $imgsize[1]+150; if (WT_USE_LIGHTBOX) { $thumbnail .= ""; } else if (!empty($object['mid']) && $USE_MEDIA_VIEWER) { $thumbnail .= ""; } else { $thumbnail .= ""; } $thumbnail .= "\"\"getSex(); $thumbnail = "\"\""; } } else if ($USE_SILHOUETTE && isset($WT_IMAGES["default_image_U"]["other"])) { $class = "pedigree_image_portrait"; if ($TEXT_DIRECTION == "rtl") $class .= "_rtl"; $sex = $person->getSex(); $thumbnail = "\"\""; } } //-- find additional name $addname=$person->getAddName(); //$name = PrintReady(htmlspecialchars(strip_tags($name), ENT_QUOTES, 'UTF-8')); $name = PrintReady($name); if ($TEXT_DIRECTION=="ltr") $title = i18n::translate('Individual information').": ".$pid; else $title = $pid." :".i18n::translate('Individual information'); // add optional CSS style for each fact $indirec = $person->getGedcomRecord(); $cssfacts = array("BIRT", "CHR", "DEAT", "BURI", "CREM", "ADOP", "BAPM", "BARM", "BASM", "BLES", "CHRA", "CONF", "FCOM", "ORDN", "NATU", "EMIG", "IMMI", "CENS", "PROB", "WILL", "GRAD", "RETI", "CAST", "DSCR", "EDUC", "IDNO", "NATI", "NCHI", "NMR", "OCCU", "PROP", "RELI", "RESI", "SSN", "TITL", "BAPL", "CONL", "ENDL", "SLGC", "_MILI"); foreach($cssfacts as $indexval => $fact) { if (strpos($indirec, "1 $fact")!==false) $classfacts .= " $fact"; } if ($PEDIGREE_SHOW_GENDER) $genderImage = " ".$person->getSexImage('small', "box-$boxID-gender"); if ($SHOW_ID_NUMBERS) { if ($TEXT_DIRECTION=="ltr") $showid .= "" . getLRM() . "($pid)" . getLRM() . " "; else $showid .= "" . getRLM() . "($pid)" . getRLM() . " "; } if (strlen($addname) > 0) { $tempStyle = $style; if (hasRTLText($addname) && $style=='1') $tempStyle = '2'; $addname = "
".PrintReady($addname).""; } if ($SHOW_LDS_AT_GLANCE) { $addname = ' '.get_lds_glance($indirec).'' . $addname; } if ($show_full) { $opt_tags=preg_split('/\W/', $CHART_BOX_TAGS, 0, PREG_SPLIT_NO_EMPTY); // Show BIRT or equivalent event foreach (explode('|', WT_EVENTS_BIRT) as $birttag) { if (!in_array($birttag, $opt_tags)) { $event = $person->getFactByType($birttag); if (!is_null($event) && $event->canShow()) { $BirthDeath .= $event->print_simple_fact(true); break; } } } // Show optional events (before death) foreach ($opt_tags as $key=>$tag) { if (!preg_match('/^('.WT_EVENTS_DEAT.')$/', $tag)) { $event = $person->getFactByType($tag); if (!is_null($event) && $event->canShow()) { $BirthDeath .= $event->print_simple_fact(true); unset ($opt_tags[$key]); } } } // Show DEAT or equivalent event foreach (explode('|', WT_EVENTS_DEAT) as $deattag) { $event = $person->getFactByType($deattag); if (!is_null($event) && $event->canShow()) { $BirthDeath .= $event->print_simple_fact(true); if (in_array($deattag, $opt_tags)) { unset ($opt_tags[array_search($deattag, $opt_tags)]); } break; } } // Show remaining optional events (after death) foreach ($opt_tags as $tag) { $event = $person->getFactByType($tag); if (!is_null($event) && $event->canShow()) { $BirthDeath .= $event->print_simple_fact(true); } } } global $THEME_DIR; require $THEME_DIR.'templates/personbox_template.php'; } /** * print out standard HTML header * * This function will print out the HTML, HEAD, and BODY tags and will load in the CSS javascript and * other auxiliary files needed to run PGV. It will also include the theme specific header file. * This function should be called by every page, except popups, before anything is output. * * Popup pages, because of their different format, should invoke function print_simple_header() instead. * * @param string $title the title to put in the header tags * @param string $head * @param boolean $use_alternate_styles */ function print_header($title, $head="", $use_alternate_styles=true) { global $bwidth; global $HOME_SITE_URL, $HOME_SITE_TEXT, $SERVER_URL; global $BROWSERTYPE, $SEARCH_SPIDER; global $view, $cart; global $WT_IMAGE_DIR, $GEDCOM, $GEDCOM_TITLE, $COMMON_NAMES_THRESHOLD, $INDEX_DIRECTORY; global $QUERY_STRING, $action, $query, $theme_name; global $FAVICON, $stylesheet, $print_stylesheet, $rtl_stylesheet, $headerfile, $toplinks, $THEME_DIR, $print_headerfile; global $WT_IMAGES, $TEXT_DIRECTION, $ONLOADFUNCTION, $REQUIRE_AUTHENTICATION, $SHOW_SOURCES, $ENABLE_RSS, $RSS_FORMAT; global $META_AUTHOR, $META_PUBLISHER, $META_COPYRIGHT, $META_DESCRIPTION, $META_PAGE_TOPIC, $META_AUDIENCE, $META_PAGE_TYPE, $META_ROBOTS, $META_REVISIT, $META_KEYWORDS, $META_TITLE; // TODO: Shouldn't this be in session.php? // If not on allowed list, dump the spider onto the redirect page. // This kills recognized spiders in their tracks. // To stop unrecognized spiders, see META_ROBOTS below. if ($SEARCH_SPIDER) { if ( !(WT_SCRIPT_NAME=='individual.php' || WT_SCRIPT_NAME=='indilist.php' || WT_SCRIPT_NAME=='login.php' || WT_SCRIPT_NAME=='family.php' || WT_SCRIPT_NAME=='famlist.php' || WT_SCRIPT_NAME=='help_text.php' || WT_SCRIPT_NAME=='source.php' || WT_SCRIPT_NAME=='search_engine.php' || WT_SCRIPT_NAME=='index.php') ) { header("Location: search_engine.php"); exit; } } header("Content-Type: text/html; charset=UTF-8"); if (empty($META_TITLE)) $metaTitle = ' - '.WT_WEBTREES; else $metaTitle = " - ".$META_TITLE.' - '.WT_WEBTREES; $title = PrintReady(stripLRMRLM(strip_tags($title.$metaTitle), TRUE)); if ($view=='simple') { // The simple view needs to work without a database - for use during installation $GEDCOM_TITLE=WT_WEBTREES; } else { $GEDCOM_TITLE = get_gedcom_setting(WT_GED_ID, 'title'); } if ($ENABLE_RSS){ $applicationType = "application/rss+xml"; if ($RSS_FORMAT == "ATOM" || $RSS_FORMAT == "ATOM0.3"){ $applicationType = "application/atom+xml"; } } $javascript = ''; $query_string = $QUERY_STRING; if ($view!='preview' && $view!='simple') { $old_META_AUTHOR = $META_AUTHOR; $old_META_PUBLISHER = $META_PUBLISHER; $old_META_COPYRIGHT = $META_COPYRIGHT; $old_META_DESCRIPTION = $META_DESCRIPTION; $old_META_PAGE_TOPIC = $META_PAGE_TOPIC; if (empty($META_AUTHOR) || empty($META_PUBLISHER) || empty($META_COPYRIGHT)) { $user_id=get_gedcom_setting(WT_GED_ID, 'CONTACT_USER_ID'); $cuserName=getUserFullName($user_id); if (empty($META_AUTHOR )) $META_AUTHOR = $cuserName; if (empty($META_PUBLISHER)) $META_PUBLISHER = $cuserName; if (empty($META_COPYRIGHT)) $META_COPYRIGHT = $cuserName; } if (empty($META_DESCRIPTION)) { $META_DESCRIPTION = $GEDCOM_TITLE; } if (empty($META_PAGE_TOPIC)) { $META_PAGE_TOPIC = $GEDCOM_TITLE; } /* $javascript .=''; */ } $javascript.=WT_JS_START.' /* setup some javascript variables */ var query = "'.$query_string.'"; var textDirection = "'.$TEXT_DIRECTION.'"; var browserType = "'.$BROWSERTYPE.'"; var themeName = "'.strtolower($theme_name).'"; var SCRIPT_NAME = "'.WT_SCRIPT_NAME.'"; /* keep the session id when opening new windows */ var sessionid = "'.session_id().'"; var sessionname = "'.session_name().'"; var accesstime = "'.time().'"; var plusminus = new Array(); plusminus[0] = new Image(); plusminus[0].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["plus"]["other"].'"; plusminus[0].title = "'.i18n::translate('Show Details').'"; plusminus[1] = new Image(); plusminus[1].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["minus"]["other"].'"; plusminus[1].title = "'.i18n::translate('Hide Details').'"; var zoominout = new Array(); zoominout[0] = new Image(); zoominout[0].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["zoomin"]["other"].'"; zoominout[1] = new Image(); zoominout[1].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["zoomout"]["other"].'"; var arrows = new Array(); arrows[0] = new Image(); arrows[0].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["larrow2"]["other"].'"; arrows[1] = new Image(); arrows[1].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["rarrow2"]["other"].'"; arrows[2] = new Image(); arrows[2].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["uarrow2"]["other"].'"; arrows[3] = new Image(); arrows[3].src = "'.$WT_IMAGE_DIR."/".$WT_IMAGES["darrow2"]["other"].'"; '; $javascript .= 'function delete_record(pid, linenum, mediaid) { if (!mediaid) mediaid=""; if (confirm(\''.i18n::translate('Are you sure you want to delete this fact?').'\')) { window.open(\'edit_interface.php?action=delete&pid=\'+pid+\'&linenum=\'+linenum+\'&mediaid=\'+mediaid+"&"+sessionname+"="+sessionid, \'_blank\', \'top=50, left=50, width=600, height=500, resizable=1, scrollbars=1\'); } return false; } function deleteperson(pid) { if (confirm(\''.i18n::translate('Are you sure you want to delete this person?').'\')) { window.open(\'edit_interface.php?action=deleteperson&pid=\'+pid+"&"+sessionname+"="+sessionid, \'_blank\', \'top=50, left=50, width=600, height=500, resizable=1, scrollbars=1\'); } return false; } function deleterepository(pid) { if (confirm(\''.i18n::translate('Are you sure you want to delete this Repository?').'\')) { window.open(\'edit_interface.php?action=deleterepo&pid=\'+pid+"&"+sessionname+"="+sessionid, \'_blank\', \'top=50, left=50, width=600, height=500, resizable=1, scrollbars=1\'); } return false; } '; $javascript .= ' function message(username, method, url, subject) { if ((!url)||(url=="")) url=\''.urlencode(WT_SCRIPT_NAME."?".$QUERY_STRING).'\'; if ((!subject)||(subject=="")) subject=""; window.open(\'message.php?to=\'+username+\'&method=\'+method+\'&url=\'+url+\'&subject=\'+subject+"&"+sessionname+"="+sessionid, \'_blank\', \'top=50, left=50, width=600, height=500, resizable=1, scrollbars=1\'); return false; } var whichhelp = \'help_'.WT_SCRIPT_NAME.'&action='.$action.'\'; //--> '.WT_JS_END.''; $bodyOnLoad = ''; if ($view=="preview") $bodyOnLoad .= " onbeforeprint=\"hidePrint();\" onafterprint=\"showBack();\""; $bodyOnLoad .= " onload=\""; if (!empty($ONLOADFUNCTION)) $bodyOnLoad .= $ONLOADFUNCTION; if ($TEXT_DIRECTION=="rtl") { $bodyOnLoad .= " maxscroll = document.documentElement.scrollLeft;"; } $bodyOnLoad .= "\""; if ($view!='preview' && $view!='simple') { require $headerfile; $META_AUTHOR = $old_META_AUTHOR; $META_PUBLISHER = $old_META_PUBLISHER; $META_COPYRIGHT = $old_META_COPYRIGHT; $META_DESCRIPTION = $old_META_DESCRIPTION; $META_PAGE_TOPIC = $old_META_PAGE_TOPIC; } else { require $headerfile; } } /** * print simple HTML header * * This function will print out the HTML, HEAD, and BODY tags and will load in the CSS javascript and * other auxiliary files needed to run PGV. It does not include any theme specific header files. * This function should be called by every page before anything is output on popup pages. * * @param string $title the title to put in the header tags * @param string $head * @param boolean $use_alternate_styles */ function print_simple_header($title) { global $view; $view = 'simple'; print_header($title); } // -- print the html to close the page function print_footer() { global $view; global $SHOW_STATS, $QUERY_STRING, $footerfile, $print_footerfile, $ALLOW_CHANGE_GEDCOM, $printlink; global $WT_IMAGE_DIR, $theme_name, $WT_IMAGES, $TEXT_DIRECTION, $footer_count; $view = safe_get('view'); if (!isset($footer_count)) $footer_count = 1; else $footer_count++; echo ""; if ($view!="preview") { require $footerfile; } else { require $print_footerfile; echo "
"; $backlink = WT_SCRIPT_NAME."?".get_query_string(); if (!$printlink) { echo "
", i18n::translate('Print'), "
"; echo " ", i18n::translate('Back to normal view'), "
"; } $printlink = true; echo "
"; } if (function_exists("load_behaviour")) { load_behaviour(); // @see function_print_lists.php } if (WT_DEBUG_SQL) { echo WT_DB::getQueryLog(); } echo clustrmaps(); echo google_analytics(); echo ''; } // Page footer for popup/edit windows function print_simple_footer() { global $SHOW_STATS; if ($SHOW_STATS || WT_DEBUG) { echo execution_stats(); } if (WT_DEBUG_SQL) { echo WT_DB::getQueryLog(); } echo ''; } // Generate code for google analytics function google_analytics() { if (defined('WT_GOOGLE_ANALYTICS')) { return ''; } else { return ''; } } // Generate code for clustrmaps // Enable by adding // define('WT_CLUSTRMAPS', 'your website address'); // e.g. define('WT_CLUSTRMAPS', 'http://vidyasridhar.no-ip.org/'); // to the end of your config.php function clustrmaps() { if (defined('WT_CLUSTRMAPS')) { return 'Locations of visitors to this page '; } else { return ''; } } /** * Prints Exection Statistics * * prints out the execution time and the databse queries */ function execution_stats() { global $start_time, $PRIVACY_CHECKS; return sprintf("
".i18n::translate('Execution time:')." %.3f ".i18n::translate('sec.')." ".i18n::translate('Total Database Queries: ')." %d. ".i18n::translate('Total privacy checks: ')." %d. ".i18n::translate('Total Memory Usage:')." %.0f KB.
", microtime(true)-$start_time, WT_DB::getQueryCount(), $PRIVACY_CHECKS, version_compare(PHP_VERSION, '5.2.1', '>=') ? (memory_get_peak_usage(true)/1024) : (memory_get_usage()/1024) ); } //-- print a form to change the language function print_lang_form($option=0) { $language_menu=MenuBar::getLanguageMenu(); if (count($language_menu->submenus)<2) { return; } echo '
'; switch($option) { case 1: echo $language_menu->getMenu(); break; default: echo $language_menu->getMenuAsDropdown(); break; } echo '
'; } /** * print user links * * this function will print login/logout links and other links based on user privileges */ function print_user_links() { global $QUERY_STRING, $GEDCOM; global $SEARCH_SPIDER; if (WT_USER_ID) { echo '', i18n::translate('Logged in as '), ' (', WT_USER_NAME, ')
'; if (WT_USER_GEDCOM_ADMIN) { echo "", i18n::translate('Admin'), " | "; } echo "", i18n::translate('Logout'), ""; } else { $QUERY_STRING = normalize_query_string($QUERY_STRING.'&logout='); if (empty($SEARCH_SPIDER)) { if (WT_SCRIPT_NAME=='login.php') { echo "", i18n::translate('Login'), ""; } else { $LOGIN_URL=get_site_setting('LOGIN_URL'); echo "", i18n::translate('Login'), ""; } } } } // Print a link to allow email/messaging contact with a user // Optionally specify a method (used for webmaster/genealogy contacts) function user_contact_link($user_id) { $method=get_user_setting($user_id, 'contactmethod'); $fullname=getUserFullName($user_id); switch ($method) { case 'none': return ''; case 'mailto': $email=getUserEmail($user_id); return ''.htmlspecialchars($fullname).''; default: return "{$fullname}"; } } // Print a menu item to allow email/messaging contact with a user // Optionally specify a method (used for webmaster/genealogy contacts) function user_contact_menu($user_id) { $method=get_user_setting($user_id, 'contactmethod'); $fullname=getUserFullName($user_id); switch ($method) { case 'none': return array(); case 'mailto': $email=getUserEmail($user_id); return array('label'=>$fullname, 'labelpos'=>'right', 'class'=>'submenuitem', 'hoverclass'=>'submenuitem_hover', 'link'=>"mailto:{$email}"); default: return array('label'=>$fullname, 'labelpos'=>'right', 'class'=>'submenuitem', 'hoverclass'=>'submenuitem_hover', 'link'=>'#', 'onclick'=>"message('".get_user_name($user_id)."', '{$method}');return false;"); } } // print links for genealogy and technical contacts // // this function will print appropriate links based on the preferred contact methods for the genealogy // contact user and the technical support contact user function contact_links($ged_id=WT_GED_ID) { $contact_user_id =get_gedcom_setting($ged_id, 'CONTACT_USER_ID'); $webmaster_user_id=get_gedcom_setting($ged_id, 'WEBMASTER_USER_ID'); $supportLink = user_contact_link($webmaster_user_id); if ($webmaster_user_id==$contact_user_id) { $contactLink = $supportLink; } else { $contactLink = user_contact_link($contact_user_id); } if (!$supportLink && !$contactLink) { return ''; } if ($supportLink==$contactLink) { return ''; } else { $returnText = ''; return $returnText; } } function contact_menus($ged_id=WT_GED_ID) { $contact_user_id =get_gedcom_setting($ged_id, 'CONTACT_USER_ID'); $webmaster_user_id=get_gedcom_setting($ged_id, 'WEBMASTER_USER_ID'); $support_menu=user_contact_menu($webmaster_user_id); $contact_menu=user_contact_menu($contact_user_id); if (!$support_menu) { $support_menu=$contact_menu; } if (!$contact_menu) { $contact_menu=$support_menu; } if (!$support_menu) { return array(); } $menuitems=array(); if ($support_menu==$contact_menu) { $support_menu['label']=i18n::translate('Technical help contact'); $menuitems[]=$support_menu; } else { $support_menu['label']=i18n::translate('Technical help contact'); $menuitems[]=$support_menu; $contact_menu['label']=i18n::translate('Genealogy contact'); $menuitems[]=$contact_menu; } return $menuitems; } //-- print user favorites function print_favorite_selector($option=0) { global $GEDCOM, $SHOW_ID_NUMBERS, $INDEX_DIRECTORY, $QUERY_STRING; global $TEXT_DIRECTION, $REQUIRE_AUTHENTICATION, $WT_IMAGE_DIR, $WT_IMAGES, $SEARCH_SPIDER; global $controller; // Pages with a controller can be added to the favorites if (!empty($SEARCH_SPIDER)) { return; // show no favorites, because they taint every page that is indexed. } if (!WT_USER_NAME && $REQUIRE_AUTHENTICATION) return false; $currentGedcom = $GEDCOM; $gedcomfavs = getUserFavorites($GEDCOM); $userfavs = array(); if (WT_USER_NAME) $userfavs = getUserFavorites(WT_USER_NAME); $gid = ''; if (WT_USER_NAME && isset($controller)) { // Get the right $gid from each supported controller type switch (get_class($controller)) { case 'IndividualController': $gid = $controller->pid; break; case 'FamilyController': $gid = $controller->famid; break; case 'MediaController': $gid = $controller->mid; break; case 'SourceController': $gid = $controller->sid; break; case 'RepositoryController': $gid = $controller->rid; break; default: break; } } if (!WT_USER_NAME && count($gedcomfavs)==0) return; echo "
"; switch($option) { case 1: $menu = new Menu(i18n::translate('Favorites'), "#", "right", "down"); $menu->addClass("favmenuitem", "favmenuitem_hover", "favsubmenu"); if (count($userfavs)>0 || $gid!='') { $submenu = new Menu("".i18n::translate('My Favorites')."", "#", "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); if ($gid!='') { $submenu = new Menu(''.i18n::translate('Add to My Favorites').'', encode_url(WT_SCRIPT_NAME.normalize_query_string($QUERY_STRING.'&action=addfav&gid='.$gid)), "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); } foreach($userfavs as $key=>$favorite) { $GEDCOM = $favorite["file"]; $submenu = new Menu(); if ($favorite["type"]=="URL" && !empty($favorite["url"])) { $submenu->addLink(encode_url($favorite["url"])); $submenu->addLabel(PrintReady($favorite["title"]), "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); } else { $record=GedcomRecord::getInstance($favorite["gid"]); if ($record && $record->canDisplayName()) { $submenu->addLink(encode_url($record->getLinkUrl())); $slabel = PrintReady($record->getFullName()); if ($SHOW_ID_NUMBERS) { if ($TEXT_DIRECTION=="ltr") { $slabel .= " (".$record->getXref().")"; } else { $slabel .= " " . getRLM() . "(".$record->getXref().")" . getRLM(); } } $submenu->addLabel($slabel, "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); } } } if (count($gedcomfavs)>0) { $menu->addSeparator(); } } if (count($gedcomfavs)>0) { $submenu = new Menu("".i18n::translate('This GEDCOM\'s Favorites')."", "#", "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); foreach($gedcomfavs as $key=>$favorite) { $GEDCOM = $favorite["file"]; $submenu = new Menu(); if ($favorite["type"]=="URL" && !empty($favorite["url"])) { $submenu->addLink(encode_url($favorite["url"])); $submenu->addLabel(PrintReady($favorite["title"]), "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); } else { $record=GedcomRecord::getInstance($favorite["gid"]); if ($record && $record->canDisplayName()) { $submenu->addLink(encode_url($record->getLinkUrl())); $slabel = PrintReady($record->getFullName()); if ($SHOW_ID_NUMBERS) { if ($TEXT_DIRECTION=="ltr") { $slabel .= " (".$record->getXref().")"; } else { $slabel .= " " . getRLM() . "(".$record->getXref().")" . getRLM(); } } $submenu->addLabel($slabel, "right"); $submenu->addClass("favsubmenuitem", "favsubmenuitem_hover"); $menu->addSubMenu($submenu); } } } } $menu->printMenu(); break; default: echo '
"; echo "
"; break; } echo "
"; $GEDCOM = $currentGedcom; } /** * print a note record * @param string $text * @param int $nlevel the level of the note record * @param string $nrec the note record to print * @param bool $textOnly Don't print the "Note: " introduction * @param boolean $return Print the data or return the data * @return boolean */ function print_note_record($text, $nlevel, $nrec, $textOnly=false, $return=false) { global $WT_IMAGE_DIR, $WT_IMAGES, $EXPAND_SOURCES, $EXPAND_NOTES; if (!isset($EXPAND_NOTES)) $EXPAND_NOTES = $EXPAND_SOURCES; // FIXME $elementID = "N-".floor(microtime()*1000000); $text = trim($text); // Check if Shared Note and if so enable url link on title ------------------- if (preg_match('/^0 @'.WT_REGEX_XREF.'@ NOTE/', $nrec)) { $centitl = str_replace("~~", "", $text); $centitl = str_replace("
", "", $centitl); if (preg_match("/@N([0-9])+@/", $nrec, $match_nid)) { $nid = str_replace("@", "", $match_nid[0]); $centitl = "".$centitl.""; } if ($textOnly) { $text = $centitl; return $text; } else { $text = get_cont($nlevel, $nrec); } }else{ $text .= get_cont($nlevel, $nrec); } $text = str_replace("~~", "
", $text); $text = trim(expand_urls(stripLRMRLM($text))); $data = ""; if (!empty($text) || !empty($centitl)) { $text = PrintReady($text); // Check if Formatted Shared Note (using pipe "|" as delimiter ) -------------------- if (preg_match('/^0 @'.WT_REGEX_XREF.'@ NOTE/', $nrec) && strstr($text, "|") && file_exists(WT_ROOT.'modules/GEDFact_assistant/_CENS/census_note_decode.php') ) { require WT_ROOT.'modules/GEDFact_assistant/_CENS/census_note_decode.php'; // Else if unformatted Shared Note -------------------------------------------------- }else if (preg_match('/^0 @'.WT_REGEX_XREF.'@ NOTE/', $nrec)) { $text=$centitl.$text; } if ($textOnly) { if (!$return) { echo $text; return true; } else { return $text; } } $brpos = strpos($text, "
"); $data .= "
"; if ($brpos !== false) { if ($EXPAND_NOTES) $plusminus="minus"; else $plusminus="plus"; $data .= "\""; "; else $data .= i18n::translate('Hide Details')."\" title=\"".i18n::translate('Hide Details')."\" /> "; } // Check if Shared Note ----------------------------- if (preg_match('/^0 @'.WT_REGEX_XREF.'@ NOTE/', $nrec)) { $data .= i18n::translate('Shared note').": - "; }else{ $data .= i18n::translate('Note').": "; } if ($brpos !== false) { $data .= substr($text, 0, $brpos); $data .= "
"; $data .= substr($text, $brpos + 6); $data .= "
"; } else { $data .= $text; } if (!$return) { echo $data; return true; }else{ return $data; } } return false; } /** * Print all of the notes in this fact record * @param string $factrec the factrecord to print the notes from * @param int $level The level of the factrecord * @param bool $textOnly Don't print the "Note: " introduction * @param boolean $return whether to return text or print the data */ function print_fact_notes($factrec, $level, $textOnly=false, $return=false) { global $GEDCOM; $ged_id=get_id_from_gedcom($GEDCOM); $data = ""; $printDone = false; $nlevel = $level+1; $ct = preg_match_all("/$level NOTE(.*)/", $factrec, $match, PREG_SET_ORDER); for($j=0; $j<$ct; $j++) { $spos1 = strpos($factrec, $match[$j][0]); $spos2 = strpos($factrec."\n$level", "\n$level", $spos1+1); if (!$spos2) $spos2 = strlen($factrec); $nrec = substr($factrec, $spos1, $spos2-$spos1); if (!isset($match[$j][1])) $match[$j][1]=""; $nt = preg_match("/@(.*)@/", $match[$j][1], $nmatch); $closeSpan = false; if ($nt==0) { //-- print embedded note records $closeSpan = print_note_record($match[$j][1], $nlevel, $nrec, $textOnly, true); $data .= $closeSpan; } else { if (displayDetailsById($nmatch[1], "NOTE")) { //-- print linked note records $noterec = find_gedcom_record($nmatch[1], $ged_id); $nt = preg_match("/0 @$nmatch[1]@ NOTE (.*)/", $noterec, $n1match); $closeSpan = print_note_record(($nt>0)?$n1match[1]:"", 1, $noterec, $textOnly, true); $data .= $closeSpan; if (!$textOnly) { if (strpos($noterec, "1 SOUR")!==false) { $data .= "
"; $data .= print_fact_sources($noterec, 1, true); } } } } if (!$textOnly) { if (strpos($factrec, "$nlevel SOUR")!==false) { $data .= "
"; $data .= print_fact_sources($nrec, $nlevel, true); $data .= "
"; } } /* if($closeSpan){ if ($j==$ct-1 || $textOnly==false) { $data .= ""; } else { $data .= "

"; } } */ $printDone = true; } if ($printDone) $data .= "
"; if (!$return) echo $data; else return $data; } /** * print a gedcom title linked to the gedcom portal * * This function will print the HTML to link the current gedcom title back to the * gedcom Home Page * @author John Finlay */ function print_gedcom_title_link($InHeader=FALSE) { global $GEDCOM_TITLE; echo "", PrintReady($GEDCOM_TITLE, $InHeader), ""; } //-- function to print a privacy error with contact method function print_privacy_error() { $user_id=get_gedcom_setting(WT_GED_ID, 'CONTACT_USER_ID'); $method=get_user_setting($user_id, 'contactmethod'); $fullname=getUserFullName($user_id); echo '
', i18n::translate('This information is private and cannot be shown.'), '
'; switch ($method) { case 'none': break; case 'mailto': $email=getUserEmail($user_id); echo '
', i18n::translate('For more information contact'), ' ', ''.htmlspecialchars($fullname).'', '
'; break; default: echo '
', i18n::translate('For more information contact'), ' ', "{$fullname}", '
'; break; } } // Print a link for a popup help window function help_link($help_topic, $module='') { global $WT_USE_HELPIMG, $WT_IMAGES, $WT_IMAGE_DIR, $SEARCH_SPIDER; if ($SEARCH_SPIDER || !$_SESSION['show_context_help']) { return ''; } else { return ' '. ($WT_USE_HELPIMG ? '' : i18n::translate('?')). ' '; } } // Embed global variables and constants in a string. // Variables can be specified explicitly with #GLOBALS[variable]# or implicity with #variable# // This function is used by the blocks. // TODO: There are potential security risks - authorised users may determine the value of // site configuration settings. Also, this logic is legacy, from PGV. The blocks need better // handling of I18N. Perhaps separate texts for each language? function embed_globals($text) { if (preg_match_all('/#GLOBALS\[([A-Za-z_][A-Za-z0-9_]*)\]#/', $text, $matches, PREG_SET_ORDER)) { foreach ($matches as $match) { if (isset($GLOBALS[$match[1]])) { $text=str_replace($match[0], $GLOBALS[$match[1]], $text); } } } if (preg_match_all('/#([A-Za-z_][A-Za-z0-9_]*)#/', $text, $matches, PREG_SET_ORDER)) { foreach ($matches as $match) { if (isset($GLOBALS[$match[1]])) { $text=str_replace($match[0], $GLOBALS[$match[1]], $text); } elseif (defined($match[1])) { $text=str_replace($match[0], constant($match[1]), $text); } } } return $text; } //------------------------------------------------------------------------------------------------------------- // switches between left and rigth align on chosen text direction //------------------------------------------------------------------------------------------------------------- function write_align_with_textdir_check($t_dir, $return=false) { global $TEXT_DIRECTION; $out = ""; if ($t_dir == "left") { if ($TEXT_DIRECTION == "ltr") { $out .= " style=\"text-align:left; \" "; } else { $out .= " style=\"text-align:right; \" "; } } else { if ($TEXT_DIRECTION == "ltr") { $out .= " style=\"text-align:right; \" "; } else { $out .= " style=\"text-align:left; \" "; } } if ($return) return $out; echo $out; } //-- print theme change dropdown box function print_theme_dropdown($style=0) { global $ALLOW_THEME_DROPDOWN, $ALLOW_USER_THEMES; if ($ALLOW_THEME_DROPDOWN && $ALLOW_USER_THEMES) { echo '
'; $theme_menu=MenuBar::getThemeMenu(); switch ($style) { case 0: echo $theme_menu->getMenuAsDropdown(); break; case 1: echo $theme_menu->getMenu(); break; } echo '
'; } else { echo ' '; } } /** * Prepare text with parenthesis for printing * Convert & to & for xhtml compliance * * @param string $text to be printed */ function PrintReady($text, $InHeaders=false, $trim=true) { global $action, $firstname, $lastname, $place, $year; global $TEXT_DIRECTION_array, $TEXT_DIRECTION, $controller; // Check whether Search page highlighting should be done or not if (isset($controller) && $controller instanceof SearchController && $controller->query) { $query=$controller->query; $HighlightOK=true; } else { $query=''; $HighlightOK=false; } //-- convert all & to & $text = str_replace("&", "&", $text); //$text = preg_replace(array("/&/", "//"), array("&", "<", ">"), $text); //-- make sure we didn't double convert existing HTML entities like so: &foo; to &foo; $text = preg_replace("/&(\w+);/", "&$1;", $text); if ($trim) $text = trim($text); //-- if we are on the search page body, then highlight any search hits // In this routine, we will assume that the input string doesn't contain any // \x01 or \x02 characters. We'll represent the by \x01 // and by \x02. We will translate these \x01 and \x02 into their true // meaning at the end. // // This special handling is required in case the user has submitted a multiple // argument search, in which the second or later arguments can be found in the // or strings. if ($HighlightOK) { $queries = explode(" ", $query); $newtext = $text; $hasallhits = true; foreach($queries as $index=>$query1) { $query1esc=preg_quote($query1, '/'); if (@preg_match("/(".$query1esc.")/i", $text)) { // Use @ as user-supplied query might be invalid. $newtext = preg_replace("/(".$query1esc.")/i", "\x01$1\x02", $newtext); } else if (@preg_match("/(".utf8_strtoupper($query1esc).")/", utf8_strtoupper($text))) { $nlen = strlen($query1); $npos = strpos(utf8_strtoupper($text), utf8_strtoupper($query1)); $newtext = substr_replace($newtext, "\x02", $npos+$nlen, 0); $newtext = substr_replace($newtext, "\x01", $npos, 0); } else $hasallhits = false; } if ($hasallhits) $text = $newtext; if (isset($action) && ($action === "soundex")) { if (isset($firstname)) { $queries = explode(" ", $firstname); $newtext = $text; $hasallhits = true; foreach($queries as $index=>$query1) { $query1esc=preg_quote($query1, '/'); if (preg_match("/(".$query1esc.")/i", $text)) { $newtext = preg_replace("/(".$query1esc.")/i", "\x01$1\x02", $newtext); } else if (preg_match("/(".utf8_strtoupper($query1esc).")/", utf8_strtoupper($text))) { $nlen = strlen($query1); $npos = strpos(utf8_strtoupper($text), utf8_strtoupper($query1)); $newtext = substr_replace($newtext, "\x02", $npos+$nlen, 0); $newtext = substr_replace($newtext, "\x01", $npos, 0); } else $hasallhits = false; } if ($hasallhits) $text = $newtext; } if (isset($lastname)) { $queries = explode(" ", $lastname); $newtext = $text; $hasallhits = true; foreach($queries as $index=>$query1) { $query1esc=preg_quote($query1, '/'); if (preg_match("/(".$query1esc.")/i", $text)) { $newtext = preg_replace("/(".$query1esc.")/i", "\x01$1\x02", $newtext); } else if (preg_match("/(".utf8_strtoupper($query1esc).")/", utf8_strtoupper($text))) { $nlen = strlen($query1); $npos = strpos(utf8_strtoupper($text), utf8_strtoupper($query1)); $newtext = substr_replace($newtext, "\x02", $npos+$nlen, 0); $newtext = substr_replace($newtext, "\x01", $npos, 0); } else $hasallhits = false; } if ($hasallhits) $text = $newtext; } if (isset($place)) { $queries = explode(" ", $place); $newtext = $text; $hasallhits = true; foreach($queries as $index=>$query1) { $query1esc=preg_quote($query1, '/'); if (preg_match("/(".$query1esc.")/i", $text)) { $newtext = preg_replace("/(".$query1esc.")/i", "\x01$1\x02", $newtext); } else if (preg_match("/(".utf8_strtoupper($query1esc).")/", utf8_strtoupper($text))) { $nlen = strlen($query1); $npos = strpos(utf8_strtoupper($text), utf8_strtoupper($query1)); $newtext = substr_replace($newtext, "\x02", $npos+$nlen, 0); $newtext = substr_replace($newtext, "\x01", $npos, 0); } else $hasallhits = false; } if ($hasallhits) $text = $newtext; } if (isset($year)) { $queries = explode(" ", $year); $newtext = $text; $hasallhits = true; foreach($queries as $index=>$query1) { $query1=preg_quote($query1, '/'); if (preg_match("/(".$query1.")/i", $text)) { $newtext = preg_replace("/(".$query1.")/i", "\x01$1\x02", $newtext); } else $hasallhits = false; } if ($hasallhits) $text = $newtext; } } // All the "Highlight start" and "Highlight end" flags are set: // Delay the final clean-up and insertion of proper and // until parentheses, braces, and brackets have been processed } // Look for strings enclosed in parentheses, braces, or brackets. // // Parentheses, braces, and brackets have weak directionality and aren't handled properly // when they enclose text whose directionality differs from that of the page. // // To correct the problem, we need to enclose the parentheses, braces, or brackets with // zero-width characters (‎ or ‏) having a directionality that matches the // directionality of the text that is enclosed by the parentheses, etc. $charPos = 0; $lastChar = strlen($text); $newText = ""; while (true) { if ($charPos > $lastChar) break; $thisChar = substr($text, $charPos, 1); $charPos ++; if ($thisChar=="(" || $thisChar=="{" || $thisChar=="[") { $tempText = ""; while (true) { $tempChar = ""; if ($charPos > $lastChar) break; $tempChar = substr($text, $charPos, 1); $charPos ++; if ($tempChar==")" || $tempChar=="}" || $tempChar=="]") break; $tempText .= $tempChar; } if (utf8_direction($tempText)=='rtl') { $newText .= getRLM() . $thisChar . $tempText . $tempChar . getRLM(); } else { $newText .= getLRM() . $thisChar . $tempText . $tempChar . getLRM(); } } else { $newText .= $thisChar; } } $text = $newText; // Parentheses, braces, and brackets have been processed: // Finish processing of "Highlight Start and "Highlight end" if (!$InHeaders) { $text = str_replace(array("\x02\x01", "\x02 \x01", "\x01", "\x02"), array("", " ", "", ""), $text); } else { $text = str_replace(array("\x02\x01", "\x02 \x01", "\x01", "\x02"), array("", " ", "", ""), $text); } return $text; } /** * print ASSO RELA information * * Ex1: * 1 ASSO @I1@ * 2 RELA Twin * * Ex2: * 1 CHR * 2 ASSO @I1@ * 3 RELA Godfather * 2 ASSO @I2@ * 3 RELA Godmother * * @param string $pid person or family ID * @param string $factrec the raw gedcom record to print * @param string $linebr optional linebreak */ function print_asso_rela_record($pid, $factrec, $linebr=false, $type='INDI') { global $SHOW_ID_NUMBERS, $WT_IMAGE_DIR, $WT_IMAGES; // Level 1 ASSO if (preg_match('/^1 ASSO @('.WT_REGEX_XREF.')@(\n[2-9].*)*/', $factrec, $amatch)) { $person=Person::getInstance($amatch[1]); $sex=''; if ($person) { $name=$person->getFullName(); $sex=$person->getSex(); switch ($type) { case 'INDI': $relationship=get_relationship_name(get_relationship($pid, $amatch[1], true, 4)); if (!$relationship) { $relationship=i18n::translate('Relationship Chart'); } $relationship=' - '.$relationship.''; break; case 'FAM': $relationship=''; $famrec = find_family_record($pid, WT_GED_ID); if ($famrec) { $parents = find_parents_in_record($famrec); if ($parents["HUSB"]) { $relationship1=get_relationship_name(get_relationship($parents["HUSB"], $amatch[1], true, 4)); if (!$relationship1) { $relationship1=i18n::translate('Relationship Chart'); } $relationship.=' - '.$relationship1.''; } if ($parents["WIFE"]) { $relationship2=get_relationship_name(get_relationship($parents["WIFE"], $amatch[1], true, 4)); if (!$relationship2) { $relationship2=i18n::translate('Relationship Chart'); } $relationship.=' - '.$relationship2.''; } } break; } } else { $name=$amatch[1]; $relationship=''; } if ($SHOW_ID_NUMBERS) { $name.=' ('.$amatch[1].')'; } if (preg_match('/\n2 RELA (.+)/', $amatch[2], $rmatch)) { $label='
'.i18n::translate('Relationship').': '.translate_rela($rmatch[1], $sex); } else { $label=''; } echo '', $name, $relationship, '
', $label; } // Level 2 ASSO preg_match_all('/\n2 ASSO @('.WT_REGEX_XREF.')@(\n[3-9].*)*/', $factrec, $amatches, PREG_SET_ORDER); foreach ($amatches as $amatch) { $person=Person::getInstance($amatch[1]); if ($person) $sex=$person->getSex(); else $sex=''; if (preg_match('/\n3 RELA (.+)/', $amatch[0], $rmatch)) { $label=''.translate_rela($rmatch[1], $sex).': '; } else { $label=''; } if ($person) { $name=$person->getFullName(); switch ($type) { case 'INDI': if (preg_match('/^1 _[A-Z]+_[A-Z]+/', $factrec)) { // An automatically generated "event of a close relative" preg_match('/\n3 RELA (.+)/', $amatch[0], $rmatch); $relationship=get_relationship_name_from_path($rmatch[1], $pid, $amatch[1]); $label=''; } else { // An naturally occuring ASSO event $relationship=get_relationship_name(get_relationship($pid, $amatch[1], true, 4)); if (!$relationship) { $relationship=i18n::translate('Relationship Chart'); } } $relationship=' - '.$relationship.''; break; case 'FAM': $relationship=''; $famrec = find_family_record($pid, WT_GED_ID); if ($famrec) { $parents = find_parents_in_record($famrec); if ($parents["HUSB"]) { $relationship1=get_relationship_name(get_relationship($parents["HUSB"], $amatch[1], true, 4)); if (!$relationship1) { $relationship1=i18n::translate('Relationship Chart'); } $relationship.=' - '.$relationship1.''; } if ($parents["WIFE"]) { $relationship2=get_relationship_name(get_relationship($parents["WIFE"], $amatch[1], true, 4)); if (!$relationship2) { $relationship2=i18n::translate('Relationship Chart'); } $relationship.=' - '.$relationship2.''; } } break; } if ($SHOW_ID_NUMBERS) { $name.=' ('.$amatch[1].')'; } echo '
', $label, '', $name, '', $relationship; } else { echo '
', $label, $amatch[1]; } } } /** * Format age of parents in HTML * * @param string $pid child ID */ function format_parents_age($pid, $birth_date=null) { global $SHOW_PARENTS_AGE; $html=''; if ($SHOW_PARENTS_AGE) { $person=Person::getInstance($pid); $families=$person->getChildFamilies(); // Where an indi has multiple birth records, we need to know the // date of it. For person boxes, etc., use the default birth date. if (is_null($birth_date)) { $birth_date=$person->getBirthDate(); } // Multiple sets of parents (e.g. adoption) cause complications, so ignore. if ($birth_date->isOK() && count($families)==1) { $family=current($families); // Allow for same-sex parents foreach (array($family->getHusband(), $family->getWife()) as $parent) { if ($parent && $age=GedcomDate::GetAgeYears($parent->getBirthDate(), $birth_date)) { $deatdate=$parent->getDeathDate(); $class=''; switch ($parent->getSex()) { case 'F': // Highlight mothers who die in childbirth or shortly afterwards if ($deatdate->isOK() && $deatdate->MinJD()<$birth_date->MinJD()+90) { $class='parentdeath'; $title=i18n::translate('_DEAT_MOTH'); } else { $title=i18n::translate('Mother\'s age'); } break; case 'M': // Highlight fathers who die before the birth if ($deatdate->isOK() && $deatdate->MinJD()<$birth_date->MinJD()) { $class='parentdeath'; $title=i18n::translate('_DEAT_FATH'); } else { $title=i18n::translate('Father\'s age'); } break; default: $title=i18n::translate('Parent\'s age'); break; } if ($class) { $html.=' '.$parent->getSexImage().$age.''; } else { $html.=' '.$parent->getSexImage().$age.''; } } } if ($html) { $html=''.$html.''; } } } return $html; } /** * print fact DATE TIME * * @param Event $eventObj Event to print the date for * @param boolean $anchor option to print a link to calendar * @param boolean $time option to print TIME value */ function format_fact_date(&$eventObj, $anchor=false, $time=false) { global $pid, $SEARCH_SPIDER; global $GEDCOM; $ged_id=get_id_from_gedcom($GEDCOM); if (!is_object($eventObj)) trigger_error("Must use Event object", E_USER_WARNING); $factrec = $eventObj->getGedcomRecord(); $html=''; // Recorded age $fact_age=get_gedcom_value('AGE', 2, $factrec); if ($fact_age=='') $fact_age=get_gedcom_value('DATE:AGE', 2, $factrec); $husb_age=get_gedcom_value('HUSB:AGE', 2, $factrec); $wife_age=get_gedcom_value('WIFE:AGE', 2, $factrec); // Calculated age if (preg_match('/2 DATE (.+)/', $factrec, $match)) { $date=new GedcomDate($match[1]); $html.=' '.$date->Display($anchor && !$SEARCH_SPIDER); // time if ($time) { $timerec=get_sub_record(2, '2 TIME', $factrec); if ($timerec=='') { $timerec=get_sub_record(2, '2 DATE', $factrec); } if (preg_match('/[2-3] TIME (.*)/', $timerec, $tmatch)) { $html.=' - '.$tmatch[1].''; } } $fact = $eventObj->getTag(); $person = $eventObj->getParentObject(); if (!is_null($person) && $person->getType()=='INDI') { // age of parents at child birth if ($fact=='BIRT') { $html .= format_parents_age($person->getXref(), $date); } // age at event else if ($fact!='CHAN' && $fact!='_TODO') { $birth_date=$person->getBirthDate(); // Can't use getDeathDate(), as this also gives BURI/CREM events, which // wouldn't give the correct "days after death" result for people with // no DEAT. $death_event=$person->getFactByType('DEAT'); if ($death_event) { $death_date=$death_event->getDate(); } else { $death_date=new GedcomDate(''); } $ageText = ''; if ((GedcomDate::Compare($date, $death_date)<=0 || !$person->isDead()) || $fact=='DEAT') { // Before death, print age $age=GedcomDate::GetAgeGedcom($birth_date, $date); // Only show calculated age if it differs from recorded age if ($age!='') { if ( $fact_age!='' && $fact_age!=$age || $fact_age=='' && $husb_age=='' && $wife_age=='' || $husb_age!='' && $person->getSex()=='M' && $husb_age!=$age || $wife_age!='' && $person->getSex()=='F' && $wife_age!=$age ) { if ($age!="0d") { $ageText = '('.i18n::translate('Age').' '.get_age_at_event($age, false).')'; } } } } if ($fact!='DEAT' && GedcomDate::Compare($date, $death_date)>=0) { // After death, print time since death $age=get_age_at_event(GedcomDate::GetAgeGedcom($death_date, $date), true); if ($age!='') { if (GedcomDate::GetAgeGedcom($death_date, $date)=="0d") { $ageText = '('.i18n::translate('on the date of death').')'; } else { $ageText = '('.$age.' '.i18n::translate('after death').')'; } } } if ($ageText!='') $html .= ' '.PrintReady($ageText).''; } } else if (!is_null($person) && $person->getType()=='FAM') { $indirec=find_person_record($pid, $ged_id); $indi=new Person($indirec); $birth_date=$indi->getBirthDate(); $death_date=$indi->getDeathDate(); $ageText = ''; if (GedcomDate::Compare($date, $death_date)<=0) { $age=GedcomDate::GetAgeGedcom($birth_date, $date); // Only show calculated age if it differs from recorded age if ($age!='' && $age>0) { if ( $fact_age!='' && $fact_age!=$age || $fact_age=='' && $husb_age=='' && $wife_age=='' || $husb_age!='' && $indi->getSex()=='M' && $husb_age!= $age || $wife_age!='' && $indi->getSex()=='F' && $wife_age!=$age ) { $ageText = '('.i18n::translate('Age').' '.get_age_at_event($age, false).')'; } } } if ($ageText!='') $html .= ' '.PrintReady($ageText).''; } } else { // 1 DEAT Y with no DATE => print YES // 1 DEAT N is not allowed // It is not proper GEDCOM form to use a N(o) value with an event tag to infer that it did not happen. $factrec = str_replace("\nWT_OLD\n", '', $factrec); $factrec = str_replace("\nWT_NEW\n", '', $factrec); $factdetail = explode(' ', trim($factrec)); if (isset($factdetail)) if (count($factdetail) == 3) if (strtoupper($factdetail[2]) == 'Y') { $html.=i18n::translate('Yes'); } } // print gedcom ages foreach (array(translate_fact('AGE')=>$fact_age, translate_fact('HUSB')=>$husb_age, translate_fact('WIFE')=>$wife_age) as $label=>$age) { if ($age!='') { $html.=' '.$label.': '.PrintReady(get_age_at_event($age, false)).''; } } return $html; } /** * print fact PLACe TEMPle STATus * * @param Event $eventObj gedcom fact record * @param boolean $anchor option to print a link to placelist * @param boolean $sub option to print place subrecords * @param boolean $lds option to print LDS TEMPle and STATus */ function format_fact_place(&$eventObj, $anchor=false, $sub=false, $lds=false) { global $SHOW_PEDIGREE_PLACES, $TEMPLE_CODES, $SEARCH_SPIDER; if ($eventObj==null) return ''; if (!is_object($eventObj)) { trigger_error("Object was not sent in, please use Event object", E_USER_WARNING); $factrec = $eventObj; } else $factrec = $eventObj->getGedcomRecord(); $html=''; $ct = preg_match("/2 PLAC (.*)/", $factrec, $match); if ($ct>0) { $html.=' '; $levels = explode(',', $match[1]); if ($anchor && (empty($SEARCH_SPIDER))) { $place = trim($match[1]); // reverse the array so that we get the top level first $levels = array_reverse($levels); $tempURL = "placelist.php?action=show&"; foreach($levels as $pindex=>$ppart) { // routine for replacing ampersands $ppart = preg_replace("/amp\%3B/", "", trim($ppart)); $tempURL .= "parent[{$pindex}]=".PrintReady($ppart).'&'; } $tempURL .= 'level='.count($levels); $html .= ' '.PrintReady($place).''; } else { if (!$SEARCH_SPIDER) { $html.=' -- '; } for ($level=0; $level<$SHOW_PEDIGREE_PLACES; $level++) { if (!empty($levels[$level])) { if ($level>0) { $html.=", "; } $html.=PrintReady($levels[$level]); } } } } else { $place='???'; } $ctn=0; if ($sub) { $placerec = get_sub_record(2, '2 PLAC', $factrec); if (!empty($placerec)) { $cts = preg_match('/\d ROMN (.*)/', $placerec, $match); if ($cts>0) { if ($ct>0) { $html.=" - "; } $html.=' '.PrintReady($match[1]); } $cts = preg_match('/\d _HEB (.*)/', $placerec, $match); if ($cts>0) { if ($ct>0) { $html.=' - '; } $html.=' '.PrintReady($match[1]); } $map_lati=""; $cts = preg_match('/\d LATI (.*)/', $placerec, $match); if ($cts>0) { $map_lati=$match[1]; $html.='
'.translate_fact('LATI').': '.$map_lati; } $map_long=""; $cts = preg_match('/\d LONG (.*)/', $placerec, $match); if ($cts>0) { $map_long=$match[1]; $html.=' '.translate_fact('LONG').': '.$map_long; } if ($map_lati && $map_long && empty($SEARCH_SPIDER)) { $map_lati=trim(strtr($map_lati, "NSEW,�", " - -. ")); // S5,6789 ==> -5.6789 $map_long=trim(strtr($map_long, "NSEW,�", " - -. ")); // E3.456� ==> 3.456 $html.=' Mapquest ©'; $html.=' Google Maps ©'; $html.=' Multimap ©'; $html.=' TerraServer ©'; } if (preg_match('/\d NOTE (.*)/', $placerec, $match)) { ob_start(); print_fact_notes($placerec, 3); $html.=ob_get_contents(); ob_end_clean(); } } } if ($lds) { if (preg_match('/2 TEMP (.*)/', $factrec, $match)) { $tcode=trim($match[1]); if (array_key_exists($tcode, $TEMPLE_CODES)) { $html.='
'.i18n::translate('LDS Temple').': '.$TEMPLE_CODES[$tcode]; } else { $html.='
'.i18n::translate('LDS Temple Code:').$tcode; } } if (preg_match('/2 STAT (.*)/', $factrec, $match)) { $html.='
'.i18n::translate('Status').': '.trim($match[1]); if (preg_match('/3 DATE (.*)/', $factrec, $match)) { $date=new GedcomDate($match[1]); $html.=', '.i18n::translate('STAT:DATE').': '.$date->Display(false); } } } return $html; } /** * print first major fact for an Individual * * @param string $key indi pid */ function format_first_major_fact($key, $majorfacts = array("BIRT", "CHR", "BAPM", "DEAT", "BURI", "BAPL", "ADOP")) { global $TEXT_DIRECTION; $html=''; $person = GedcomRecord::getInstance($key); if (is_null($person)) return; foreach ($majorfacts as $indexval => $fact) { $event = $person->getFactByType($fact); if (!is_null($event) && $event->hasDatePlace() && $event->canShow()) { $html.='
'; $html .= $event->getLabel(); $html.=' '.format_fact_date($event).format_fact_place($event).'
'; break; } } return $html; } /** * Check for facts that may exist only once for a certain record type. * If the fact already exists in the second array, delete it from the first one. */ function CheckFactUnique($uniquefacts, $recfacts, $type) { foreach($recfacts as $indexval => $factarray) { $fact=false; if (is_object($factarray)) { /* @var $factarray Event */ $fact = $factarray->getTag(); } else { if (($type == "SOUR") || ($type == "REPO")) $factrec = $factarray[0]; if (($type == "FAM") || ($type == "INDI")) $factrec = $factarray[1]; $ft = preg_match("/1 (\w+)(.*)/", $factrec, $match); if ($ft>0) { $fact = trim($match[1]); } } if ($fact!==false) { $key = array_search($fact, $uniquefacts); if ($key !== false) unset($uniquefacts[$key]); } } return $uniquefacts; } /** * Print a new fact box on details pages * @param string $id the id of the person, family, source etc the fact will be added to * @param array $usedfacts an array of facts already used in this record * @param string $type the type of record INDI, FAM, SOUR etc */ function print_add_new_fact($id, $usedfacts, $type) { global $TEXT_DIRECTION; global $INDI_FACTS_ADD, $FAM_FACTS_ADD, $NOTE_FACTS_ADD, $SOUR_FACTS_ADD, $REPO_FACTS_ADD; global $INDI_FACTS_UNIQUE, $FAM_FACTS_UNIQUE, $NOTE_FACTS_UNIQUE, $SOUR_FACTS_UNIQUE, $REPO_FACTS_UNIQUE; global $INDI_FACTS_QUICK, $FAM_FACTS_QUICK, $NOTE_FACTS_QUICK, $SOUR_FACTS_QUICK, $REPO_FACTS_QUICK; // -- Add from clipboard if (!empty($_SESSION["clipboard"])) { $newRow = true; foreach(array_reverse($_SESSION["clipboard"], true) as $key=>$fact) { if ($fact["type"]==$type || $fact["type"]=='all') { if ($newRow) { $newRow = false; echo ''; echo help_link('add_from_clipboard'); echo i18n::translate('Add from clipboard'), ''; echo '
'; echo ''; echo '   "; echo '
', "\n"; } } // -- Add from pick list switch ($type) { case "INDI": $addfacts =preg_split("/[, ;:]+/", $INDI_FACTS_ADD, -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", $INDI_FACTS_UNIQUE, -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", $INDI_FACTS_QUICK, -1, PREG_SPLIT_NO_EMPTY); break; case "FAM": $addfacts =preg_split("/[, ;:]+/", $FAM_FACTS_ADD, -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", $FAM_FACTS_UNIQUE, -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", $FAM_FACTS_QUICK, -1, PREG_SPLIT_NO_EMPTY); break; case "SOUR": $addfacts =preg_split("/[, ;:]+/", $SOUR_FACTS_ADD, -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", $SOUR_FACTS_UNIQUE, -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", $SOUR_FACTS_QUICK, -1, PREG_SPLIT_NO_EMPTY); break; case "NOTE": $addfacts =preg_split("/[, ;:]+/", $NOTE_FACTS_ADD, -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", $NOTE_FACTS_UNIQUE, -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", $NOTE_FACTS_QUICK, -1, PREG_SPLIT_NO_EMPTY); break; case "REPO": $addfacts =preg_split("/[, ;:]+/", $REPO_FACTS_ADD, -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", $REPO_FACTS_UNIQUE, -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", $REPO_FACTS_QUICK, -1, PREG_SPLIT_NO_EMPTY); break; default: return; } $addfacts=array_merge(CheckFactUnique($uniquefacts, $usedfacts, $type), $addfacts); $quickfacts=array_intersect($quickfacts, $addfacts); foreach ($addfacts as $addfact) { $tanslated_addfacts[$addfact] = translate_fact($addfact); } uasort($tanslated_addfacts, "factsort"); echo ""; echo i18n::translate('Add new fact'); echo help_link('add_new_facts'), "\n"; echo ""; echo "
"; echo "\n"; echo "   "; foreach($quickfacts as $fact) echo " ", translate_fact($fact), " "; echo "
"; echo ""; } /** * javascript declaration for calendar popup * * @param none */ function init_calendar_popup() { global $WEEK_START; echo WT_JS_START, 'cal_setMonthNames(', '"', i18n::translate_c('NOMINATIVE', 'January'), '",', '"', i18n::translate_c('NOMINATIVE', 'February'), '",', '"', i18n::translate_c('NOMINATIVE', 'March'), '",', '"', i18n::translate_c('NOMINATIVE', 'April'), '",', '"', i18n::translate_c('NOMINATIVE', 'May'), '",', '"', i18n::translate_c('NOMINATIVE', 'June'), '",', '"', i18n::translate_c('NOMINATIVE', 'July'), '",', '"', i18n::translate_c('NOMINATIVE', 'August'), '",', '"', i18n::translate_c('NOMINATIVE', 'September'), '",', '"', i18n::translate_c('NOMINATIVE', 'October'), '",', '"', i18n::translate_c('NOMINATIVE', 'November'), '",', '"', i18n::translate_c('NOMINATIVE', 'December'), '");', 'cal_setDayHeaders(', '"', i18n::translate('Sun'), '",', '"', i18n::translate('Mon'), '",', '"', i18n::translate('Tue'), '",', '"', i18n::translate('Wed'), '",', '"', i18n::translate('Thu'), '",', '"', i18n::translate('Fri'), '",', '"', i18n::translate('Sat'), '");', 'cal_setWeekStart(', $WEEK_START, ');', WT_JS_END; } /** * prints a link to open the Find Special Character window * @param string $element_id the ID of the element the value will be pasted to * @param string $indiname the id of the element the name should be pasted to * @param boolean $asString Whether or not the HTML should be returned as a string or printed * @param boolean $multiple Whether or not the user will be selecting multiple people * @param string $ged The GEDCOM to search in */ function print_findindi_link($element_id, $indiname, $asString=false, $multiple=false, $ged='', $filter='') { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; $text = i18n::translate('Find individual ID'); if (empty($ged)) $ged=$GEDCOM; if (isset($WT_IMAGES["indi"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_findplace_link($element_id, $ged='', $asString=false) { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; if (empty($ged)) $ged=$GEDCOM; $text = i18n::translate('Find Place'); if (isset($WT_IMAGES["place"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_findfamily_link($element_id, $ged='', $asString=false) { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; if (empty($ged)) $ged=$GEDCOM; $text = i18n::translate('Find Family ID'); if (isset($WT_IMAGES["family"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_specialchar_link($element_id, $vert, $asString=false) { global $WT_IMAGE_DIR, $WT_IMAGES; $text = i18n::translate('Find Special Characters'); if (isset($WT_IMAGES["keyboard"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_autopaste_link($element_id, $choices, $concat=1, $name=1, $submit=0) { echo ""; foreach ($choices as $indexval => $choice) { echo "  ", $choice, ""; } echo ""; } function print_findsource_link($element_id, $sourcename="", $asString=false, $ged='') { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; if (empty($ged)) $ged=$GEDCOM; $text = i18n::translate('Find Source ID'); if (isset($WT_IMAGES["source"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_findnote_link($element_id, $notename="", $asString=false, $ged='') { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; if (empty($ged)) $ged=$GEDCOM; $text = i18n::translate('Find Shared Note'); if (isset($WT_IMAGES["note"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_findrepository_link($element_id, $ged='', $asString=false) { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; if (empty($ged)) $ged=$GEDCOM; $text = i18n::translate('Find Repository'); if (isset($WT_IMAGES["repository"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_findmedia_link($element_id, $choose="", $ged='', $asString=false) { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; if (empty($ged)) $ged=$GEDCOM; $text = i18n::translate('Find media'); if (isset($WT_IMAGES["media"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } function print_findfact_link($element_id, $facts, $ged='', $asString=false) { global $WT_IMAGE_DIR, $WT_IMAGES, $GEDCOM; $text = i18n::translate('Find fact tag'); if (empty($ged)) $ged=$GEDCOM; if (isset($WT_IMAGES["keyboard"]["button"])) $Link = "\"".$text."\""; else $Link = $text; $out = " "; $out .= $Link; $out .= ""; if ($asString) return $out; echo $out; } /** * get a quick-glance view of current LDS ordinances * @param string $indirec * @return string */ function get_lds_glance($indirec) { global $GEDCOM; $ged_id=get_id_from_gedcom($GEDCOM); $text = ""; $ord = get_sub_record(1, "1 BAPL", $indirec); if ($ord) $text .= "B"; else $text .= "_"; $ord = get_sub_record(1, "1 ENDL", $indirec); if ($ord) $text .= "E"; else $text .= "_"; $found = false; $ct = preg_match_all("/1 FAMS @(.*)@/", $indirec, $match, PREG_SET_ORDER); for($i=0; $i<$ct; $i++) { $famrec = find_family_record($match[$i][1], $ged_id); if ($famrec) { $ord = get_sub_record(1, "1 SLGS", $famrec); if ($ord) { $found = true; break; } } } if ($found) $text .= "S"; else $text .= "_"; $ord = get_sub_record(1, "1 SLGC", $indirec); if ($ord) $text .= "P"; else $text .= "_"; return $text; } /** * This function produces a hexadecimal dump of the input string for debugging purposes */ function DumpString($input) { if (empty($input)) return false; $UTF8 = array(); $hex1L = ''; $hex1R = ''; $hex2L = ''; $hex2R = ''; $hex3L = ''; $hex3R = ''; $hex4L = ''; $hex4R = ''; $pos = 0; while (true) { // Separate the input string into UTF8 characters $byte0 = ord(substr($input, $pos, 1)); $charLen = 1; if (($byte0 & 0xE0) == 0xC0) $charLen = 2; // 2-byte sequence if (($byte0 & 0xF0) == 0xE0) $charLen = 3; // 3-byte sequence if (($byte0 & 0xF8) == 0xF0) $charLen = 4; // 4-byte sequence $thisChar = substr($input, $pos, $charLen); $UTF8[] = $thisChar; // Separate the current UTF8 character into hexadecimal digits $byte = bin2hex(substr($thisChar, 0, 1)); $hex1L .= substr($byte, 0, 1); $hex1R .= substr($byte, 1, 1); if ($charLen > 1) { $byte = bin2hex(substr($thisChar, 1, 1)); $hex2L .= substr($byte, 0, 1); $hex2R .= substr($byte, 1, 1); } else { $hex2L .= ' '; $hex2R .= ' '; } if ($charLen > 2) { $byte = bin2hex(substr($thisChar, 2, 1)); $hex3L .= substr($byte, 0, 1); $hex3R .= substr($byte, 1, 1); } else { $hex3L .= ' '; $hex3R .= ' '; } if ($charLen > 3) { $byte = bin2hex(substr($thisChar, 3, 1)); $hex4L .= substr($byte, 0, 1); $hex4R .= substr($byte, 1, 1); } else { $hex4L .= ' '; $hex4R .= ' '; } $pos += $charLen; if ($pos>=strlen($input)) break; } $pos = 0; $lastPos = count($UTF8); $haveByte4 = (trim($hex4L)!=''); $haveByte3 = (trim($hex3L)!=''); $haveByte2 = (trim($hex2L)!=''); // We're ready: now output everything echo '
'; while (true) { $lineLength = $lastPos - $pos; if ($lineLength>100) $lineLength = 100; // Line 1: ruler $thisLine = substr(' '.$pos, -6).' '; $thisLine .= substr('........10........20........30........40........50........60........70........80........90.......100', 0, $lineLength); echo str_replace(' ', ' ', $thisLine), '
'; // Line 2: UTF8 character string $thisLine = ''; for ($i=$pos; $i<($pos+$lineLength); $i++) { if (ord(substr($UTF8[$i], 0, 1)) < 0x20) { $thisChar = " "; } else { $thisChar = $UTF8[$i]; switch ($thisChar) { case '&': $thisChar = '&'; break; case '<': $thisChar = '<'; break; case ' ': case WT_UTF8_LRM: case WT_UTF8_RLM: case WT_UTF8_LRO: case WT_UTF8_RLO: case WT_UTF8_LRE: case WT_UTF8_RLE: case WT_UTF8_PDF: $thisChar = ' '; break; } } // $thisLine .= WT_UTF8_LRM; $thisLine .= $thisChar; } // echo '  UTF8 ', $thisLine, '
'; echo '  UTF8 ', WT_UTF8_LRO, $thisLine, WT_UTF8_PDF, '
'; // Line 3: First hexadecimal byte $thisLine = 'Byte 1 '; $thisLine .= substr($hex1L, $pos, $lineLength); $thisLine .= '
'; $thisLine .= ' '; $thisLine .= substr($hex1R, $pos, $lineLength); $thisLine .= '
'; echo str_replace(array(' ', ''), array(' ', '
'), $thisLine); // Line 4: Second hexadecimal byte if ($haveByte2) { $thisLine = 'Byte 2 '; $thisLine .= substr($hex2L, $pos, $lineLength); $thisLine .= '
'; $thisLine .= ' '; $thisLine .= substr($hex2R, $pos, $lineLength); $thisLine .= '
'; echo str_replace(array(' ', ''), array(' ', '
'), $thisLine); } // Line 5: Third hexadecimal byte if ($haveByte3) { $thisLine = 'Byte 3 '; $thisLine .= substr($hex3L, $pos, $lineLength); $thisLine .= '
'; $thisLine .= ' '; $thisLine .= substr($hex3R, $pos, $lineLength); $thisLine .= '
'; echo str_replace(array(' ', ''), array(' ', '
'), $thisLine); } // Line 6: Fourth hexadecimal byte if ($haveByte4) { $thisLine = 'Byte 4 '; $thisLine .= substr($hex4L, $pos, $lineLength); $thisLine .= '
'; $thisLine .= ' '; $thisLine .= substr($hex4R, $pos, $lineLength); $thisLine .= '
'; echo str_replace(array(' ', ''), array(' ', '
'), $thisLine); } echo '
'; $pos += $lineLength; if ($pos >= $lastPos) break; } echo '
'; return true; } ?>