restrictAccess(Auth::isEditor()) ->addExternalJavascript(WT_STATIC_URL . 'js/autocomplete.js') ->addInlineJavascript('autocomplete();') ->addInlineJavascript(' var locale_date_format="' . preg_replace('/[^DMY]/', '', str_replace(array('J', 'F'), array('D', 'M'), strtoupper($DATE_FORMAT))). '"; '); switch ($action) { //////////////////////////////////////////////////////////////////////////////// case 'editraw': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $record = WT_GedcomRecord::getInstance($xref); check_record_access($record); $controller ->setPageTitle($record->getFullName() . ' - ' . WT_I18N::translate('Edit raw GEDCOM')) ->pageHeader() ->addInlineJavascript('jQuery("#raw-gedcom-list").sortable({opacity: 0.7, cursor: "move", axis: "y"});'); ?>

getPageTitle(); ?>

     getXref() . '@ ' . $record::RECORD_TYPE; ?>

setPageTitle($record->getFullName() . ' - ' . WT_I18N::translate('Edit raw GEDCOM')) ->pageHeader(); $gedcom = '0 @' . $record->getXref() . '@ ' . $record::RECORD_TYPE; // Retain any private facts foreach ($record->getFacts(null, false, WT_PRIV_HIDE) as $fact) { if (!in_array($fact->getFactId(), $fact_ids)) { $gedcom .= "\n" . $fact->getGedcom(); } } // Append the new facts foreach ($facts as $fact) { $gedcom .= "\n" . $fact; } // Cleanup the client’s bad editing? $gedcom = preg_replace('/[\r\n]+/', "\n", $gedcom); // Empty lines $gedcom = trim($gedcom); // Leading/trailing spaces $record->updateRecord($gedcom, false); $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// case 'editrawfact': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $fact_id = WT_Filter::get('fact_id'); $record = WT_GedcomRecord::getInstance($xref); check_record_access($record); // Find the fact to edit $edit_fact = null; foreach ($record->getFacts() as $fact) { if ($fact->getFactId() == $fact_id && $fact->canEdit()) { $edit_fact = $fact; break; } } if (!$edit_fact) { $controller ->pageHeader() ->addInlineJavascript('closePopupAndReloadParent();'); exit; } $controller ->setPageTitle($record->getFullName() . ' - ' . WT_I18N::translate('Edit raw GEDCOM')) ->pageHeader(); ?>

getPageTitle(); ?>

getFacts() as $fact) { if ($fact->getFactId() == $fact_id && $fact->canEdit()) { $edit_fact = $fact; break; } } if (!$edit_fact) { $controller ->pageHeader() ->addInlineJavascript('closePopupAndReloadParent();'); exit; } $controller ->setPageTitle($record->getFullName() . ' - ' . WT_I18N::translate('Edit raw GEDCOM')) ->pageHeader(); // Cleanup the client’s bad editing? $gedcom = preg_replace('/[\r\n]+/', "\n", $gedcom); // Empty lines $gedcom = trim($gedcom); // Leading/trailing spaces $record->updateFact($fact_id, $gedcom, !$keep_chan); $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// case 'edit': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $fact_id = WT_Filter::get('fact_id'); $record = WT_GedcomRecord::getInstance($xref); check_record_access($record); // Find the fact to edit $edit_fact = null; foreach ($record->getFacts() as $fact) { if ($fact->getFactId() == $fact_id && $fact->canEdit()) { $edit_fact = $fact; break; } } if (!$edit_fact) { $controller ->pageHeader() ->addInlineJavascript('closePopupAndReloadParent();'); exit; } $controller ->setPageTitle($record->getFullName() . ' - ' . WT_I18N::translate('Edit')) ->pageHeader(); echo '
'; echo '

', $controller->getPageTitle(), '

'; init_calendar_popup(); echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo WT_Filter::getCsrf(); echo ''; create_edit_form($record, $edit_fact); echo keep_chan($record); echo '
'; $level1type = $edit_fact->getTag(); switch ($record::RECORD_TYPE) { case 'OBJE': case 'NOTE': // OBJE and NOTE facts are all special, and none can take lower-level links break; case 'SOUR': case 'REPO': // SOUR and REPO facts may only take a NOTE if ($level1type!='NOTE') { print_add_layer('NOTE'); } break; case 'FAM': case 'INDI': // FAM and INDI records have real facts. They can take NOTE/SOUR/OBJE/etc. if ($level1type!='SEX') { if ($level1type!='SOUR' && $level1type!='REPO') { print_add_layer('SOUR'); } if ($level1type!='OBJE' && $level1type!='REPO') { print_add_layer('OBJE'); } if ($level1type!='NOTE') { print_add_layer('NOTE'); } // Shared Note addition ------------ if ($level1type!='SHARED_NOTE' && $level1type!='NOTE') { print_add_layer('SHARED_NOTE'); } if ($level1type!='ASSO' && $level1type!='REPO' && $level1type!='NOTE') { print_add_layer('ASSO'); } // allow to add godfather and godmother for CHR fact or best man and bridesmaid for MARR fact in one window if ($level1type=='CHR' || $level1type=='MARR') { print_add_layer('ASSO2'); } // RESN can be added to all level 1 tags print_add_layer('RESN'); } break; } if (Auth::isAdmin() || $SHOW_GEDCOM_RECORD) { echo '

', WT_I18N::translate('Edit raw GEDCOM'), ''; } ?>

setPageTitle($record->getFullName() . ' - ' . WT_Gedcom_Tag::getLabel($fact, $record)) ->pageHeader(); $level0type = $record::RECORD_TYPE; echo '
'; echo '

', $controller->getPageTitle(), '

'; init_calendar_popup(); echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo WT_Filter::getCsrf(); echo ''; create_add_form($fact); echo keep_chan($record); echo '
'; // Genealogical facts (e.g. for INDI and FAM records) can have 2 SOUR/NOTE/OBJE/ASSO/RESN ... if ($level0type=='INDI' || $level0type=='FAM') { // ... but not facts which are simply links to other records if ($fact!='OBJE' && $fact!='SHARED_NOTE' && $fact!='OBJE' && $fact!='REPO' && $fact!='SOUR' && $fact!='ASSO') { print_add_layer('SOUR'); print_add_layer('OBJE'); // Don’t add notes to notes! if ($fact!='NOTE') { print_add_layer('NOTE'); print_add_layer('SHARED_NOTE'); } print_add_layer('ASSO'); // allow to add godfather and godmother for CHR fact or best man and bridesmaid for MARR fact in one window if ($fact=='CHR' || $fact=='MARR') { print_add_layer('ASSO2'); } print_add_layer('RESN'); } } ?>

