"; echo '
'; echo ''; return false; } $pid=$person->getXref(); 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 = ''; $birthplace = ''; $outBoxAdd = ''; $showid = ''; $iconsStyleAdd = 'float:right;'; if ($TEXT_DIRECTION=='rtl') $iconsStyleAdd='float:left;'; $disp=$person->canShow(); $uniqueID = (int)(microtime() * 1000000); $boxID = $pid.'.'.$personcount.'.'.$count.'.'.$uniqueID; $mouseAction4 = " onclick=\"expandbox('".$boxID."', $style); return false;\""; if ($person->canShowName()) { if (empty($SEARCH_SPIDER)) { //-- draw a box for the family popup // NOTE: Start div I.$pid.$personcount.$count.links $personlinks .= ''; // NOTE: Start div out-$pid.$personcount.$count if ($style==1) $outBoxAdd .= " class=\"person_box$isF person_box_template style1\" style=\"width: ".$bwidth."px; height: ".$bheight."px; z-index:-1;\""; else $outBoxAdd .= " class=\"person_box$isF person_box_template style0\""; // NOTE: Zoom if (!$show_full) { $outBoxAdd .= $mouseAction4; } else { $icons .= ""; $icons .= '
'; } } else { if ($style==1) { $outBoxAdd .= "class=\"person_box$isF\" style=\"width: ".$bwidth."px; height: ".$bheight."px; overflow: hidden;\""; } else { $outBoxAdd .= "class=\"person_box$isF\" style=\"overflow: hidden;\""; } // NOTE: Zoom if (!$SEARCH_SPIDER) { $outBoxAdd .= $mouseAction4; } } } else { if ($style==1) { $outBoxAdd .= "class=\"person_box$isF person_box_template style1\" style=\"width: ".$bwidth."px; height: ".$bheight."px;\""; } else { $outBoxAdd .= "class=\"person_box$isF person_box_template style0\""; } } //-- find the name $name = $person->getFullName(); $shortname = $person->getShortName(); if ($SHOW_HIGHLIGHT_IMAGES) { $thumbnail = $person->displayImage(); } else { $thumbnail = ''; } //-- find additional name, e.g. Hebrew $addname=$person->getAddName(); // add optional CSS style for each fact $indirec = $person->getGedcom(); $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 && $show_full) { $genderImage = " ".$person->getSexImage('small', "box-$boxID-gender"); } // Here for alternate name2 if ($addname) { $addname = "
".$addname.""; } if ($SHOW_LDS_AT_GLANCE && $show_full) { $addname = ' '.get_lds_glance($person).'' . $addname; } // Show BIRT or equivalent event $opt_tags=preg_split('/\W/', $CHART_BOX_TAGS, 0, PREG_SPLIT_NO_EMPTY); if ($show_full) { foreach (explode('|', WT_EVENTS_BIRT) as $birttag) { if (!in_array($birttag, $opt_tags)) { $event = $person->getFirstFact($birttag); if ($event && ($event->getDate()->isOK() || $event->getPlace())) { $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->getFirstFact($tag); if (!is_null($event)) { $BirthDeath .= $event->print_simple_fact(true); unset ($opt_tags[$key]); } } } // Show DEAT or equivalent event if ($show_full) { foreach (explode('|', WT_EVENTS_DEAT) as $deattag) { $event = $person->getFirstFact($deattag); if (!is_null($event) && ($event->getDate()->isOK() || $event->getPlace() || $event->getValue()=='Y')) { $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->getFirstFact($tag); if ($event) { $BirthDeath .= $event->print_simple_fact(true); } } // Find the short birth place for compact chart $opt_tags=preg_split('/\W/', $CHART_BOX_TAGS, 0, PREG_SPLIT_NO_EMPTY); foreach (explode('|', WT_EVENTS_BIRT) as $birttag) { if (!in_array($birttag, $opt_tags)) { $event = $person->getFirstFact($birttag); if ($event && ($event->getDate()->isOK() || $event->getPlace())) { $tmp=new WT_Place($event->getPlace(), WT_GED_ID); $birthplace .= $tmp->getShortName(); break; } } } // Output to template if ($show_full) { require WT_THEME_DIR.'templates/personbox_template.php'; } else { require WT_THEME_DIR.'templates/compactbox_template.php'; } } // print HTML header meta links // previously identical code in each theme's header.php file // now added as a function here. function header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL) { $header_links=''; if (!empty($LINK_CANONICAL)) { $header_links.= ''; } if (!empty($META_DESCRIPTION)) { $header_links.= ''; } $header_links.= ''; if (!empty($META_GENERATOR)) { $header_links.= ''; } return $header_links; } /** * Prints Exection Statistics * * prints out the execution time and the databse queries */ function execution_stats() { global $start_time; return '
'. WT_I18N::translate( 'Execution time: %1$s seconds. Database queries: %2$s. Memory usage: %3$s KB.', WT_I18N::number(microtime(true) - $start_time, 3), WT_I18N::number(WT_DB::getQueryCount()), WT_I18N::number(memory_get_peak_usage(true)/1024) ). '
'; } // Generate a login link function login_link() { global $SEARCH_SPIDER; if ($SEARCH_SPIDER) { return ''; } else { return ''. // ''. WT_I18N::translate('Login'). ''; } } // Generate a logout link function logout_link() { global $SEARCH_SPIDER; if ($SEARCH_SPIDER) { return ''; } else { return '' . WT_I18N::translate('Logout') . ''; } } //generate Who is online list function whoisonline() { $NumAnonymous = 0; $loggedusers = array (); $content=''; foreach (get_logged_in_users() as $user_id=>$user_name) { if (WT_USER_IS_ADMIN || get_user_setting($user_id, 'visibleonline')) { $loggedusers[$user_id]=$user_name; } else { $NumAnonymous++; } } $LoginUsers=count($loggedusers); $content .= '
'; if ($NumAnonymous) { $content .= WT_I18N::plural('%d anonymous logged-in user', '%d anonymous logged-in users', $NumAnonymous, $NumAnonymous); if ($LoginUsers) { $content .= ' | '; } } if ($LoginUsers) { $content .= WT_I18N::plural('%d logged-in user', '%d logged-in users', $LoginUsers, $LoginUsers); } $content .= '
'; $content .= '
'; if (WT_USER_ID) { $i=0; foreach ($loggedusers as $user_id=>$user_name) { $content .= '
'; $content .= htmlspecialchars(getUserFullName($user_id))." - ".htmlspecialchars($user_name); if (WT_USER_ID!=$user_id && get_user_setting($user_id, 'contactmethod')!="none") { $content .= ' '; } $i++; $content .= '
'; } } $content .= '
'; return $content; } // 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 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; } } /** * 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 * @param boolean $npage the data is on note page or not * @return boolean */ function print_note_record($text, $nlevel, $nrec, $textOnly=false, $return=false, $npage=false) { global $EXPAND_SOURCES, $EXPAND_NOTES; $elementID = 'N-'.(int)(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]); if (!$npage) { $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 = expand_urls($text); $data = ''; if (!empty($text) || !empty($centitl)) { // Check if Formatted Shared Note (using pipe "|" as delimiter ) -------------------- if (preg_match('/^0 @'.WT_REGEX_XREF.'@ NOTE/', $nrec) && strstr($text, "|") && array_key_exists('GEDFact_assistant', WT_Module::getActiveModules())) { require WT_ROOT.WT_MODULES_DIR.'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, '
'); if (!$npage) { $data .= '
'; if ($brpos !== false) { if ($EXPAND_NOTES) $plusminus='minus'; else $plusminus='plus'; $data .= ' '; } // Check if Shared Note ----------------------------- if (preg_match('/^0 @'.WT_REGEX_XREF.'@ NOTE/', $nrec)) { $data .= WT_I18N::translate('Shared note').': '; } else { $data .= WT_I18N::translate('Note').': '; } } if ($brpos !== false) { $data .= ''.substr($text, 0, $brpos).''; if ($npage) { $data .= substr($text, $brpos + 4) . "
"; } else { $data .= '
'; } $data .= "
"; 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 = ""; $previous_spos = 0; $nlevel = $level+1; $ct = preg_match_all("/$level NOTE(.*)/", $factrec, $match, PREG_SET_ORDER); for ($j=0; $j<$ct; $j++) { $nid = str_replace("@","",$match[$j][1]); $spos1 = strpos($factrec, $match[$j][0], $previous_spos); $spos2 = strpos($factrec."\n$level", "\n$level", $spos1+1); if (!$spos2) $spos2 = strlen($factrec); $previous_spos = $spos2; $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 { $note=WT_Note::getInstance($nmatch[1]); if ($note) { if ($note->canShow()) { $noterec = $note->getGedcom(); //-- print linked note records $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) { require_once WT_ROOT.'includes/functions/functions_print_facts.php'; $data .= print_fact_sources($noterec, 1, true); } } } } else { $data='
'.WT_I18N::translate('Note').': '.$nid.'
'; } } if (!$textOnly) { if (strpos($factrec, "$nlevel SOUR")!==false) { $data .= "
"; $data .= print_fact_sources($nrec, $nlevel, true); $data .= "
"; } } } if (!$return) echo $data; else return $data; } //-- 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 '
', WT_I18N::translate('This information is private and cannot be shown.'), '
'; switch ($method) { case 'none': break; case 'mailto': $email=getUserEmail($user_id); echo '
', WT_I18N::translate('For more information contact'), ' ', ''.htmlspecialchars($fullname).'', '
'; break; default: echo '
', WT_I18N::translate('For more information contact'), ' ', "", $fullname, '', '
'; break; } } // Print a link for a popup help window function help_link($help_topic, $module='') { return ' '; } // Print an external help link to the wiki site, in a new window function wiki_help_link($topic) { return ' '; } // When a user has searched for text, highlight any matches in // the displayed string. function highlight_search_hits($string) { global $controller; if ($controller instanceof WT_Controller_Search && $controller->query) { // TODO: when a search contains multiple words, we search independently. // e.g. searching for "FOO BAR" will find records containing both FOO and BAR. // However, we only highlight the original search string, not the search terms. // The controller needs to provide its "query_terms" array. $regex=array(); foreach (array($controller->query) as $search_term) { $regex[]=preg_quote($search_term, '/'); } // Match these strings, provided they do not occur inside HTML tags $regex='('.implode('|', $regex).')(?![^<]*>)'; return preg_replace('/'.$regex.'/i', '$1', $string); } else { return $string; } } // Print the associations from the associated individuals in $event to the individuals in $record function print_asso_rela_record(WT_Fact $event, WT_GedcomRecord $record) { global $SEARCH_SPIDER; // To whom is this record an assocate? if ($record instanceof WT_Individual) { // On an individual page, we just show links to the person $associates=array($record); } elseif ($record instanceof WT_Family) { // On a family page, we show links to both spouses $associates=$record->getSpouses(); } else { // On other pages, it does not make sense to show associates return; } preg_match_all('/^1 ASSO @('.WT_REGEX_XREF.')@((\n[2-9].*)*)/', $event->getGedcom(), $amatches1, PREG_SET_ORDER); preg_match_all('/\n2 _?ASSO @('.WT_REGEX_XREF.')@((\n[3-9].*)*)/', $event->getGedcom(), $amatches2, PREG_SET_ORDER); // For each ASSO record foreach (array_merge($amatches1, $amatches2) as $amatch) { $person=WT_Individual::getInstance($amatch[1]); if ($person) { if (preg_match('/\n[23] RELA (.+)/', $amatch[2], $rmatch)) { $rela=$rmatch[1]; } else { $rela=''; } $html=array(); foreach ($associates as $associate) { if ($associate) { if ($rela) { $label=''.WT_Gedcom_Code_Rela::getValue($rela, $person).': '; $label_2=''.get_associate_relationship_name($associate, $person).''; } else { // Generate an automatic RELA $label=''; $label_2=''.get_associate_relationship_name($associate, $person).''; } if (!$label && !$label_2) { $label=WT_I18N::translate('Relationships'); $label_2=''; } // For family records (e.g. MARR), identify the spouse with a sex icon if ($record instanceof WT_Family) { $label_2=$associate->getSexImage().$label_2; } if ($SEARCH_SPIDER) { $html[]=$label_2; // Search engines cannot use the relationship chart. } else { $html[]=''.$label_2.''; } } } $html=array_unique($html); echo '
',$label, implode(WT_I18N::$list_separator, $html), ' - ', '', $person->getFullName(), ''; echo '
'; } else { echo WT_Gedcom_Tag::getLabelValue('ASSO', '' . $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=WT_Individual::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); foreach ($family->getSpouses() as $parent) { if ($parent->getBirthDate()->isOK()) { $sex=$parent->getSexImage(); $age=WT_Date::getAge($parent->getBirthDate(), $birth_date, 2); $deatdate=$parent->getDeathDate(); switch ($parent->getSex()) { case 'F': // Highlight mothers who die in childbirth or shortly afterwards if ($deatdate->isOK() && $deatdate->MinJD()<$birth_date->MinJD()+90) { $html.=' '.$sex.$age.''; } else { $html.=' '.$sex.$age.''; } break; case 'M': // Highlight fathers who die before the birth if ($deatdate->isOK() && $deatdate->MinJD()<$birth_date->MinJD()) { $html.=' '.$sex.$age.''; } else { $html.=' '.$sex.$age.''; } break; default: $html.=' '.$sex.$age.''; break; } } } if ($html) { $html=''.$html.''; } } } return $html; } // print fact DATE TIME // // $event - event containing the date/age // $record - the person (or couple) whose ages should be printed // $anchor option to print a link to calendar // $time option to print TIME value function format_fact_date(WT_Fact $event, WT_GedcomRecord $record, $anchor=false, $time=false) { global $pid, $SEARCH_SPIDER; global $GEDCOM; $ged_id=get_id_from_gedcom($GEDCOM); $factrec = $event->getGedcom(); $html=''; // Recorded age if (preg_match('/\n2 AGE (.+)/', $factrec, $match)) { $fact_age = $match[1]; } else { $fact_age = ''; } if (preg_match('/\n2 HUSB\n3 AGE (.+)/', $factrec, $match)) { $husb_age = $match[1]; } else { $husb_age = ''; } if (preg_match('/\n2 WIFE\n3 AGE (.+)/', $factrec, $match)) { $wife_age = $match[1]; } else { $wife_age = ''; } // Calculated age if (preg_match('/2 DATE (.+)/', $factrec, $match)) { $date=new WT_Date($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 = $event->getTag(); if ($record instanceof WT_Individual) { // age of parents at child birth if ($fact=='BIRT') { $html .= format_parents_age($record->getXref(), $date); } // age at event else if ($fact!='CHAN' && $fact!='_TODO') { $birth_date=$record->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=$record->getFirstFact('DEAT'); if ($death_event) { $death_date=$death_event->getDate(); } else { $death_date=new WT_Date(''); } $ageText = ''; if ((WT_Date::Compare($date, $death_date)<=0 || !$record->isDead()) || $fact=='DEAT') { // Before death, print age $age=WT_Date::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!='' && $record->getSex()=='M' && $husb_age!=$age || $wife_age!='' && $record->getSex()=='F' && $wife_age!=$age ) { if ($age!="0d") { $ageText = '('.WT_I18N::translate('Age').' '.get_age_at_event($age, false).')'; } } } } if ($fact!='DEAT' && WT_Date::Compare($date, $death_date)>=0) { // After death, print time since death $age=get_age_at_event(WT_Date::GetAgeGedcom($death_date, $date), true); if ($age!='') { if (WT_Date::GetAgeGedcom($death_date, $date)=="0d") { $ageText = '('.WT_I18N::translate('on the date of death').')'; } else { $ageText = '('.$age.' '.WT_I18N::translate('after death').')'; // Family events which occur after death are probably errors if ($event->getParent() instanceof WT_Family) { $ageText.=''; } } } } if ($ageText) $html .= ' '.$ageText.''; } } elseif ($record instanceof WT_Family) { $indi = WT_Individual::getInstance($pid); if ($indi) { $birth_date=$indi->getBirthDate(); $death_date=$indi->getDeathDate(); $ageText = ''; if (WT_Date::Compare($date, $death_date)<=0) { $age=WT_Date::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 = '('.WT_I18N::translate('Age').' '.get_age_at_event($age, false).')'; } } } if ($ageText) $html .= ' '.$ageText.''; } } } else { // 1 DEAT Y with no DATE => print YES // 1 BIRT 2 SOUR @S1@ => 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. $factdetail = explode(' ', trim($factrec)); if (isset($factdetail) && (count($factdetail) == 3 && strtoupper($factdetail[2]) == 'Y') || (count($factdetail) == 4 && $factdetail[2] == 'SOUR')) { $html.=WT_I18N::translate('yes'); } } // print gedcom ages foreach (array(WT_Gedcom_Tag::getLabel('AGE')=>$fact_age, WT_Gedcom_Tag::getLabel('HUSB')=>$husb_age, WT_Gedcom_Tag::getLabel('WIFE')=>$wife_age) as $label=>$age) { if ($age!='') { $html.=' '.$label.': '.get_age_at_event($age, false).''; } } return $html; } /** * print fact PLACe TEMPle STATus * * @param Event $event 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(WT_Fact $event, $anchor=false, $sub=false, $lds=false) { global $SHOW_PEDIGREE_PLACES, $SHOW_PEDIGREE_PLACES_SUFFIX, $SEARCH_SPIDER; $factrec = $event->getGedcom(); $wt_place=new WT_Place($event->getPlace(), WT_GED_ID); $name_parts=explode(', ', $event->getPlace()); $ct=count($name_parts); if ($anchor) { // Show the full place name, for facts/events tab if ($SEARCH_SPIDER) { $html=$wt_place->getFullName(); } else { $html='' . $wt_place->getFullName() . ''; } } else { // Abbreviate the place name, for chart boxes return ' - ' . $wt_place->getShortName(); } $ctn=0; if ($sub) { $placerec = get_sub_record(2, '2 PLAC', $factrec); if (!empty($placerec)) { if (preg_match_all('/\n3 (?:_HEB|ROMN) (.+)/', $placerec, $matches)) { foreach ($matches[1] as $match) { $wt_place=new WT_Place($match, WT_GED_ID); $html.=' - ' . $wt_place->getFullName(); } } $map_lati=""; $cts = preg_match('/\d LATI (.*)/', $placerec, $match); if ($cts>0) { $map_lati=$match[1]; $html.='
'.WT_Gedcom_Tag::getLabel('LATI').': '.$map_lati; } $map_long=""; $cts = preg_match('/\d LONG (.*)/', $placerec, $match); if ($cts>0) { $map_long=$match[1]; $html.=' '.WT_Gedcom_Tag::getLabel('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 if ($name_parts) { $place=$name_parts[0]; } else { $place=''; } $html.=' '; $html.=' '; $html.=' '; $html.=' '; } 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]); $html.='
'.WT_I18N::translate('LDS Temple').': '.WT_Gedcom_Code_Temp::templeName($match[1]); } if (preg_match('/2 STAT (.*)/', $factrec, $match)) { $html.='
'.WT_I18N::translate('Status').': '.WT_Gedcom_Code_Stat::statusName($match[1]); if (preg_match('/3 DATE (.*)/', $factrec, $match)) { $date=new WT_Date($match[1]); $html.=', '.WT_Gedcom_Tag::getLabel('STAT:DATE').': '.$date->Display(false); } } } 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 $WT_SESSION; // -- Add from clipboard if ($WT_SESSION->clipboard) { $newRow = true; foreach (array_reverse($WT_SESSION->clipboard, true) as $key=>$fact) { if ($fact["type"]==$type || $fact["type"]=='all') { if ($newRow) { $newRow = false; echo ''; echo WT_I18N::translate('Add from clipboard'), ''; echo '
'; echo ''; echo '   "; echo '
', "\n"; } } // -- Add from pick list switch ($type) { case "INDI": $addfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'INDI_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'INDI_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'INDI_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); break; case "FAM": $addfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'FAM_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'FAM_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'FAM_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); break; case "SOUR": $addfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'SOUR_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'SOUR_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'SOUR_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); break; case "NOTE": $addfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'NOTE_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'NOTE_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'NOTE_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); break; case "REPO": $addfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'REPO_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); $uniquefacts=preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'REPO_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); $quickfacts =preg_split("/[, ;:]+/", get_gedcom_setting(WT_GED_ID, 'REPO_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); break; default: return; } $addfacts=array_merge(CheckFactUnique($uniquefacts, $usedfacts, $type), $addfacts); $quickfacts=array_intersect($quickfacts, $addfacts); $translated_addfacts=array(); foreach ($addfacts as $addfact) { $translated_addfacts[$addfact] = WT_Gedcom_Tag::getLabel($addfact); } uasort($translated_addfacts, 'factsort'); echo ''; echo WT_I18N::translate('Fact or event'); echo help_link('add_facts'), ''; echo ''; echo '
'; echo ''; echo ''; echo ''; foreach ($quickfacts as $fact) echo '', WT_Gedcom_Tag::getLabel($fact), ''; echo '
'; echo ''; } /** * javascript declaration for calendar popup * * @param none */ function init_calendar_popup() { global $WEEK_START, $controller; $controller->addInlineJavascript(' cal_setMonthNames( "' . WT_I18N::translate_c('NOMINATIVE', 'January') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'February') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'March') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'April') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'May') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'June') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'July') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'August') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'September') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'October') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'November') . '", "' . WT_I18N::translate_c('NOMINATIVE', 'December') . '" ) cal_setDayHeaders( "' . WT_I18N::translate('Sun') . '", "' . WT_I18N::translate('Mon') . '", "' . WT_I18N::translate('Tue') . '", "' . WT_I18N::translate('Wed') . '", "' . WT_I18N::translate('Thu') . '", "' . WT_I18N::translate('Fri') . '", "' . WT_I18N::translate('Sat') . '" ) cal_setWeekStart(' . $WEEK_START . '); '); } function print_findindi_link($element_id, $indiname='') { return ''; } function print_findplace_link($element_id) { return ''; } function print_findfamily_link($element_id) { return ''; } function print_specialchar_link($element_id) { return ''; } function print_autopaste_link($element_id, $choices) { echo ''; foreach ($choices as $indexval => $choice) { echo '", $choice, ' '; } echo ''; } function print_findsource_link($element_id, $sourcename='') { return ''; } function print_findnote_link($element_id, $notename='') { return ''; } function print_findrepository_link($element_id) { return ''; } function print_findmedia_link($element_id, $choose='') { return ''; } function print_findfact_link($element_id) { return ''; } // Summary of LDS ordinances function get_lds_glance(WT_Individual $indi) { $BAPL = $indi->getFacts('BAPL') ? 'B' : '_'; $ENDL = $indi->getFacts('ENDL') ? 'E' : '_'; $ENDL = $indi->getFacts('SLGC') ? 'C' : '_'; $SLGS = '_'; foreach ($indi->getSpouseFamilies() as $family) { if ($family->getFacts('SLGS')) { $SLGS = ''; } } return $BAPL . $ENDL . $SLGS . $SLGC; }