setPageTitle(I18N::translate('Edit'))
->pageHeader();
// If the fact has a DATE or PLAC, then delete any value of Y
if ($text[0] === 'Y') {
for ($n = 1; $n < count($tag); ++$n) {
if ($glevels[$n] == 2 && ($tag[$n] === 'DATE' || $tag[$n] === 'PLAC') && $text[$n]) {
$text[0] = '';
break;
}
}
}
$newged = '';
if (!empty($_POST['NAME'])) {
$newged .= "\n1 NAME " . $_POST['NAME'];
}
if (!empty($_POST['TYPE'])) {
$newged .= "\n2 TYPE " . $_POST['TYPE'];
}
if (!empty($_POST['NPFX'])) {
$newged .= "\n2 NPFX " . $_POST['NPFX'];
}
if (!empty($_POST['GIVN'])) {
$newged .= "\n2 GIVN " . $_POST['GIVN'];
}
if (!empty($_POST['NICK'])) {
$newged .= "\n2 NICK " . $_POST['NICK'];
}
if (!empty($_POST['SPFX'])) {
$newged .= "\n2 SPFX " . $_POST['SPFX'];
}
if (!empty($_POST['SURN'])) {
$newged .= "\n2 SURN " . $_POST['SURN'];
}
if (!empty($_POST['NSFX'])) {
$newged .= "\n2 NSFX " . $_POST['NSFX'];
}
if (isset($_POST['NOTE'])) {
$NOTE = $_POST['NOTE'];
}
if (!empty($NOTE)) {
$tempnote = preg_split('/\r?\n/', trim($NOTE) . "\n"); // make sure only one line ending on the end
$title[] = '0 @' . $xref . '@ NOTE ' . array_shift($tempnote);
foreach ($tempnote as &$line) {
$line = trim('1 CONT ' . $line, ' ');
}
}
$newged = FunctionsEdit::handleUpdates($newged);
// Add new names after existing names
if (!empty($_POST['_MARNM'])) {
$newged .= "\n2 _MARNM " . $_POST['_MARNM'];
}
if (!empty($_POST['ROMN'])) {
$newged .= "\n2 ROMN " . $_POST['ROMN'];
}
if (!empty($_POST['FONE'])) {
$newged .= "\n2 FONE " . $_POST['FONE'];
}
if (!empty($_POST['_HEB'])) {
$newged .= "\n2 _HEB " . $_POST['_HEB'];
}
if (!empty($_POST['_AKA'])) {
$newged .= "\n2 _AKA " . $_POST['_AKA'];
}
$newged = substr($newged, 1); // Remove leading newline
$record->updateFact($fact_id, $newged, !$keep_chan);
// For the GEDFact_assistant module
$pid_array = Filter::post('pid_array');
if ($pid_array) {
foreach (explode(',', $pid_array) as $pid) {
if ($pid !== $xref) {
$indi = Individual::getInstance($pid, $WT_TREE);
if ($indi && $indi->canEdit()) {
$indi->updateFact($fact_id, $newged, !$keep_chan);
}
}
}
}
$controller->addInlineJavascript('closePopupAndReloadParent();');
break;
////////////////////////////////////////////////////////////////////////////////
// Add a child to an existing family
////////////////////////////////////////////////////////////////////////////////
case 'add_child_to_family':
$xref = Filter::get('xref', WT_REGEX_XREF);
$gender = Filter::get('gender', '[MFU]', 'U');
$family = Family::getInstance($xref, $WT_TREE);
check_record_access($family);
$controller
->setPageTitle($family->getFullName() . ' - ' . I18N::translate('Add a child'))
->pageHeader();
print_indi_form('add_child_to_family_action', null, $family, null, 'CHIL', $gender);
break;
case 'add_child_to_family_action':
$xref = Filter::post('xref', WT_REGEX_XREF);
$PEDI = Filter::post('PEDI');
$keep_chan = Filter::postBool('keep_chan');
$glevels = Filter::postArray('glevels', '[0-9]');
$tag = Filter::postArray('tag', WT_REGEX_TAG);
$text = Filter::postArray('text');
$islink = Filter::postArray('islink', '[01]');
if (!Filter::checkCsrf()) {
$gender = Filter::get('gender', '[MFU]', 'U');
header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . '?action=add_child_to_family&xref=' . $xref . '&gender=' . $gender);
return;
}
$family = Family::getInstance($xref, $WT_TREE);
check_record_access($family);
$controller->pageHeader();
FunctionsEdit::splitSource();
$gedrec = '0 @REF@ INDI';
$gedrec .= FunctionsEdit::addNewName();
$gedrec .= FunctionsEdit::addNewSex();
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
foreach ($matches[1] as $match) {
$gedrec .= FunctionsEdit::addNewFact($match);
}
}
$gedrec .= "\n" . GedcomCodePedi::createNewFamcPedi($PEDI, $xref);
if (Filter::postBool('SOUR_INDI')) {
$gedrec = FunctionsEdit::handleUpdates($gedrec);
} else {
$gedrec = FunctionsEdit::updateRest($gedrec);
}
// Create the new child
$new_child = $family->getTree()->createRecord($gedrec);
// Insert new child at the right place
$done = false;
foreach ($family->getFacts('CHIL') as $fact) {
$old_child = $fact->getTarget();
if ($old_child && Date::compare($new_child->getEstimatedBirthDate(), $old_child->getEstimatedBirthDate()) < 0) {
// Insert before this child
$family->updateFact($fact->getFactId(), '1 CHIL @' . $new_child->getXref() . "@\n" . $fact->getGedcom(), !$keep_chan);
$done = true;
break;
}
}
if (!$done) {
// Append child at end
$family->createFact('1 CHIL @' . $new_child->getXref() . '@', !$keep_chan);
}
if (Filter::post('goto') === 'new') {
$controller->addInlineJavascript('closePopupAndReloadParent("' . $new_child->getRawUrl() . '");');
} else {
$controller->addInlineJavascript('closePopupAndReloadParent();');
}
break;
////////////////////////////////////////////////////////////////////////////////
// Add a child to an existing individual (creating a one-parent family)
////////////////////////////////////////////////////////////////////////////////
case 'add_child_to_individual':
$xref = Filter::get('xref', WT_REGEX_XREF);
$person = Individual::getInstance($xref, $WT_TREE);
check_record_access($person);
$controller
->setPageTitle($person->getFullName() . ' - ' . I18N::translate('Add a child to create a one-parent family'))
->pageHeader();
print_indi_form('add_child_to_individual_action', $person, null, null, 'CHIL', $person->getSex());
break;
case 'add_child_to_individual_action':
$xref = Filter::post('xref', WT_REGEX_XREF);
$PEDI = Filter::post('PEDI');
$glevels = Filter::postArray('glevels', '[0-9]');
$tag = Filter::postArray('tag', WT_REGEX_TAG);
$text = Filter::postArray('text');
$islink = Filter::postArray('islink', '[01]');
if (!Filter::checkCsrf()) {
header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . '?action=add_child_to_individual&xref=' . $xref);
return;
}
$person = Individual::getInstance($xref, $WT_TREE);
check_record_access($person);
$controller->pageHeader();
// Create a family
if ($person->getSex() === 'F') {
$gedcom = "0 @NEW@ FAM\n1 WIFE @" . $person->getXref() . '@';
} else {
$gedcom = "0 @NEW@ FAM\n1 HUSB @" . $person->getXref() . '@';
}
$family = $person->getTree()->createRecord($gedcom);
// Link the parent to the family
$person->createFact('1 FAMS @' . $family->getXref() . '@', true);
// Create a child
FunctionsEdit::splitSource(); // separate SOUR record from the rest
$gedcom = '0 @NEW@ INDI';
$gedcom .= FunctionsEdit::addNewName();
$gedcom .= FunctionsEdit::addNewSex();
$gedcom .= "\n" . GedcomCodePedi::createNewFamcPedi($PEDI, $family->getXref());
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
foreach ($matches[1] as $match) {
$gedcom .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_INDI')) {
$gedcom = FunctionsEdit::handleUpdates($gedcom);
} else {
$gedcom = FunctionsEdit::updateRest($gedcom);
}
$child = $person->getTree()->createRecord($gedcom);
// Link the family to the child
$family->createFact('1 CHIL @' . $child->getXref() . '@', true);
if (Filter::post('goto') === 'new') {
$controller->addInlineJavascript('closePopupAndReloadParent("' . $child->getRawUrl() . '");');
} else {
$controller->addInlineJavascript('closePopupAndReloadParent();');
}
break;
////////////////////////////////////////////////////////////////////////////////
// Add a new parent to an existing individual (creating a one-parent family)
////////////////////////////////////////////////////////////////////////////////
case 'add_parent_to_individual':
$xref = Filter::get('xref', WT_REGEX_XREF);
$gender = Filter::get('gender', '[MF]', 'U');
$individual = Individual::getInstance($xref, $WT_TREE);
check_record_access($individual);
if ($gender === 'F') {
$controller->setPageTitle(I18N::translate('Add a mother'));
$famtag = 'WIFE';
} else {
$controller->setPageTitle(I18N::translate('Add a father'));
$famtag = 'HUSB';
}
$controller->pageHeader();
print_indi_form('add_parent_to_individual_action', $individual, null, null, $famtag, $gender);
break;
case 'add_parent_to_individual_action':
$xref = Filter::post('xref', WT_REGEX_XREF);
$PEDI = Filter::post('PEDI');
$glevels = Filter::postArray('glevels', '[0-9]');
$tag = Filter::postArray('tag', WT_REGEX_TAG);
$text = Filter::postArray('text');
$islink = Filter::postArray('islink', '[01]');
if (!Filter::checkCsrf()) {
$gender = Filter::get('gender', '[MFU]', 'U');
header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . '?action=add_parent_to_individual&xref=' . $xref . '&gender=' . $gender);
return;
}
$person = Individual::getInstance($xref, $WT_TREE);
check_record_access($person);
$controller->pageHeader();
// Create a new family
$gedcom = "0 @NEW@ FAM\n1 CHIL @" . $person->getXref() . '@';
$family = $person->getTree()->createRecord($gedcom);
// Link the child to the family
$person->createFact('1 FAMC @' . $family->getXref() . '@', true);
// Create a child
FunctionsEdit::splitSource(); // separate SOUR record from the rest
$gedcom = '0 @NEW@ INDI';
$gedcom .= FunctionsEdit::addNewName();
$gedcom .= FunctionsEdit::addNewSex();
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
foreach ($matches[1] as $match) {
$gedcom .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_INDI')) {
$gedcom = FunctionsEdit::handleUpdates($gedcom);
} else {
$gedcom = FunctionsEdit::updateRest($gedcom);
}
$gedcom .= "\n1 FAMS @" . $family->getXref() . '@';
$parent = $person->getTree()->createRecord($gedcom);
// Link the family to the child
if ($parent->getSex() === 'F') {
$family->createFact('1 WIFE @' . $parent->getXref() . '@', true);
} else {
$family->createFact('1 HUSB @' . $parent->getXref() . '@', true);
}
if (Filter::post('goto') === 'new') {
$controller->addInlineJavascript('closePopupAndReloadParent("' . $parent->getRawUrl() . '");');
} else {
$controller->addInlineJavascript('closePopupAndReloadParent();');
}
break;
////////////////////////////////////////////////////////////////////////////////
// Add a new, unlinked individual
////////////////////////////////////////////////////////////////////////////////
case 'add_unlinked_indi':
$controller
->restrictAccess(Auth::isManager($WT_TREE))
->setPageTitle(I18N::translate('Create an individual'))
->pageHeader();
print_indi_form('add_unlinked_indi_action', null, null, null, null, null);
break;
case 'add_unlinked_indi_action':
$glevels = Filter::postArray('glevels', '[0-9]');
$tag = Filter::postArray('tag', WT_REGEX_TAG);
$text = Filter::postArray('text');
$islink = Filter::postArray('islink', '[01]');
if (!Filter::checkCsrf()) {
header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . '?action=add_unlinked_indi');
return;
}
$controller
->restrictAccess(Auth::isManager($WT_TREE))
->pageHeader();
FunctionsEdit::splitSource();
$gedrec = '0 @REF@ INDI';
$gedrec .= FunctionsEdit::addNewName();
$gedrec .= FunctionsEdit::addNewSex();
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
foreach ($matches[1] as $match) {
$gedrec .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_INDI')) {
$gedrec = FunctionsEdit::handleUpdates($gedrec);
} else {
$gedrec = FunctionsEdit::updateRest($gedrec);
}
$new_indi = $WT_TREE->createRecord($gedrec);
if (Filter::post('goto') === 'new') {
$controller->addInlineJavascript('closePopupAndReloadParent("' . $new_indi->getRawUrl() . '");');
} else {
$controller->addInlineJavascript('closePopupAndReloadParent();');
}
break;
////////////////////////////////////////////////////////////////////////////////
// Add a spouse to an existing individual (creating a new family)
////////////////////////////////////////////////////////////////////////////////
case 'add_spouse_to_individual':
$famtag = Filter::get('famtag', 'HUSB|WIFE');
$xref = Filter::get('xref', WT_REGEX_XREF);
$individual = Individual::getInstance($xref, $WT_TREE);
check_record_access($individual);
if ($famtag === 'WIFE') {
$controller->setPageTitle(I18N::translate('Add a wife'));
$sex = 'F';
} else {
$controller->setPageTitle(I18N::translate('Add a husband'));
$sex = 'M';
}
$controller->pageHeader();
print_indi_form('add_spouse_to_individual_action', $individual, null, null, $famtag, $sex);
break;
case 'add_spouse_to_individual_action':
$xref = Filter::post('xref'); // Add a spouse to this individual
$sex = Filter::post('SEX', '[MFU]', 'U');
$glevels = Filter::postArray('glevels', '[0-9]');
$tag = Filter::postArray('tag', WT_REGEX_TAG);
$text = Filter::postArray('text');
$islink = Filter::postArray('islink', '[01]');
if (!Filter::checkCsrf()) {
$famtag = Filter::get('famtag', 'HUSB|WIFE');
header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . '?action=add_spouse_to_individual&xref=' . $xref . '&famtag=' . $famtag);
return;
}
$person = Individual::getInstance($xref, $WT_TREE);
check_record_access($person);
$controller
->setPageTitle(I18N::translate('Add a spouse'))
->pageHeader();
FunctionsEdit::splitSource();
$indi_gedcom = '0 @REF@ INDI';
$indi_gedcom .= FunctionsEdit::addNewName();
$indi_gedcom .= FunctionsEdit::addNewSex();
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
foreach ($matches[1] as $match) {
$indi_gedcom .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_INDI')) {
$indi_gedcom = FunctionsEdit::handleUpdates($indi_gedcom);
} else {
$indi_gedcom = FunctionsEdit::updateRest($indi_gedcom);
}
$fam_gedcom = '';
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FAMFACTS'), $matches)) {
foreach ($matches[1] as $match) {
$fam_gedcom .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_FAM')) {
$fam_gedcom = FunctionsEdit::handleUpdates($fam_gedcom);
} else {
$fam_gedcom = FunctionsEdit::updateRest($fam_gedcom);
}
// Create the new spouse
$spouse = $person->getTree()->createRecord($indi_gedcom);
// Create a new family
if ($sex === 'F') {
$family = $spouse->getTree()->createRecord("0 @NEW@ FAM\n1 WIFE @" . $spouse->getXref() . "@\n1 HUSB @" . $person->getXref() . '@' . $fam_gedcom);
} else {
$family = $spouse->getTree()->createRecord("0 @NEW@ FAM\n1 HUSB @" . $spouse->getXref() . "@\n1 WIFE @" . $person->getXref() . '@' . $fam_gedcom);
}
// Link the spouses to the family
$spouse->createFact('1 FAMS @' . $family->getXref() . '@', true);
$person->createFact('1 FAMS @' . $family->getXref() . '@', true);
if (Filter::post('goto') === 'new') {
$controller->addInlineJavascript('closePopupAndReloadParent("' . $spouse->getRawUrl() . '");');
} else {
$controller->addInlineJavascript('closePopupAndReloadParent();');
}
break;
////////////////////////////////////////////////////////////////////////////////
// Add a spouse to an existing family
////////////////////////////////////////////////////////////////////////////////
case 'add_spouse_to_family':
$xref = Filter::get('xref', WT_REGEX_XREF);
$famtag = Filter::get('famtag', 'HUSB|WIFE');
$family = Family::getInstance($xref, $WT_TREE);
check_record_access($family);
if ($famtag === 'WIFE') {
$controller->setPageTitle(I18N::translate('Add a wife'));
$sex = 'F';
} else {
$controller->setPageTitle(I18N::translate('Add a husband'));
$sex = 'M';
}
$controller->pageHeader();
print_indi_form('add_spouse_to_family_action', null, $family, null, $famtag, $sex);
break;
case 'add_spouse_to_family_action':
$xref = Filter::post('xref', WT_REGEX_XREF);
$glevels = Filter::postArray('glevels', '[0-9]');
$tag = Filter::postArray('tag', WT_REGEX_TAG);
$text = Filter::postArray('text');
$islink = Filter::postArray('islink', '[01]');
$family = Family::getInstance($xref, $WT_TREE);
check_record_access($family);
if (!Filter::checkCsrf()) {
$famtag = Filter::get('famtag', 'HUSB|WIFE');
header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . '?action=add_spouse_to_family&xref=' . $xref . '&famtag=' . $famtag);
return;
}
$controller->pageHeader();
// Create the new spouse
FunctionsEdit::splitSource(); // separate SOUR record from the rest
$gedrec = '0 @REF@ INDI';
$gedrec .= FunctionsEdit::addNewName();
$gedrec .= FunctionsEdit::addNewSex();
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
foreach ($matches[1] as $match) {
$gedrec .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_INDI')) {
$gedrec = FunctionsEdit::handleUpdates($gedrec);
} else {
$gedrec = FunctionsEdit::updateRest($gedrec);
}
$gedrec .= "\n1 FAMS @" . $family->getXref() . '@';
$spouse = $family->getTree()->createRecord($gedrec);
// Update the existing family - add marriage, etc
if ($family->getFirstFact('HUSB')) {
$family->createFact('1 WIFE @' . $spouse->getXref() . '@', true);
} else {
$family->createFact('1 HUSB @' . $spouse->getXref() . '@', true);
}
$famrec = '';
if (preg_match_all('/([A-Z0-9_]+)/', $WT_TREE->getPreference('QUICK_REQUIRED_FAMFACTS'), $matches)) {
foreach ($matches[1] as $match) {
$famrec .= FunctionsEdit::addNewFact($match);
}
}
if (Filter::postBool('SOUR_FAM')) {
$famrec = FunctionsEdit::handleUpdates($famrec);
} else {
$famrec = FunctionsEdit::updateRest($famrec);
}
$family->createFact(trim($famrec), true); // trim leading \n
if (Filter::post('goto') === 'new') {
$controller->addInlineJavascript('closePopupAndReloadParent("' . $spouse->getRawUrl() . '");');
} else {
$controller->addInlineJavascript('closePopupAndReloadParent();');
}
break;
////////////////////////////////////////////////////////////////////////////////
// Link an individual to an existing family, as a child
////////////////////////////////////////////////////////////////////////////////
case 'addfamlink':
$xref = Filter::get('xref', WT_REGEX_XREF);
$person = Individual::getInstance($xref, $WT_TREE);
check_record_access($person);
$controller
->setPageTitle($person->getFullName() . ' - ' . I18N::translate('Link this individual to an existing family as a child'))
->pageHeader();
?>
getPageTitle(); ?>
setPageTitle($person->getFullName() . ' - ' . I18N::translate('Link this individual to an existing family as a child'))
->pageHeader();
// Replace any existing child->family link (we may be changing the PEDI);
$fact_id = null;
foreach ($person->getFacts('FAMC') as $fact) {
if ($family === $fact->getTarget()) {
$fact_id = $fact->getFactId();
break;
}
}
$gedcom = GedcomCodePedi::createNewFamcPedi($PEDI, $famid);
$person->updateFact($fact_id, $gedcom, true);
// Only set the family->child link if it does not already exist
$edit_fact = null;
foreach ($family->getFacts('CHIL') as $fact) {
if ($person === $fact->getTarget()) {
$edit_fact = $fact;
break;
}
}
if (!$edit_fact) {
$family->createFact('1 CHIL @' . $person->getXref() . '@', true);
}
$controller->addInlineJavascript('closePopupAndReloadParent();');
break;
////////////////////////////////////////////////////////////////////////////////
// Link and individual to an existing individual as a spouse
////////////////////////////////////////////////////////////////////////////////
case 'linkspouse':
$famtag = Filter::get('famtag', 'HUSB|WIFE');
$xref = Filter::get('xref', WT_REGEX_XREF);
$person = Individual::getInstance($xref, $WT_TREE);
check_record_access($person);
if ($person->getSex() === 'F') {
$controller->setPageTitle($person->getFullName() . ' - ' . I18N::translate('Add a husband using an existing individual'));
$label = I18N::translate('Husband');
} else {
$controller->setPageTitle($person->getFullName() . ' - ' . I18N::translate('Add a wife using an existing individual'));
$label = I18N::translate('Wife');
}
$controller->pageHeader();
FunctionsPrint::initializeCalendarPopup();
?>
getPageTitle(); ?>
getSex() === 'F') {
$controller->setPageTitle($person->getFullName() . ' - ' . I18N::translate('Add a husband using an existing individual'));
} else {
$controller->setPageTitle($person->getFullName() . ' - ' . I18N::translate('Add a wife using an existing individual'));
}
$controller->pageHeader();
if ($person->getSex() === 'M') {
$gedcom = "0 @new@ FAM\n1 HUSB @" . $person->getXref() . "@\n1 WIFE @" . $spouse->getXref() . '@';
} else {
$gedcom = "0 @new@ FAM\n1 HUSB @" . $spouse->getXref() . "@\n1 WIFE @" . $person->getXref() . '@';
}
FunctionsEdit::splitSource();
$gedcom .= FunctionsEdit::addNewFact('MARR');
if (Filter::postBool('SOUR_FAM') || count($tagSOUR) > 0) {
// before adding 2 SOUR it needs to add 1 MARR Y first
if (FunctionsEdit::addNewFact('MARR') === '') {
$gedcom .= "\n1 MARR Y";
}
$gedcom = FunctionsEdit::handleUpdates($gedcom);
} else {
// before adding level 2 facts it needs to add 1 MARR Y first
if (FunctionsEdit::addNewFact('MARR') === '') {
$gedcom .= "\n1 MARR Y";
}
$gedcom = FunctionsEdit::updateRest($gedcom);
}
$family = $person->getTree()->createRecord($gedcom);
$person->createFact('1 FAMS @' . $family->getXref() . '@', true);
$spouse->createFact('1 FAMS @' . $family->getXref() . '@', true);
$controller->addInlineJavascript('closePopupAndReloadParent();');
break;
////////////////////////////////////////////////////////////////////////////////
// Create a new source record
////////////////////////////////////////////////////////////////////////////////
case 'addnewsource':
$controller
->setPageTitle(I18N::translate('Create a source'))
->pageHeader();
?>
';
} else {
return '';
}
}
/**
* Print a form to add an individual or edit an individual’s name
*
* @param string $nextaction
* @param Individual $person
* @param Family $family
* @param Fact $name_fact
* @param string $famtag
* @param string $gender
*/
function print_indi_form($nextaction, Individual $person = null, Family $family = null, Fact $name_fact = null, $famtag = 'CHIL', $gender = 'U') {
global $WT_TREE, $bdm, $controller;
if ($person) {
$xref = $person->getXref();
} elseif ($family) {
$xref = $family->getXref();
} else {
$xref = 'new';
}
// Different cultures do surnames differently
$surname_tradition = SurnameTradition::create($WT_TREE->getPreference('SURNAME_TRADITION'));
$name_fields = array();
if ($name_fact) {
// Editing an existing name
$name_fact_id = $name_fact->getFactId();
$name_type = $name_fact->getAttribute('TYPE');
$namerec = $name_fact->getGedcom();
foreach (Config::standardNameFacts() as $tag) {
if ($tag === 'NAME') {
$name_fields[$tag] = $name_fact->getValue();
} else {
$name_fields[$tag] = $name_fact->getAttribute($tag);
}
}
// Populate any missing 2 XXXX fields from the 1 NAME field
$npfx_accept = implode('|', Config::namePrefixes());
if (preg_match('/(((' . $npfx_accept . ')\.? +)*)([^\n\/"]*)("(.*)")? *\/(([a-z]{2,3} +)*)(.*)\/ *(.*)/i', $name_fields['NAME'], $name_bits)) {
if (empty($name_fields['NPFX'])) {
$name_fields['NPFX'] = $name_bits[1];
}
if (empty($name_fields['SPFX']) && empty($name_fields['SURN'])) {
$name_fields['SPFX'] = trim($name_bits[7]);
// For names with two surnames, there will be four slashes.
// Turn them into a list
$name_fields['SURN'] = preg_replace('~/[^/]*/~', ',', $name_bits[9]);
}
if (empty($name_fields['GIVN'])) {
$name_fields['GIVN'] = $name_bits[4];
}
if (empty($name_fields['NICK']) && !empty($name_bits[6]) && !preg_match('/^2 NICK/m', $namerec)) {
$name_fields['NICK'] = $name_bits[6];
}
}
} else {
// Creating a new name
$name_fact_id = null;
$name_type = null;
$namerec = null;
// Populate the standard NAME field and subfields
foreach (Config::standardNameFacts() as $tag) {
$name_fields[$tag] = '';
}
// Inherit surname from parents, spouse or child
if ($family) {
$father = $family->getHusband();
if ($father && $father->getFirstFact('NAME')) {
$father_name = $father->getFirstFact('NAME')->getValue();
} else {
$father_name = '';
}
$mother = $family->getWife();
if ($mother && $mother->getFirstFact('NAME')) {
$mother_name = $mother->getFirstFact('NAME')->getValue();
} else {
$mother_name = '';
}
} else {
$father = null;
$mother = null;
$father_name = '';
$mother_name = '';
}
if ($person && $person->getFirstFact('NAME')) {
$indi_name = $person->getFirstFact('NAME')->getValue();
} else {
$indi_name = '';
}
switch ($nextaction) {
case 'add_child_to_family_action':
$name_fields = array_merge($name_fields, $surname_tradition->newChildNames($father_name, $mother_name, $gender));
break;
case 'add_child_to_individual_action':
if ($person->getSex() === 'F') {
$name_fields = array_merge($name_fields, $surname_tradition->newChildNames('', $indi_name, $gender));
} else {
$name_fields = array_merge($name_fields, $surname_tradition->newChildNames($indi_name, '', $gender));
}
break;
case 'add_parent_to_individual_action':
$name_fields = array_merge($name_fields, $surname_tradition->newParentNames($indi_name, $gender));
break;
case 'add_spouse_to_family_action':
if ($father) {
$name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($father_name, $gender));
} else {
$name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($mother_name, $gender));
}
break;
case 'add_spouse_to_individual_action':
$name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($indi_name, $gender));
break;
case 'add_unlinked_indi_action':
case 'update':
if ($surname_tradition->hasSurnames()) {
$name_fields['NAME'] = '//';
}
break;
}
}
$bdm = ''; // used to copy '1 SOUR' to '2 SOUR' for BIRT DEAT MARR
echo '
';
echo '
', $controller->getPageTitle(), '
';
FunctionsPrint::initializeCalendarPopup();
echo '';
$controller->addInlineJavascript('
SURNAME_TRADITION="' . $WT_TREE->getPreference('SURNAME_TRADITION') . '";
gender="' . $gender . '";
famtag="' . $famtag . '";
function trim(str) {
str=str.replace(/\s\s+/g, " ");
return str.replace(/(^\s+)|(\s+$)/g, "");
}
function lang_class(str) {
if (str.match(/[\u0370-\u03FF]/)) return "greek";
if (str.match(/[\u0400-\u04FF]/)) return "cyrillic";
if (str.match(/[\u0590-\u05FF]/)) return "hebrew";
if (str.match(/[\u0600-\u06FF]/)) return "arabic";
return "latin"; // No matched text implies latin :-)
}
// Generate a full name from the name components
function generate_name() {
var npfx = jQuery("#NPFX").val();
var givn = jQuery("#GIVN").val();
var spfx = jQuery("#SPFX").val();
var surn = jQuery("#SURN").val();
var nsfx = jQuery("#NSFX").val();
if (SURNAME_TRADITION === "polish" && (gender === "F" || famtag === "WIFE")) {
surn = surn.replace(/ski$/, "ska");
surn = surn.replace(/cki$/, "cka");
surn = surn.replace(/dzki$/, "dzka");
surn = surn.replace(/żki$/, "żka");
}
// Commas are used in the GIVN and SURN field to separate lists of surnames.
// For example, to differentiate the two Spanish surnames from an English
// double-barred name.
// Commas *may* be used in other fields, and will form part of the NAME.
if (WT_LOCALE === "vi" || WT_LOCALE === "hu") {
// Default format: /SURN/ GIVN
return trim(npfx+" /"+trim(spfx+" "+surn).replace(/ *, */g, " ")+"/ "+givn.replace(/ *, */g, " ")+" "+nsfx);
} else if (WT_LOCALE === "zh-Hans" || WT_LOCALE === "zh-Hant") {
// Default format: /SURN/GIVN
return npfx+"/"+spfx+surn+"/"+givn+nsfx;
} else {
// Default format: GIVN /SURN/
return trim(npfx+" "+givn.replace(/ *, */g, " ")+" /"+trim(spfx+" "+surn).replace(/ *, */g, " ")+"/ "+nsfx);
}
}
// Update the NAME and _MARNM fields from the name components
// and also display the value in read-only "gedcom" format.
function updatewholename() {
// Don’t update the name if the user manually changed it
if (manualChange) {
return;
}
var npfx = jQuery("#NPFX").val();
var givn = jQuery("#GIVN").val();
var spfx = jQuery("#SPFX").val();
var surn = jQuery("#SURN").val();
var nsfx = jQuery("#NSFX").val();
var name = generate_name();
jQuery("#NAME").val(name);
jQuery("#NAME_display").text(name);
// Married names inherit some NSFX values, but not these
nsfx = nsfx.replace(/^(I|II|III|IV|V|VI|Junior|Jr\.?|Senior|Sr\.?)$/i, "");
// Update _MARNM field from _MARNM_SURN field and display it
// Be careful of mixing latin/hebrew/etc. character sets.
var ip = document.getElementsByTagName("input");
var marnm_id = "";
var romn = "";
var heb = "";
for (var i = 0; i < ip.length; i++) {
var val = trim(ip[i].value);
if (ip[i].id.indexOf("_HEB") === 0)
heb = val;
if (ip[i].id.indexOf("ROMN") === 0)
romn = val;
if (ip[i].id.indexOf("_MARNM") === 0) {
if (ip[i].id.indexOf("_MARNM_SURN") === 0) {
var msurn = "";
if (val !== "") {
var lc = lang_class(document.getElementById(ip[i].id).value);
if (lang_class(name) === lc)
msurn = trim(npfx + " " + givn + " /" + val + "/ " + nsfx);
else if (lc === "hebrew")
msurn = heb.replace(/\/.*\//, "/" + val + "/");
else if (lang_class(romn) === lc)
msurn = romn.replace(/\/.*\//, "/" + val + "/");
}
document.getElementById(marnm_id).value = msurn;
document.getElementById(marnm_id+"_display").innerHTML = msurn;
} else {
marnm_id = ip[i].id;
}
}
}
}
// Toggle the name editor fields between
//
//
var oldName = "";
// Calls to generate_name() trigger an update - hence need to
// set the manual change to true first. We are probably
// listening to the wrong events on the input fields...
var manualChange = true;
manualChange = generate_name() !== jQuery("#NAME").val();
function convertHidden(eid) {
var input1 = jQuery("#" + eid);
var input2 = jQuery("#" + eid + "_display");
// Note that IE does not allow us to change the type of an input, so we must create a new one.
if (input1.attr("type")=="hidden") {
input1.replaceWith(input1.clone().attr("type", "text"));
input2.hide();
} else {
input1.replaceWith(input1.clone().attr("type", "hidden"));
input2.show();
}
}
/**
* if the user manually changed the NAME field, then update the textual
* HTML representation of it
* If the value changed set manualChange to true so that changing
* the other fields doesn’t change the NAME line
*/
function updateTextName(eid) {
var element = document.getElementById(eid);
if (element) {
if (element.value!=oldName) manualChange = true;
var delement = document.getElementById(eid+"_display");
if (delement) {
delement.innerHTML = element.value;
}
}
}
function checkform() {
var ip=document.getElementsByTagName("input");
for (var i=0; i';
}
/**
* Can we edit a GedcomRecord object
*
* @param GedcomRecord $object
*/
function check_record_access(GedcomRecord $object = null) {
global $controller;
if (!$object || !$object->canShow() || !$object->canEdit()) {
$controller
->pageHeader()
->addInlineJavascript('closePopupAndReloadParent();');
exit;
}
}