setPageTitle(WT_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; $nupdateFact($fact_id, $newged, !$keep_chan); // For the GEDFact_assistant module $pid_array = WT_Filter::post('pid_array'); if ($pid_array) { foreach (explode(', ', $pid_array) as $pid) { if ($pid != $xref) { $indi = WT_Individual::getInstance($pid); if ($indi && $indi->canEdit()) { $indi->updateFact($fact_id, $newged, !$keep_chan); } } } } $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// // Add a new child to an existing family //////////////////////////////////////////////////////////////////////////////// case 'add_child_to_family': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $gender = WT_Filter::get('gender', '[MFU]', 'U'); $family = WT_Family::getInstance($xref); check_record_access($family); $controller ->setPageTitle($family->getFullName() . ' - ' . WT_I18N::translate('Add a new child')) ->pageHeader(); print_indi_form('add_child_to_family_action', null, $family, null, 'CHIL', $gender); break; case 'add_child_to_family_action': $xref = WT_Filter::post('xref', WT_REGEX_XREF); $PEDI = WT_Filter::post('PEDI'); $keep_chan = WT_Filter::postBool('keep_chan'); $glevels = WT_Filter::postArray('glevels', '[0-9]'); $tag = WT_Filter::postArray('tag', WT_REGEX_TAG); $text = WT_Filter::postArray('text'); $islink = WT_Filter::postArray('islink', '[01]'); if (!WT_Filter::checkCsrf()) { $gender = WT_Filter::get('gender', '[MFU]', 'U'); Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=add_child_to_family&xref=' . $xref . '&gender=' . $gender); exit; } $family = WT_Family::getInstance($xref); check_record_access($family); $controller->pageHeader(); splitSOUR(); $gedrec ="0 @REF@ INDI"; $gedrec.=addNewName(); $gedrec.=addNewSex (); if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { $gedrec.=addNewFact($match); } } $gedrec .= "\n".WT_Gedcom_Code_Pedi::createNewFamcPedi($PEDI, $xref); if (WT_Filter::postBool('SOUR_INDI')) { $gedrec = handle_updates($gedrec); } else { $gedrec = updateRest($gedrec); } // Create the new child $new_child = WT_GedcomRecord::createRecord($gedrec, WT_GED_ID); // Insert new child at the right place $done = false; foreach ($family->getFacts('CHIL') as $fact) { $old_child = $fact->getTarget(); if ($old_child && WT_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 (WT_Filter::post('goto')=='new') { $controller->addInlineJavascript('closePopupAndReloadParent("' . $new_child->getRawUrl() . '");'); } else { $controller->addInlineJavascript('closePopupAndReloadParent();'); } break; //////////////////////////////////////////////////////////////////////////////// // Add a new child to an existing individual (creating a one-parent family) //////////////////////////////////////////////////////////////////////////////// case 'add_child_to_individual': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $person = WT_Individual::getInstance($xref); check_record_access($person); $controller ->setPageTitle($person->getFullName() . ' - ' . WT_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 = WT_Filter::post('xref', WT_REGEX_XREF); $PEDI = WT_Filter::post('PEDI'); $glevels = WT_Filter::postArray('glevels', '[0-9]'); $tag = WT_Filter::postArray('tag', WT_REGEX_TAG); $text = WT_Filter::postArray('text'); $islink = WT_Filter::postArray('islink', '[01]'); if (!WT_Filter::checkCsrf()) { Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=add_child_to_individual&xref=' . $xref); exit; } $person = WT_Individual::getInstance($xref); 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 = WT_GedcomRecord::createRecord($gedcom, WT_GED_ID); // Link the parent to the family $person->createFact('1 FAMS @' . $family->getXref() . '@', true); // Create a child splitSOUR(); // separate SOUR record from the rest $gedcom = '0 @NEW@ INDI'; $gedcom .= addNewName(); $gedcom .= addNewSex (); $gedcom .= "\n".WT_Gedcom_Code_Pedi::createNewFamcPedi($PEDI, $family->getXref()); if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { $gedcom.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_INDI')) { $gedcom=handle_updates($gedcom); } else { $gedcom=updateRest($gedcom); } $child = WT_GedcomRecord::createRecord($gedcom, WT_GED_ID); // Link the family to the child $family->createFact('1 CHIL @' . $child->getXref() . '@', true); if (WT_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 = WT_Filter::get('xref', WT_REGEX_XREF); $gender = WT_Filter::get('gender', '[MF]', 'U'); $individual = WT_Individual::getInstance($xref); check_record_access($individual); if ($gender=='F') { $controller->setPageTitle(WT_I18N::translate('Add a new mother')); $famtag = 'WIFE'; } else { $controller->setPageTitle(WT_I18N::translate('Add a new 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 = WT_Filter::post('xref', WT_REGEX_XREF); $PEDI = WT_Filter::post('PEDI'); $glevels = WT_Filter::postArray('glevels', '[0-9]'); $tag = WT_Filter::postArray('tag', WT_REGEX_TAG); $text = WT_Filter::postArray('text'); $islink = WT_Filter::postArray('islink', '[01]'); if (!WT_Filter::checkCsrf()) { $gender = WT_Filter::get('gender', '[MFU]', 'U'); Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=add_parent_to_individual&xref=' . $xref . '&gender=' . $gender); exit; } $person = WT_Individual::getInstance($xref); check_record_access($person); $controller->pageHeader(); // Create a new family $gedcom = "0 @NEW@ FAM\n1 CHIL @" . $person->getXref() . "@"; $family = WT_GedcomRecord::createRecord($gedcom, WT_GED_ID); // Link the child to the family $person->createFact('1 FAMC @' . $family->getXref() . '@', true); // Create a child splitSOUR(); // separate SOUR record from the rest $gedcom = '0 @NEW@ INDI'; $gedcom .= addNewName(); $gedcom .= addNewSex (); if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { $gedcom.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_INDI')) { $gedcom=handle_updates($gedcom); } else { $gedcom=updateRest($gedcom); } $gedcom .= "\n1 FAMS @" . $family->getXref() . "@"; $parent = WT_GedcomRecord::createRecord($gedcom, WT_GED_ID); // 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 (WT_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()) ->setPageTitle(WT_I18N::translate('Create a new individual')) ->pageHeader(); print_indi_form('add_unlinked_indi_action', null, null, null, null, null); break; case 'add_unlinked_indi_action': $glevels = WT_Filter::postArray('glevels', '[0-9]'); $tag = WT_Filter::postArray('tag', WT_REGEX_TAG); $text = WT_Filter::postArray('text'); $islink = WT_Filter::postArray('islink', '[01]'); if (!WT_Filter::checkCsrf()) { Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=add_unlinked_indi'); exit; } $controller ->restrictAccess(Auth::isManager()) ->pageHeader(); splitSOUR(); $gedrec ="0 @REF@ INDI"; $gedrec.=addNewName(); $gedrec.=addNewSex (); if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { $gedrec.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_INDI')) { $gedrec = handle_updates($gedrec); } else { $gedrec = updateRest($gedrec); } $new_indi = WT_GedcomRecord::createRecord($gedrec, WT_GED_ID); if (WT_Filter::post('goto')=='new') { $controller->addInlineJavascript('closePopupAndReloadParent("' . $new_indi->getRawUrl() . '");'); } else { $controller->addInlineJavascript('closePopupAndReloadParent();'); } break; //////////////////////////////////////////////////////////////////////////////// // Add a new spouse to an existing individual (creating a new family) //////////////////////////////////////////////////////////////////////////////// case 'add_spouse_to_individual': $famtag = WT_Filter::get('famtag', 'HUSB|WIFE'); $xref = WT_Filter::get('xref', WT_REGEX_XREF); $individual = WT_Individual::getInstance($xref); check_record_access($individual); if ($famtag=='WIFE') { $controller->setPageTitle(WT_I18N::translate('Add a new wife')); $sex = 'F'; } else { $controller->setPageTitle(WT_I18N::translate('Add a new 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 = WT_Filter::post('xref'); // Add a spouse to this individual $sex = WT_Filter::post('SEX', '[MFU]', 'U'); $glevels = WT_Filter::postArray('glevels', '[0-9]'); $tag = WT_Filter::postArray('tag', WT_REGEX_TAG); $text = WT_Filter::postArray('text'); $islink = WT_Filter::postArray('islink', '[01]'); if (!WT_Filter::checkCsrf()) { $famtag = WT_Filter::get('famtag', 'HUSB|WIFE'); Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=add_spouse_to_individual&xref=' . $xref . '&famtag=' . $famtag); exit; } $person = WT_Individual::getInstance($xref); check_record_access($person); $controller ->setPageTitle(WT_I18N::translate('Add a new spouse')) ->pageHeader(); splitSOUR(); $indi_gedcom = '0 @REF@ INDI'; $indi_gedcom.= addNewName(); $indi_gedcom.= addNewSex (); if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { $indi_gedcom.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_INDI')) { $indi_gedcom = handle_updates($indi_gedcom); } else { $indi_gedcom = updateRest($indi_gedcom); } $fam_gedcom = ''; if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FAMFACTS, $matches)) { foreach ($matches[1] as $match) { $fam_gedcom.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_FAM')) { $fam_gedcom = handle_updates($fam_gedcom); } else { $fam_gedcom = updateRest($fam_gedcom); } // Create the new spouse $spouse = WT_GedcomRecord::createRecord($indi_gedcom, WT_GED_ID); // Create a new family if ($sex == 'F') { $family = WT_GedcomRecord::createRecord("0 @NEW@ FAM\n1 WIFE @" . $spouse->getXref() . "@\n1 HUSB @" . $person->getXref() . "@" . $fam_gedcom, WT_GED_ID); } else { $family = WT_GedcomRecord::createRecord("0 @NEW@ FAM\n1 HUSB @" . $spouse->getXref() . "@\n1 WIFE @" . $person->getXref() . "@" . $fam_gedcom, WT_GED_ID); } // Link the spouses to the family $spouse->createFact('1 FAMS @' . $family->getXref() . '@', true); $person->createFact('1 FAMS @' . $family->getXref() . '@', true); if (WT_Filter::post('goto')=='new') { $controller->addInlineJavascript('closePopupAndReloadParent("' . $spouse->getRawUrl() . '");'); } else { $controller->addInlineJavascript('closePopupAndReloadParent();'); } break; //////////////////////////////////////////////////////////////////////////////// // Add a new spouse to an existing family //////////////////////////////////////////////////////////////////////////////// case 'add_spouse_to_family': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $famtag = WT_Filter::get('famtag', 'HUSB|WIFE'); $family = WT_Family::getInstance($xref); check_record_access($family); if ($famtag=='WIFE') { $controller->setPageTitle(WT_I18N::translate('Add a new wife')); $sex = 'F'; } else { $controller->setPageTitle(WT_I18N::translate('Add a new 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 = WT_Filter::post('xref', WT_REGEX_XREF); $glevels = WT_Filter::postArray('glevels', '[0-9]'); $tag = WT_Filter::postArray('tag', WT_REGEX_TAG); $text = WT_Filter::postArray('text'); $islink = WT_Filter::postArray('islink', '[01]'); $family = WT_Family::getInstance($xref); check_record_access($family); if (!WT_Filter::checkCsrf()) { $famtag = WT_Filter::get('famtag', 'HUSB|WIFE'); Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=add_spouse_to_family&xref=' . $xref . '&famtag=' . $famtag); exit; } $controller->pageHeader(); // Create the new spouse splitSOUR(); // separate SOUR record from the rest $gedrec ="0 @REF@ INDI"; $gedrec.=addNewName(); $gedrec.=addNewSex (); if (preg_match_all('/([A-Z0-9_]+)/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { $gedrec.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_INDI')) { $gedrec = handle_updates($gedrec); } else { $gedrec = updateRest($gedrec); } $gedrec .= "\n1 FAMS @" . $family->getXref() . "@"; $spouse = WT_GedcomRecord::createRecord($gedrec, WT_GED_ID); // 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_]+)/', $QUICK_REQUIRED_FAMFACTS, $matches)) { foreach ($matches[1] as $match) { $famrec.=addNewFact($match); } } if (WT_Filter::postBool('SOUR_FAM')) { $famrec = handle_updates($famrec); } else { $famrec = updateRest($famrec); } $family->createFact(trim($famrec), true); // trim leading \n if (WT_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 = WT_Filter::get('xref', WT_REGEX_XREF); $person = WT_Individual::getInstance($xref); check_record_access($person); $controller ->setPageTitle($person->getFullName() . ' - ' . WT_I18N::translate('Link this individual to an existing family as a child')) ->pageHeader(); ?>

getPageTitle(); ?>

setPageTitle($person->getFullName() . ' - ' . WT_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 = WT_Gedcom_Code_Pedi::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 = WT_Filter::get('famtag', 'HUSB|WIFE'); $xref = WT_Filter::get('xref', WT_REGEX_XREF); $person = WT_Individual::getInstance($xref); check_record_access($person); if ($person->getSex()=='F') { $controller->setPageTitle($person->getFullName() . ' - ' . WT_I18N::translate('Add a husband using an existing individual')); $label = WT_I18N::translate('Husband'); } else { $controller->setPageTitle($person->getFullName() . ' - ' . WT_I18N::translate('Add a wife using an existing individual')); $label = WT_I18N::translate('Wife'); } $controller->pageHeader(); init_calendar_popup(); ?>

getPageTitle(); ?>

getSex()=='F') { $controller->setPageTitle($person->getFullName() . ' - ' . WT_I18N::translate('Add a husband using an existing individual')); } else { $controller->setPageTitle($person->getFullName() . ' - ' . WT_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() . "@"; } splitSOUR(); $gedcom .= addNewFact('MARR'); if (WT_Filter::postBool('SOUR_FAM') || count($tagSOUR)>0) { // before adding 2 SOUR it needs to add 1 MARR Y first if (addNewFact('MARR') == '') { $gedcom .= "\n1 MARR Y"; } $gedcom = handle_updates($gedcom); } else { // before adding level 2 facts it needs to add 1 MARR Y first if (addNewFact('MARR')=='') { $gedcom .= "\n1 MARR Y"; } $gedcom = updateRest($gedcom); } $family = WT_GedcomRecord::createRecord($gedcom, WT_GED_ID); $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(WT_I18N::translate('Create a new source')) ->pageHeader(); ?>

getPageTitle(); ?>


setPageTitle(WT_I18N::translate('Create a new source')) ->pageHeader(); if (!WT_Filter::checkCsrf()) { Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=addnewsource'); exit; } $newgedrec = "0 @XREF@ SOUR"; $ABBR = WT_Filter::post('ABBR'); if ($ABBR) { $newgedrec .= "\n1 ABBR " . $ABBR; } $TITL = WT_Filter::post('TITL'); if ($TITL) { $newgedrec .= "\n1 TITL " . $TITL; $_HEB = WT_Filter::post('_HEB'); if ($_HEB) { $newgedrec .= "\n2 _HEB " . $_HEB; } $ROMN = WT_Filter::post('ROMN'); if ($ROMN) { $newgedrec .= "\n2 ROMN " . $ROMN; } } $AUTH = WT_Filter::post('AUTH'); if ($AUTH) { $newgedrec .= "\n1 AUTH " . $AUTH; } $PUBL = WT_Filter::post('PUBL'); if ($PUBL) { $newgedrec .= "\n1 PUBL " . preg_replace('/\r?\n/', "\n2 CONT ", $PUBL); } $REPO = WT_Filter::post('REPO', WT_REGEX_XREF); if ($REPO) { $newgedrec .= "\n1 REPO @" . $REPO . "@"; $CALN = WT_Filter::post('CALN'); if ($CALN) { $newgedrec .= "\n1 CALN " . $CALN; } } $EVEN = WT_Filter::postArray('EVEN', WT_REGEX_TAG); if ($EVEN) { $newgedrec .= "\n1 DATA"; $newgedrec .= "\n2 EVEN " . implode(',', $EVEN); $EVEN_DATE = WT_Filter::post('EVEN_DATE'); if ($EVEN_DATE) { $newgedrec .= "\n3 EVEN_DATE " . $EVEN_DATE; } $EVEN_PLAC = WT_Filter::post('EVEN_PLAC'); if ($EVEN_PLAC) { $newgedrec .= "\n3 EVEN_PLAC " . $EVEN_PLAC; } $AGNC = WT_Filter::post('AGNC'); if ($AGNC) { $newgedrec .= "\n2 AGNC " . $AGNC; } } $record = WT_GedcomRecord::createRecord($newgedrec, WT_GED_ID); $controller->addInlineJavascript('openerpasteid("' . $record->getXref() . '");'); break; //////////////////////////////////////////////////////////////////////////////// // Create a new note record //////////////////////////////////////////////////////////////////////////////// case 'addnewnote': $controller ->setPageTitle(WT_I18N::translate('Create a new shared note')) ->pageHeader(); ?>

getPageTitle(); ?>

'; echo ''; echo ''; echo WT_I18N::translate('Shared note'), help_link('SHARED_NOTE'); echo ''; echo ''; echo print_specialchar_link('NOTE'); echo ''; echo ''; echo keep_chan(); echo ''; ?>

setPageTitle(WT_I18N::translate('Create a new shared note')) ->pageHeader(); if (!WT_Filter::checkCsrf()) { Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=addnewnote'); exit; } $gedrec = '0 @XREF@ NOTE ' . preg_replace("/\r?\n/", "\n1 CONT ", WT_Filter::post('NOTE')); $record = WT_GedcomRecord::createRecord($gedrec, WT_GED_ID); $controller->addInlineJavascript('openerpasteid("' . $record->getXref() . '");'); break; //////////////////////////////////////////////////////////////////////////////// case 'addnewnote_assisted': require WT_ROOT.WT_MODULES_DIR.'GEDFact_assistant/CENS_ctrl.php'; break; //////////////////////////////////////////////////////////////////////////////// case 'addnoteaction_assisted': $controller ->setPageTitle(WT_I18N::translate('Create a new shared note using assistant')) ->pageHeader(); if (!WT_Filter::checkCsrf()) { Zend_Session::writeClose(); header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=addnewnote_assisted'); exit; } echo '
'; echo '

', $controller->getPageTitle(), '

'; require WT_ROOT.WT_MODULES_DIR.'GEDFact_assistant/_CENS/addnoteaction_assisted.php'; echo '
'; break; //////////////////////////////////////////////////////////////////////////////// case 'addmedia_links': $pid = WT_Filter::get('pid', WT_REGEX_XREF); $person = WT_Individual::getInstance($pid); check_record_access($person); $controller ->setPageTitle(WT_I18N::translate('Family navigator')) ->pageHeader(); ?>

getPageTitle(); ?>

setPageTitle(WT_I18N::translate('Edit shared note')) ->pageHeader(); ?>

getPageTitle(); ?>


setPageTitle(WT_I18N::translate('Edit shared note')) ->pageHeader(); // We have user-supplied data in a replacement string - escape it against backreferences $note = str_replace(array('\\', '$'), array('\\\\', '\\$'), $note); $gedrec = preg_replace( '/^0 @' . $record->getXref() . '@ NOTE.*(\n1 CONT.*)*/', '0 @' . $record->getXref() . '@ NOTE ' . preg_replace("/\r?\n/", "\n1 CONT ", $note), $record->getGedcom() ); $record->updateRecord($gedrec, !$keep_chan); $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// // Create a new repository //////////////////////////////////////////////////////////////////////////////// case 'addnewrepository': $controller ->setPageTitle(WT_I18N::translate('Create a new repository')) ->pageHeader(); echo '
'; echo '

', $controller->getPageTitle(), '

'; echo ''; ?>

setPageTitle(WT_I18N::translate('Create a new repository')) ->pageHeader(); $gedrec = "0 @XREF@ REPO"; $REPO_NAME = WT_Filter::post('REPO_NAME'); if ($REPO_NAME) { $gedrec .= "\n1 NAME " . $REPO_NAME; $_HEB = WT_Filter::post('_HEB'); if ($_HEB) { $gedrec .= "\n2 _HEB " . $_HEB; } $ROMN = WT_Filter::post('ROMN'); if ($ROMN) { $gedrec .= "\n2 ROMN " . $ROMN; } } $ADDR = WT_Filter::post('ADDR'); if ($ADDR) { $gedrec .= "\n1 ADDR " . preg_replace('/\r?\n/', "\n2 CONT ", $ADDR); } $PHON = WT_Filter::post('PHON'); if ($PHON) { $gedrec .= "\n1 PHON " . $PHON; } $FAX = WT_Filter::post('FAX'); if ($FAX) { $gedrec .= "\n1 FAX " . $FAX; } $EMAIL = WT_Filter::post('EMAIL'); if ($EMAIL) { $gedrec .= "\n1 EMAIL " . $EMAIL; } $WWW = WT_Filter::post('WWW'); if ($WWW) { $gedrec .= "\n1 WWW " . $WWW; } $record = WT_GedcomRecord::createRecord($gedrec, WT_GED_ID); $controller->addInlineJavascript('openerpasteid("' . $record->getXref() . '");'); break; //////////////////////////////////////////////////////////////////////////////// case 'editname': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $fact_id = WT_Filter::get('fact_id'); $person = WT_Individual::getInstance($xref); check_record_access($person); // Find the fact to edit $name_fact = null; foreach ($person->getFacts() as $fact) { if ($fact->getFactId() == $fact_id && $fact->canEdit()) { $name_fact = $fact; } } if (!$name_fact) { $controller ->pageHeader() ->addInlineJavascript('closePopupAndReloadParent();'); exit; } $controller ->setPageTitle(WT_I18N::translate('Edit name')) ->pageHeader(); print_indi_form('update', $person, null, $name_fact, '', $person->getSex()); break; //////////////////////////////////////////////////////////////////////////////// case 'addname': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $person = WT_Individual::getInstance($xref); check_record_access($person); $controller ->setPageTitle(WT_I18N::translate('Add a new name')) ->pageHeader(); print_indi_form('update', $person, null, null, '', $person->getSex()); break; //////////////////////////////////////////////////////////////////////////////// // Change the order of media objects //////////////////////////////////////////////////////////////////////////////// case 'reorder_media': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $person = WT_Individual::getInstance($xref); check_record_access($person); $controller ->setPageTitle(WT_I18N::translate('Re-order media')) ->pageHeader() ->addInlineJavascript(' jQuery("#reorder_media_list").sortable({forceHelperSize: true, forcePlaceholderSize: true, opacity: 0.7, cursor: "move", axis: "y"}); //-- update the order numbers after drag-n-drop sorting is complete jQuery("#reorder_media_list").bind("sortupdate", function(event, ui) { jQuery("#"+jQuery(this).attr("id")+" input").each( function (index, value) { value.value = index+1; } ); }); '); // Get the current sort order $sort_obje = array(); foreach ($person->getFacts('_WT_OBJE_SORT') as $fact) { $media = $fact->getTarget(); if ($media && $media->canShow()) { $sort_obje[] = $media; } } // Add other media objects from the individual and any spouse-families $record_list = array($person); foreach ($person->getSpouseFamilies() as $family) { $record_list[] = $family; } foreach ($record_list as $record) { if ($record->canShow()) { foreach ($record->getFacts() as $fact) { if (!$fact->isOld()) { preg_match_all('/(?:^1|\n\d) OBJE @(' . WT_REGEX_XREF . ')@/', $fact->getGedcom(), $matches); foreach ($matches[1] as $match) { $media = WT_Media::getInstance($match); if (!in_array($media, $sort_obje)) { $sort_obje[] = $media; } } } } } } ?>

    $obje) { ?>
  • displayImage(); ?> getFullName(); ?>

setPageTitle(WT_I18N::translate('Re-order media')) ->pageHeader(); // Delete any existing _WT_OBJE_SORT records $facts = array('0 @' . $person->getXref() . '@ INDI'); foreach ($person->getFacts() as $fact) { if ($fact->getTag() != '_WT_OBJE_SORT') { $facts[] = $fact->getGedcom(); } } if (is_array($order1)) { // Add new _WT_OBJE_SORT records foreach ($order1 as $xref=>$n) { $facts[] = '1 _WT_OBJE_SORT @' . $xref . '@'; } } $person->updateRecord(implode("\n", $facts), !$keep_chan); $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// // Change the order of children within a family record //////////////////////////////////////////////////////////////////////////////// case 'reorder_children': $xref = WT_Filter::post('xref', WT_REGEX_XREF, WT_Filter::get('xref', WT_REGEX_XREF)); $option = WT_Filter::post('option'); $family = WT_Family::getInstance($xref); check_record_access($family); $controller ->addInlineJavascript('jQuery("#reorder_list").sortable({forceHelperSize: true, forcePlaceholderSize: true, opacity: 0.7, cursor: "move", axis: "y"});') ->addInlineJavascript('jQuery("#reorder_list").bind("sortupdate", function(event, ui) { jQuery("#"+jQuery(this).attr("id")+" input").each( function (index, value) { value.value = index+1; }); });') ->setPageTitle(WT_I18N::translate('Re-order children')) ->pageHeader(); ?>

getPageTitle(); ?>

    getChildren() as $child) { $ids[]=$child->getXref(); } $children = array(); foreach ($family->getChildren() as $k=>$child) { $bdate = $child->getEstimatedBirthDate(); if ($bdate->isOK()) { $sortkey = $bdate->JD(); } else { $sortkey = 1e8; // birth date missing => sort last } $children[$child->getXref()] = $sortkey; } if ($option=='bybirth') { asort($children); } $i=0; $show_full = 1; // Force details to show for each child foreach ($children as $id=>$child) { echo '
  • '; print_pedigree_person(WT_Individual::getInstance($id), 2); echo ''; echo '
  • '; $i++; } echo '
'; ?>

setPageTitle(WT_I18N::translate('Re-order children')) ->pageHeader(); if (is_array($order)) { $gedcom = array('0 @' . $family->getXref() . '@ FAM'); $facts = $family->getFacts(); // Move children to the end of the record foreach ($order as $child=>$num) { foreach ($facts as $n=>$fact) { if ($fact->getValue() == '@'.$child.'@') { $facts[]=$fact; unset($facts[$n]); break; } } } foreach ($facts as $fact) { $gedcom[] = $fact->getGedcom(); } $family->updateRecord(implode("\n", $gedcom), !$keep_chan); } $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// // Change the members of a family record //////////////////////////////////////////////////////////////////////////////// case 'changefamily': $xref = WT_Filter::get('xref', WT_REGEX_XREF); $family = WT_Family::getInstance($xref); check_record_access($family); $controller ->setPageTitle(WT_I18N::translate('Change family members') . ' – ' . $family->getFullName()) ->pageHeader(); $father = $family->getHusband(); $mother = $family->getWife(); $children = $family->getChildren(); ?>

getPageTitle(); ?>

getSex()) { case 'M': echo WT_I18N::translate('husband'); break; case 'F': echo WT_I18N::translate('wife'); break; default: echo WT_I18N::translate('spouse'); break; } ?> getFullName(); ?>
getSex()) { case 'M': echo WT_I18N::translate('husband'); break; case 'F': echo WT_I18N::translate('wife'); break; default: echo WT_I18N::translate('spouse'); break; } ?> getFullName(); ?>
getSex()) { case 'M': echo WT_I18N::translate('son'); break; case 'F': echo WT_I18N::translate('daughter'); break; default: echo WT_I18N::translate('child'); break; } ?> getFullName(); ?>

//$CHIL = WT_Filter::postArray('CHIL', WT_REGEX_XREF); $CHIL = array(); for ($i=0; ;++$i) { if (isset($_POST['CHIL'.$i])) { $CHIL[] = WT_Filter::post('CHIL'.$i, WT_REGEX_XREF); } else { break; } } $family = WT_Family::getInstance($xref); check_record_access($family); $controller ->setPageTitle(WT_I18N::translate('Change family members') . ' – ' . $family->getFullName()) ->pageHeader(); // Current family members $old_father = $family->getHusband(); $old_mother = $family->getWife(); $old_children = $family->getChildren(); // New family members $new_father = WT_Individual::getInstance($HUSB); $new_mother = WT_Individual::getInstance($WIFE); $new_children = array(); if (is_array($CHIL)) { foreach ($CHIL as $child) { $new_children[] = WT_Individual::getInstance($child); } } if ($old_father !== $new_father) { if ($old_father) { // Remove old FAMS link foreach ($old_father->getFacts('FAMS') as $fact) { if ($fact->getTarget() === $family) { $old_father->deleteFact($fact->getFactId(), !$keep_chan); } } // Remove old HUSB link foreach ($family->getFacts('HUSB|WIFE') as $fact) { if ($fact->getTarget() === $old_father) { $family->deleteFact($fact->getFactId(), !$keep_chan); } } } if ($new_father) { // Add new FAMS link $new_father->createFact('1 FAMS @' . $family->getXref() . '@', !$keep_chan); // Add new HUSB link $family->createFact('1 HUSB @' . $new_father->getXref() . '@', !$keep_chan); } } if ($old_mother !== $new_mother) { if ($old_mother) { // Remove old FAMS link foreach ($old_mother->getFacts('FAMS') as $fact) { if ($fact->getTarget() === $family) { $old_mother->deleteFact($fact->getFactId(), !$keep_chan); } } // Remove old WIFE link foreach ($family->getFacts('HUSB|WIFE') as $fact) { if ($fact->getTarget() === $old_mother) { $family->deleteFact($fact->getFactId(), !$keep_chan); } } } if ($new_mother) { // Add new FAMS link $new_mother->createFact('1 FAMS @' . $family->getXref() . '@', !$keep_chan); // Add new WIFE link $family->createFact('1 WIFE @' . $new_mother->getXref() . '@', !$keep_chan); } } foreach ($old_children as $old_child) { if ($old_child && !in_array($old_child, $new_children)) { // Remove old FAMC link foreach ($old_child->getFacts('FAMC') as $fact) { if ($fact->getTarget() === $family) { $old_child->deleteFact($fact->getFactId(), !$keep_chan); } } // Remove old CHIL link foreach ($family->getFacts('CHIL') as $fact) { if ($fact->getTarget() === $old_child) { $family->deleteFact($fact->getFactId(), !$keep_chan); } } } } foreach ($new_children as $new_child) { if ($new_child && !in_array($new_child, $old_children)) { // Add new FAMC link $new_child->createFact('1 FAMC @' . $family->getXref() . '@', !$keep_chan); // Add new CHIL link $family->createFact('1 CHIL @' . $new_child->getXref() . '@', !$keep_chan); } } $controller->addInlineJavascript('closePopupAndReloadParent();'); break; //////////////////////////////////////////////////////////////////////////////// // Change the order of FAMS records within an INDI record //////////////////////////////////////////////////////////////////////////////// case 'reorder_fams': $xref = WT_Filter::post('xref', WT_REGEX_XREF, WT_Filter::get('xref', WT_REGEX_XREF)); $option = WT_Filter::post('option'); $person = WT_Individual::getInstance($xref); check_record_access($person); $controller ->addInlineJavascript('jQuery("#reorder_list").sortable({forceHelperSize: true, forcePlaceholderSize: true, opacity: 0.7, cursor: "move", axis: "y"});') //-- update the order numbers after drag-n-drop sorting is complete ->addInlineJavascript('jQuery("#reorder_list").bind("sortupdate", function(event, ui) { jQuery("#"+jQuery(this).attr("id")+" input").each( function (index, value) { value.value = index+1; }); });') ->setPageTitle(WT_I18N::translate('Re-order families')) ->pageHeader(); $fams = $person->getSpouseFamilies(); if ($option=='bymarriage') { usort($fams, array('WT_Family', 'compareMarrDate')); } ?>

getPageTitle(); ?>

    $family) { ?>
  • getFullName(); ?>
    format_first_major_fact(WT_EVENTS_MARR, 2); ?>

setPageTitle(WT_I18N::translate('Re-order families')) ->pageHeader(); if (is_array($order)) { $gedcom = array('0 @' . $person->getXref() . '@ INDI'); $facts = $person->getFacts(); // Move families to the end of the record foreach ($order as $family=>$num) { foreach ($facts as $n=>$fact) { if ($fact->getValue() == '@'.$family.'@') { $facts[]=$fact; unset($facts[$n]); break; } } } foreach ($facts as $fact) { $gedcom[] = $fact->getGedcom(); } $person->updateRecord(implode("\n", $gedcom), !$keep_chan); } $controller->addInlineJavascript('closePopupAndReloadParent();'); break; } // Keep the existing CHAN record when editing function keep_chan(WT_GedcomRecord $record=null) { global $NO_UPDATE_CHAN; if (Auth::isAdmin()) { $checked = $NO_UPDATE_CHAN ? ' checked="checked"' : ''; if ($record) { $details = WT_Gedcom_Tag::getLabelValue('DATE', $record->lastChangeTimestamp()) . WT_Gedcom_Tag::getLabelValue('_WT_USER', $record->lastChangeUser()); } else { $details = ''; } return '' . WT_Gedcom_Tag::getLabel('CHAN') . '' . '' . WT_I18N::translate('Do not update the “last change” record') . help_link('no_update_CHAN') . $details . ''; } else { return ''; } } // prints a form to add an individual or edit an individual’s name function print_indi_form($nextaction, WT_Individual $person=null, WT_Family $family=null, WT_Fact $name_fact=null, $famtag='CHIL', $gender='U') { global $WT_TREE, $WORD_WRAPPED_NOTES, $NPFX_accept, $SHOW_GEDCOM_RECORD, $bdm, $STANDARD_NAME_FACTS, $ADVANCED_NAME_FACTS; global $QUICK_REQUIRED_FACTS, $QUICK_REQUIRED_FAMFACTS, $controller; $SURNAME_TRADITION = $WT_TREE->getPreference('SURNAME_TRADITION'); if ($person) { $xref = $person->getXref(); } elseif ($family) { $xref = $family->getXref(); } else { $xref = 'new'; } $name_fields = array(); if ($name_fact) { $name_fact_id = $name_fact->getFactId(); $name_type = $name_fact->getAttribute('TYPE'); $namerec = $name_fact->getGedcom(); // Populate the standard NAME field and subfields foreach ($STANDARD_NAME_FACTS as $tag) { if ($tag=='NAME') { $name_fields[$tag] = $name_fact->getValue(); } else { $name_fields[$tag] = $name_fact->getAttribute($tag); } } } else { $name_fact_id = null; $name_type = null; $namerec = null; // Populate the standard NAME field and subfields foreach ($STANDARD_NAME_FACTS as $tag) { $name_fields[$tag] = ''; } } $bdm = ''; // used to copy '1 SOUR' to '2 SOUR' for BIRT DEAT MARR echo '
'; echo '

', $controller->getPageTitle(), '

'; init_calendar_popup(); echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; // set by javascript echo WT_Filter::getCsrf(); echo ''; switch ($nextaction) { case 'add_child_to_family_action': case 'add_child_to_individual_action': // When adding a new child, specify the pedigree add_simple_tag('0 PEDI'); break; case 'update': // When adding/editing a name, specify the type add_simple_tag('0 TYPE ' . $name_type, '', '', null, $person); break; } $new_marnm=''; // Inherit surname from parents, spouse or child if (!$namerec) { // We’ll need the parent’s name to set the child’s surname 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_name = ''; $mother_name = ''; } // We’ll need the spouse/child’s name to set the spouse/parent’s surname if ($person && $person->getFirstFact('NAME')) { $indi_name = $person->getFirstFact('NAME')->getValue(); } else { $indi_name = ''; } // Different cultures do surnames differently switch ($SURNAME_TRADITION) { case 'spanish': //Mother: Maria /AAAA BBBB/ //Father: Jose /CCCC DDDD/ //Child: Pablo /CCCC AAAA/ switch ($nextaction) { case 'add_child_to_family_action': if (preg_match('/\/(\S+) \S+\//', $mother_name, $matchm) && preg_match('/\/(\S+) \S+\//', $father_name, $matchf)) { $name_fields['SURN']=$matchf[1].' '.$matchm[1]; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } break; case 'add_parent_to_individual_action': if ($famtag=='HUSB' && preg_match('/\/(\S+) \S+\//', $indi_name, $match)) { $name_fields['SURN']=$match[1]; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } if ($famtag=='WIFE' && preg_match('/\/\S+ (\S+)\//', $indi_name, $match)) { $name_fields['SURN']=$match[1]; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } break; case 'add_child_to_individual_action': case 'add_spouse_to_individual_action': case 'add_spouse_to_family_action': break; } break; case 'portuguese': //Mother: Maria /AAAA BBBB/ //Father: Jose /CCCC DDDD/ //Child: Pablo /BBBB DDDD/ switch ($nextaction) { case 'add_child_to_family_action': if (preg_match('/\/\S+\s+(\S+)\//', $mother_name, $matchm) && preg_match('/\/\S+\s+(\S+)\//', $father_name, $matchf)) { $name_fields['SURN']=$matchf[1].' '.$matchm[1]; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } break; case 'add_parent_to_individual_action': if ($famtag=='HUSB' && preg_match('/\/\S+\s+(\S+)\//', $indi_name, $match)) { $name_fields['SURN']=$match[1]; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } if ($famtag=='WIFE' && preg_match('/\/(\S+)\s+\S+\//', $indi_name, $match)) { $name_fields['SURN']=$match[1]; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } break; case 'add_child_to_individual_action': case 'add_spouse_to_individual_action': case 'add_spouse_to_family_action': break; } break; case 'icelandic': // Sons get their father’s given name plus “sson” // Daughters get their father’s given name plus “sdottir” switch ($nextaction) { case 'add_child_to_family_action': if ($gender=='M' && preg_match('/(\S+)\s+\/.*\//', $father_name, $match)) { $name_fields['SURN']=preg_replace('/s$/', '', $match[1]).'sson'; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } if ($gender=='F' && preg_match('/(\S+)\s+\/.*\//', $father_name, $match)) { $name_fields['SURN']=preg_replace('/s$/', '', $match[1]).'sdottir'; $name_fields['NAME']='/'.$name_fields['SURN'].'/'; } break; case 'add_parent_to_individual_action': if ($famtag=='HUSB' && preg_match('/(\S+)sson\s+\/.*\//i', $indi_name, $match)) { $name_fields['GIVN']=$match[1]; $name_fields['NAME']=$name_fields['GIVN'].' //'; } if ($famtag=='WIFE' && preg_match('/(\S+)sdottir\s+\/.*\//i', $indi_name, $match)) { $name_fields['GIVN']=$match[1]; $name_fields['NAME']=$name_fields['GIVN'].' //'; } break; case 'add_child_to_individual_action': case 'add_spouse_to_individual_action': case 'add_spouse_to_family_action': break; } break; case 'patrilineal': // Father gives his surname to his children switch ($nextaction) { case 'add_child_to_family_action': if (preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $father_name, $match)) { $name_fields['SURN']=$match[2]; $name_fields['SPFX']=trim($match[1]); $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } break; case 'add_parent_to_individual_action': if ($famtag=='HUSB' && preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $indi_name, $match)) { $name_fields['SURN']=$match[2]; $name_fields['SPFX']=trim($match[1]); $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } break; case 'add_child_to_individual_action': case 'add_spouse_to_individual_action': case 'add_spouse_to_family_action': break; } break; case 'matrilineal': // Mother gives her surname to her children switch ($nextaction) { case 'add_child_to_family_action': if (preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $mother, $match)) { $name_fields['SURN']=$match[2]; $name_fields['SPFX']=trim($match[1]); $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } break; case 'add_parent_to_individual_action': if ($famtag=='WIFE' && preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $indi_name, $match)) { $name_fields['SURN']=$match[2]; $name_fields['SPFX']=trim($match[1]); $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } break; case 'add_child_to_individual_action': case 'add_spouse_to_individual_action': case 'add_spouse_to_family_action': break; } break; case 'paternal': case 'polish': case 'lithuanian': // Father gives his surname to his wife and children switch ($nextaction) { case 'add_spouse_to_individual_action': if ($famtag=='WIFE' && preg_match('/\/(.*)\//', $indi_name, $match)) { if ($SURNAME_TRADITION=='polish') { $match[1]=preg_replace(array('/ski$/', '/cki$/', '/dzki$/', '/żki$/'), array('ska', 'cka', 'dzka', 'żka'), $match[1]); } elseif ($SURNAME_TRADITION=='lithuanian') { $match[1]=preg_replace(array('/as$/', '/is$/', '/ys$/', '/us$/'), array('ienė', 'ienė', 'ienė', 'ienė'), $match[1]); } $new_marnm=$match[1]; } break; case 'add_child_to_family_action': if (preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $father_name, $match)) { $name_fields['SURN']=$match[2]; if ($SURNAME_TRADITION=='polish' && $gender=='F') { $match[2]=preg_replace(array('/ski$/', '/cki$/', '/dzki$/', '/żki$/'), array('ska', 'cka', 'dzka', 'żka'), $match[2]); } elseif ($SURNAME_TRADITION=='lithuanian' && $gender=='F') { $match[2]=preg_replace(array('/as$/', '/a$/', '/is$/', '/ys$/', '/ius$/', '/us$/'), array('aitė', 'aitė', 'ytė', 'ytė', 'iūtė', 'utė'), $match[2]); } $name_fields['SPFX']=trim($match[1]); $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } break; case 'add_child_to_individual_action': if ($person->getSex()=='M' && preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $indi_name, $match)) { $name_fields['SURN']=$match[2]; if ($SURNAME_TRADITION=='polish' && $gender=='F') { $match[2]=preg_replace(array('/ski$/', '/cki$/', '/dzki$/', '/żki$/'), array('ska', 'cka', 'dzka', 'żka'), $match[2]); } elseif ($SURNAME_TRADITION=='lithuanian' && $gender=='F') { $match[2]=preg_replace(array('/as$/', '/a$/', '/is$/', '/ys$/', '/ius$/', '/us$/'), array('aitė', 'aitė', 'ytė', 'ytė', 'iūtė', 'utė'), $match[2]); } $name_fields['SPFX']=trim($match[1]); $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } break; case 'add_parent_to_individual_action': if ($famtag=='HUSB' && preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $indi_name, $match)) { if ($SURNAME_TRADITION=='polish' && $gender=='M') { $match[2]=preg_replace(array('/ska$/', '/cka$/', '/dzka$/', '/żka$/'), array('ski', 'cki', 'dzki', 'żki'), $match[2]); } elseif ($SURNAME_TRADITION=='lithuanian') { // not a complete list as the rules are somewhat complicated but will do 95% correctly $match[2]=preg_replace(array('/aitė$/', '/ytė$/', '/iūtė$/', '/utė$/'), array('as', 'is', 'ius', 'us'), $match[2]); } $name_fields['SPFX']=trim($match[1]); $name_fields['SURN']=$match[2]; $name_fields['NAME']="/{$match[1]}{$match[2]}/"; } if ($famtag=='WIFE' && preg_match('/\/((?:[a-z]{2,3} )*)(.*)\//i', $indi_name, $match)) { if ($SURNAME_TRADITION=='lithuanian') { $match[2]=preg_replace(array('/as$/', '/is$/', '/ys$/', '/us$/'), array('ienė', 'ienė', 'ienė', 'ienė'), $match[2]); $match[2]=preg_replace(array('/aitė$/', '/ytė$/', '/iūtė$/', '/utė$/'), array('ienė', 'ienė', 'ienė', 'ienė'), $match[2]); } $new_marnm=$match[2]; } break; case 'add_spouse_to_family_action': break; } break; } } // Initialise an empty name field if (empty($name_fields['NAME'])) { $name_fields['NAME'] = '//'; } // Populate any missing 2 XXXX fields from the 1 NAME field $npfx_accept=implode('|', $NPFX_accept); 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]; } // Don’t automatically create an empty NICK - it is an “advanced” field. if (empty($name_fields['NICK']) && !empty($name_bits[6]) && !preg_match('/^2 NICK/m', $namerec)) { $name_fields['NICK']=$name_bits[6]; } } // Edit the standard name fields foreach ($name_fields as $tag=>$value) { add_simple_tag("0 $tag $value"); } // Get the advanced name fields $adv_name_fields=array(); if (preg_match_all('/('.WT_REGEX_TAG.')/', $ADVANCED_NAME_FACTS, $match)) foreach ($match[1] as $tag) $adv_name_fields[$tag]=''; // This is a custom tag, but webtrees uses it extensively. if ($SURNAME_TRADITION=='paternal' || $SURNAME_TRADITION=='polish' || $SURNAME_TRADITION=='lithuanian' || (strpos($namerec, '2 _MARNM')!==false)) { $adv_name_fields['_MARNM']=''; } if (isset($adv_name_fields['TYPE'])) { unset($adv_name_fields['TYPE']); } foreach ($adv_name_fields as $tag=>$dummy) { // Edit existing tags if (preg_match_all("/2 $tag (.+)/", $namerec, $match)) foreach ($match[1] as $value) { if ($tag=='_MARNM') { $mnsct = preg_match('/\/(.+)\//', $value, $match2); $marnm_surn = ''; if ($mnsct>0) $marnm_surn = $match2[1]; add_simple_tag("2 _MARNM ".$value); add_simple_tag("2 _MARNM_SURN ".$marnm_surn); } else { add_simple_tag("2 $tag $value", '', WT_Gedcom_Tag::getLabel("NAME:{$tag}", $person)); } } // Allow a new row to be entered if there was no row provided if (count($match[1])==0 && empty($name_fields[$tag]) || $tag!='_HEB' && $tag!='NICK') if ($tag=='_MARNM') { if (strstr($ADVANCED_NAME_FACTS, '_MARNM')==false) { add_simple_tag("0 _MARNM"); add_simple_tag("0 _MARNM_SURN $new_marnm"); } } else { add_simple_tag("0 $tag", '', WT_Gedcom_Tag::getLabel("NAME:{$tag}", $person)); } } // Handle any other NAME subfields that aren’t included above (SOUR, NOTE, _CUSTOM, etc) if ($namerec) { $gedlines = explode("\n", $namerec); // -- find the number of lines in the record $fields = explode(' ', $gedlines[0]); $glevel = $fields[0]; $level = $glevel; $type = trim($fields[1]); $tags=array(); $i = 0; do { if ($type!='TYPE' && !isset($name_fields[$type]) && !isset($adv_name_fields[$type])) { $text = ''; for ($j=2; $j2) $text .= ' '; $text .= $fields[$j]; } while (($i+10)) { if ($cmatch[1]=="CONT") $text.="\n"; if ($WORD_WRAPPED_NOTES) $text .= ' '; $text .= $cmatch[2]; $i++; } add_simple_tag($level.' '.$type.' '.$text); } $tags[]=$type; $i++; if (isset($gedlines[$i])) { $fields = explode(' ', $gedlines[$i]); $level = $fields[0]; if (isset($fields[1])) $type = $fields[1]; } } while (($level>$glevel)&&($i
'; // 1 SEX if ($famtag=="HUSB" || $gender=="M") { add_simple_tag("0 SEX M"); } elseif ($famtag=="WIFE" || $gender=="F") { add_simple_tag("0 SEX F"); } else { add_simple_tag("0 SEX"); } $bdm = "BD"; if (preg_match_all('/('.WT_REGEX_TAG.')/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { if (!in_array($match, explode('|', WT_EVENTS_DEAT))) { addSimpleTags($match); } } } //-- if adding a spouse add the option to add a marriage fact to the new family if ($nextaction=='add_spouse_to_individual_action' || $nextaction=='add_spouse_to_family_action') { $bdm .= "M"; if (preg_match_all('/('.WT_REGEX_TAG.')/', $QUICK_REQUIRED_FAMFACTS, $matches)) { foreach ($matches[1] as $match) { addSimpleTags($match); } } } if (preg_match_all('/('.WT_REGEX_TAG.')/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { if (in_array($match, explode('|', WT_EVENTS_DEAT))) { addSimpleTags($match); } } } } echo keep_chan($person); echo "
"; if ($nextaction=='update') { // GEDCOM 5.5.1 spec says NAME doesn’t get a OBJE print_add_layer('SOUR'); print_add_layer('NOTE'); print_add_layer('SHARED_NOTE'); } else { print_add_layer('SOUR', 1); print_add_layer('OBJE', 1); print_add_layer('NOTE', 1); print_add_layer('SHARED_NOTE', 1); } // If we are editing an existing name, allow raw GEDCOM editing if ($name_fact && (Auth::isAdmin() || $SHOW_GEDCOM_RECORD)) { echo '

', WT_I18N::translate('Edit raw GEDCOM'), ''; } echo '

'; echo ''; if (preg_match('/^add_(child|spouse|parent|unlinked_indi)/', $nextaction)) { echo ''; } echo ''; echo '

'; echo '
'; $controller->addInlineJavascript(' SURNAME_TRADITION="'.$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 frm =document.forms[0]; var npfx=frm.NPFX.value; var givn=frm.GIVN.value; var spfx=frm.SPFX.value; var surn=frm.SURN.value; var nsfx=frm.NSFX.value; 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") { // Default format: /SURN/GIVN return trim(npfx+" /"+trim(spfx+" "+surn).replace(/ *, */g, " ")+"/"+givn.replace(/ *, */g, " ")+" "+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; // Update NAME field from components and display it var frm =document.forms[0]; var npfx=frm.NPFX.value; var givn=frm.GIVN.value; var spfx=frm.SPFX.value; var surn=frm.SURN.value; var nsfx=frm.NSFX.value; document.getElementById("NAME").value=generate_name(); document.getElementById("NAME_display").innerText=frm.NAME.value; // 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 // var oldName = ""; var manualChange = false; 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 WT_GedcomRecord object function check_record_access(WT_GedcomRecord $object=null) { global $controller; if (!$object || !$object->canShow() || !$object->canEdit()) { $controller ->pageHeader() ->addInlineJavascript('closePopupAndReloadParent();'); exit; } }