' . WT_Filter::escapeHtml($value) . ''; $js='jQuery("#' . $name . '").editable("' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'save.php", {submitdata: {csrf: WT_CSRF_TOKEN}, submit:"  ' . /* I18N: button label */ WT_I18N::translate('save') . '  ", style:"inherit", placeholder: "'.WT_I18N::translate('click to edit').'"});'; if ($controller) { $controller->addInlineJavascript($js); return $html; } else { // For AJAX callbacks return $html . ''; } } // Create a text area for inline editing using jeditable function edit_text_inline($name, $value, $controller=null) { $html='' . WT_Filter::escapeHtml($value) . ''; $js='jQuery("#' . $name . '").editable("' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'save.php", {submitdata: {csrf: WT_CSRF_TOKEN}, submit:"  ' . WT_I18N::translate('save') . '  ", style:"inherit", placeholder: "'.WT_I18N::translate('click to edit').'", type: "textarea", rows:4, cols:60 });'; if ($controller) { $controller->addInlineJavascript($js); return $html; } else { // For AJAX callbacks return $html . ''; } } // Create a '.$html.''; } else { return ''; } } // An inline-editing version of select_edit_control() function select_edit_control_inline($name, $values, $empty, $selected, $controller=null) { if (!is_null($empty)) { // Push ''=>$empty onto the front of the array, maintaining keys $tmp=array(''=>WT_Filter::escapeHtml($empty)); foreach ($values as $key=>$value) { $tmp[$key]=WT_Filter::escapeHtml($value); } $values=$tmp; } $values['selected']=WT_Filter::escapeHtml($selected); $html='' . (array_key_exists($selected, $values) ? $values[$selected] : '') . ''; $js='jQuery("#' . $name . '").editable("' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'save.php", {submitdata: {csrf: WT_CSRF_TOKEN}, type:"select", data:' . json_encode($values) . ', submit:"  ' . WT_I18N::translate('save') . '  ", style:"inherit", placeholder: "'.WT_I18N::translate('click to edit').'", callback:function(value, settings) {jQuery(this).html(settings.data[value]);} });'; if ($controller) { $controller->addInlineJavascript($js); return $html; } else { // For AJAX callbacks return $html . ''; } } // Create a set of radio buttons for a form // $name - the ID for the form element // $values - array of value=>display items // $selected - the currently selected item (if any) // $extra - extra markup for field (e.g. tab key sequence) function radio_buttons($name, $values, $selected, $extra='') { $html=''; foreach ($values as $key=>$value) { $uniqueID = $name.(int)(microtime() * 1000000); $html.=''.WT_Filter::escapeHtml($value).''; } return $html; } // Print an edit control for a Yes/No field function edit_field_yes_no($name, $selected=false, $extra='') { return radio_buttons( $name, array(false=>WT_I18N::translate('no'), true=>WT_I18N::translate('yes')), $selected, $extra ); } // An inline-editing version of edit_field_yes_no() function edit_field_yes_no_inline($name, $selected=false, $controller=null) { return select_edit_control_inline( $name, array(true=>WT_I18N::translate('yes'), false=>WT_I18N::translate('no')), null, (int)$selected, $controller ); } // Print an edit control for a checkbox function checkbox($name, $is_checked=false, $extra='') { return ''; } // Print an edit control for a checkbox, with a hidden field to store one of the two states. // By default, a checkbox is either set, or not sent. // This function gives us a three options, set, unset or not sent. // Useful for dynamically generated forms where we don't know what elements are present. function two_state_checkbox($name, $is_checked=0, $extra='') { return ''. ''; } // Print a set of edit controls to select languages function edit_language_checkboxes($field_prefix, $languages) { echo ''; $i=0; foreach (WT_I18N::installed_languages() as $code=>$name) { $content = ' '.$name.''; // print in three columns switch ($i % 3) { case 0: echo ''; break; case 1: echo ''; break; case 2: echo ''; break; } $i++; } switch ($i % 3) { case 0: break; case 1: echo ''; break; case 2: echo ''; break; } echo '
', $content, '', $content, '', $content, '
'; } // Print an edit control for access level function edit_field_access_level($name, $selected='', $extra='') { $ACCESS_LEVEL=array( WT_PRIV_PUBLIC=>WT_I18N::translate('Show to visitors'), WT_PRIV_USER =>WT_I18N::translate('Show to members'), WT_PRIV_NONE =>WT_I18N::translate('Show to managers'), WT_PRIV_HIDE =>WT_I18N::translate('Hide from everyone') ); return select_edit_control($name, $ACCESS_LEVEL, null, $selected, $extra); } // Print an edit control for a RESN field function edit_field_resn($name, $selected='', $extra='') { $RESN=array( '' =>'', 'none' =>WT_I18N::translate('Show to visitors'), // Not valid GEDCOM, but very useful 'privacy' =>WT_I18N::translate('Show to members'), 'confidential'=>WT_I18N::translate('Show to managers'), 'locked' =>WT_I18N::translate('Only managers can edit') ); return select_edit_control($name, $RESN, null, $selected, $extra); } // Print an edit control for a contact method field function edit_field_contact($name, $selected='', $extra='') { // Different ways to contact the users $CONTACT_METHODS=array( 'messaging' =>WT_I18N::translate('webtrees internal messaging'), 'messaging2'=>WT_I18N::translate('Internal messaging with emails'), 'messaging3'=>WT_I18N::translate('webtrees sends emails with no storage'), 'mailto' =>WT_I18N::translate('Mailto link'), 'none' =>WT_I18N::translate('No contact'), ); return select_edit_control($name, $CONTACT_METHODS, null, $selected, $extra); } function edit_field_contact_inline($name, $selected='', $controller=null) { // Different ways to contact the users $CONTACT_METHODS=array( 'messaging' =>WT_I18N::translate('webtrees internal messaging'), 'messaging2'=>WT_I18N::translate('Internal messaging with emails'), 'messaging3'=>WT_I18N::translate('webtrees sends emails with no storage'), 'mailto' =>WT_I18N::translate('Mailto link'), 'none' =>WT_I18N::translate('No contact'), ); return select_edit_control_inline($name, $CONTACT_METHODS, null, $selected, $controller); } // Print an edit control for a language field function edit_field_language($name, $selected='', $extra='') { return select_edit_control($name, WT_I18N::installed_languages(), null, $selected, $extra); } // An inline-editing version of edit_field_language() function edit_field_language_inline($name, $selected=false, $controller=null) { return select_edit_control_inline( $name, WT_I18N::installed_languages(), null, $selected, $controller ); } // Print an edit control for a range of integers function edit_field_integers($name, $selected='', $min, $max, $extra='') { $array=array(); for ($i=$min; $i<=$max; ++$i) { $array[$i]=WT_I18N::number($i); } return select_edit_control($name, $array, null, $selected, $extra); } // Print an edit control for a username function edit_field_username($name, $selected='', $extra='') { $all_users=WT_DB::prepare( "SELECT user_name, CONCAT_WS(' ', real_name, '-', user_name) FROM `##user` ORDER BY real_name" )->fetchAssoc(); // The currently selected user may not exist if ($selected && !array_key_exists($selected, $all_users)) { $all_users[$selected]=$selected; } return select_edit_control($name, $all_users, '-', $selected, $extra); } // Print an edit control for a ADOP field function edit_field_adop($name, $selected='', $extra='', WT_Individual $individual=null) { return select_edit_control($name, WT_Gedcom_Code_Adop::getValues($individual), null, $selected, $extra); } // Print an edit control for a PEDI field function edit_field_pedi($name, $selected='', $extra='', WT_Individual $individual=null) { return select_edit_control($name, WT_Gedcom_Code_Pedi::getValues($individual), '', $selected, $extra); } // Print an edit control for a NAME TYPE field function edit_field_name_type($name, $selected='', $extra='', WT_Individual $individual=null) { return select_edit_control($name, WT_Gedcom_Code_Name::getValues($individual), '', $selected, $extra); } // Print an edit control for a RELA field function edit_field_rela($name, $selected='', $extra='') { $rela_codes=WT_Gedcom_Code_Rela::getValues(); // The user is allowed to specify values that aren't in the list. if (!array_key_exists($selected, $rela_codes)) { $rela_codes[$selected]=$selected; } return select_edit_control($name, $rela_codes, '', $selected, $extra); } // Remove all links from $gedrec to $xref, and any sub-tags. function remove_links($gedrec, $xref) { $gedrec = preg_replace('/\n1 '.WT_REGEX_TAG.' @'.$xref.'@(\n[2-9].*)*/', '', $gedrec); $gedrec = preg_replace('/\n2 '.WT_REGEX_TAG.' @'.$xref.'@(\n[3-9].*)*/', '', $gedrec); $gedrec = preg_replace('/\n3 '.WT_REGEX_TAG.' @'.$xref.'@(\n[4-9].*)*/', '', $gedrec); $gedrec = preg_replace('/\n4 '.WT_REGEX_TAG.' @'.$xref.'@(\n[5-9].*)*/', '', $gedrec); $gedrec = preg_replace('/\n5 '.WT_REGEX_TAG.' @'.$xref.'@(\n[6-9].*)*/', '', $gedrec); return $gedrec; } // generates javascript code for calendar popup in user’s language function print_calendar_popup($id) { return ' '. ''; } function print_addnewmedia_link($element_id) { return ''; } function print_addnewrepository_link($element_id) { return ''; } function print_addnewnote_link($element_id) { return ''; } function print_editnote_link($note_id) { return ''; } function print_addnewsource_link($element_id) { return ''; } /** * add a new tag input field * * called for each fact to be edited on a form. * Fact level=0 means a new empty form : data are POSTed by name * else data are POSTed using arrays : * glevels[] : tag level * islink[] : tag is a link * tag[] : tag name * text[] : tag value * * @param string $tag fact record to edit (eg 2 DATE xxxxx) * @param string $upperlevel optional upper level tag (eg BIRT) * @param string $label An optional label to echo instead of the default * @param string $extra optional text to display after the input field */ function add_simple_tag($tag, $upperlevel='', $label='', $extra=null) { global $MEDIA_DIRECTORY, $tags, $emptyfacts, $main_fact, $TEXT_DIRECTION; global $NPFX_accept, $SPFX_accept, $NSFX_accept, $FILE_FORM_accept, $upload_count; global $xref, $bdm, $action, $CensDate; global $QUICK_REQUIRED_FACTS, $QUICK_REQUIRED_FAMFACTS, $PREFER_LEVEL2_SOURCES; $subnamefacts = array("NPFX", "GIVN", "SPFX", "SURN", "NSFX", "_MARNM_SURN"); preg_match('/^(?:(\d+) ('.WT_REGEX_TAG.') ?(.*))/', $tag, $match); list(, $level, $fact, $value) = $match; // element name : used to POST data if ($level==0) { if ($upperlevel) $element_name=$upperlevel."_".$fact; // ex: BIRT_DATE | DEAT_DATE | ... else $element_name=$fact; // ex: OCCU } else $element_name="text[]"; if ($level==1) $main_fact=$fact; // element id : used by javascript functions if ($level==0) $element_id=$fact; // ex: NPFX | GIVN ... else $element_id=$fact.(int)(microtime()*1000000); // ex: SOUR56402 if ($upperlevel) $element_id=$upperlevel."_".$fact; // ex: BIRT_DATE | DEAT_DATE ... // field value $islink = (substr($value, 0, 1)=="@" and substr($value, 0, 2)!="@#"); if ($islink) { $value=trim(trim(substr($tag, strlen($fact)+3)), " @\r"); } else { $value=trim(substr($tag, strlen($fact)+3)); } if ($fact=='REPO' || $fact=='SOUR' || $fact=='OBJE' || $fact=='FAMC') $islink = true; if ($fact=='SHARED_NOTE_EDIT' || $fact=='SHARED_NOTE') {$islink=1;$fact="NOTE";} // label echo ""; if (in_array($fact, $subnamefacts) || $fact=="LATI" || $fact=="LONG") { echo ""; } else { echo ""; } if (WT_DEBUG) { echo $element_name, "
"; } // tag name if ($label) { echo $label; } elseif ($upperlevel) { echo WT_Gedcom_Tag::getLabel($upperlevel.':'.$fact); } else { echo WT_Gedcom_Tag::getLabel($fact); } // help link // If using GEDFact-assistant window if ($action=="addnewnote_assisted") { // Do not print on GEDFact Assistant window } else { // Not all facts have help text. switch ($fact) { case 'FORM': if ($upperlevel!='OBJE') { echo help_link($fact); } break; case 'NOTE': if ($islink) { echo help_link('edit_add_SHARED_NOTE'); } else { echo help_link($fact); } break; case 'NAME': if ($upperlevel!='REPO') { echo help_link($fact); } break; case 'ASSO': case '_ASSO': // Some apps (including webtrees) use "2 _ASSO", since "2 ASSO" is not strictly valid GEDCOM if ($level==1) { echo help_link('ASSO_1'); } else { echo help_link('ASSO_2'); } break; case 'ADDR': case 'AGNC': case 'CAUS': case 'DATE': case 'EMAI': case 'EMAIL': case 'EMAL': case '_EMAIL': case 'FAX': case 'OBJE': case 'PAGE': case 'PEDI': case 'PHON': case 'PLAC': case 'RELA': case 'RESN': case 'ROMN': case 'SEX': case 'SOUR': case 'STAT': case 'SURN': case 'TEMP': case 'TEXT': case 'TIME': case 'URL': case '_HEB': case '_PRIM': echo help_link($fact); break; } } // tag level if ($level>0) { if ($fact=="TEXT" and $level>1) { echo ""; echo ""; echo ""; //-- leave data text[] value empty because the following TEXT line will //--- cause the DATA to be added echo ""; } echo ""; echo ""; echo ""; } echo ""; // value echo ""; if (WT_DEBUG) { echo $tag, "
"; } // retrieve linked NOTE if ($fact=="NOTE" && $islink) { $note1=WT_Note::getInstance($value); if ($note1) { $noterec=$note1->getGedcom(); preg_match("/$value/i", $noterec, $notematch); $value=$notematch[0]; } } if (in_array($fact, $emptyfacts) && ($value=='' || $value=='Y' || $value=='y')) { echo ""; if ($level<=1) { echo '"; echo WT_I18N::translate('yes'); } } else if ($fact=="TEMP") { echo select_edit_control($element_name, WT_Gedcom_Code_Temp::templeNames(), WT_I18N::translate('No temple - living ordinance'), $value); } else if ($fact=="ADOP") { echo edit_field_adop($element_name, $value); } else if ($fact=="PEDI") { echo edit_field_pedi($element_name, $value); } else if ($fact=='STAT') { echo select_edit_control($element_name, WT_Gedcom_Code_Stat::statusNames($upperlevel), '', $value); } else if ($fact=='RELA') { echo edit_field_rela($element_name, strtolower($value)); } else if ($fact=='QUAY') { echo select_edit_control($element_name, WT_Gedcom_Code_Quay::getValues(), '', $value); } else if ($fact=='_WT_USER') { echo edit_field_username($element_name, $value); } else if ($fact=='RESN') { echo edit_field_resn($element_name, $value); } else if ($fact=='_PRIM') { echo ''; } else if ($fact=='SEX') { echo ''; } else if ($fact == 'TYPE' && $level == '3') { //-- Build the selector for the Media 'TYPE' Fact echo ''; } else if (($fact=='NAME' && $upperlevel!='REPO') || $fact=='_MARNM') { // Populated in javascript from sub-tags echo ""; echo '', WT_Filter::escapeHtml($value), ''; echo ' '; } else { // textarea if ($fact=='TEXT' || $fact=='ADDR' || ($fact=='NOTE' && !$islink)) { echo "
"; } else { // text // If using GEDFact-assistant window if ($action=="addnewnote_assisted") { echo "'; } $tmp_array = array('TYPE','TIME','NOTE','SOUR','REPO','OBJE','ASSO','_ASSO','AGE'); // split PLAC if ($fact=='PLAC') { echo "
"; echo print_specialchar_link($element_id), ' ', print_findplace_link($element_id); echo ''; echo '
'; if (array_key_exists('places_assistant', WT_Module::getActiveModules())) { places_assistant_WT_Module::setup_place_subfields($element_id); places_assistant_WT_Module::print_place_subfields($element_id); } } elseif (!in_array($fact, $tmp_array)) { echo print_specialchar_link($element_id); } } // MARRiage TYPE : hide text field and show a selection list if ($fact=='TYPE' && $level==2 && $tags[0]=='MARR') { echo ''; echo ""; } // NAME TYPE : hide text field and show a selection list else if ($fact=='TYPE' && $level==0) { $onchange = 'onchange="document.getElementById(\''.$element_id.'\').value=this.value;"'; echo edit_field_name_type($element_name, $value, $onchange); echo ''; } // popup links switch ($fact) { case 'DATE': echo print_calendar_popup($element_id); // Allow the GEDFact_assistant module to show a census-date selector if (array_key_exists('GEDFact_assistant', WT_Module::getActiveModules())) { echo GEDFact_assistant_WT_Module::censusDateSelector($action, $upperlevel, $element_id); } break; case 'FAMC': case 'FAMS': echo print_findfamily_link($element_id); break; case 'ASSO': case '_ASSO': echo print_findindi_link($element_id); break; case 'FILE': print_findmedia_link($element_id, "0file"); break; case 'SOUR': echo print_findsource_link($element_id), ' ', print_addnewsource_link($element_id); //-- checkboxes to apply '1 SOUR' to BIRT/MARR/DEAT as '2 SOUR' if ($level==1) { echo '
'; if ($PREFER_LEVEL2_SOURCES==='0') { $level1_checked=''; $level2_checked=''; } else if ($PREFER_LEVEL2_SOURCES==='1' || $PREFER_LEVEL2_SOURCES===true) { $level1_checked=''; $level2_checked=' checked="checked"'; } else { $level1_checked=' checked="checked"'; $level2_checked=''; } if (strpos($bdm, 'B')!==false) { echo ' '; echo WT_I18N::translate('Individual'); if (preg_match_all('/('.WT_REGEX_TAG.')/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { if (!in_array($match, explode('|', WT_EVENTS_DEAT))) { echo ' '; echo WT_Gedcom_Tag::getLabel($match); } } } } if (strpos($bdm, 'D')!==false) { if (preg_match_all('/('.WT_REGEX_TAG.')/', $QUICK_REQUIRED_FACTS, $matches)) { foreach ($matches[1] as $match) { if (in_array($match, explode('|', WT_EVENTS_DEAT))) { echo ' '; echo WT_Gedcom_Tag::getLabel($match); } } } } if (strpos($bdm, 'M')!==false) { echo ' '; echo WT_I18N::translate('Family'); if (preg_match_all('/('.WT_REGEX_TAG.')/', $QUICK_REQUIRED_FAMFACTS, $matches)) { foreach ($matches[1] as $match) { echo ' '; echo WT_Gedcom_Tag::getLabel($match); } } } } break; case 'REPO': echo print_findrepository_link($element_id), ' ', print_addnewrepository_link($element_id); break; case 'NOTE': // Shared Notes Icons ======================================== if ($islink) { // Print regular Shared Note icons --------------------------- echo ' ', print_findnote_link($element_id), ' ', print_addnewnote_link($element_id); if ($value) { echo ' ', print_editnote_link($value); } // Allow the GEDFact_assistant module to create a formatted shared note. if (array_key_exists('GEDFact_assistant', WT_Module::getActiveModules())) { echo GEDFact_assistant_WT_Module::print_addnewnote_assisted_link($element_id, $xref, $action); } } break; case 'OBJE': echo print_findmedia_link($element_id, '1media'); if (!$value) { echo ' ', print_addnewmedia_link($element_id); $value = 'new'; } break; } echo '
'; // current value if ($fact=='DATE') { $date=new WT_Date($value); echo $date->Display(false); } if ($value && $value!='new' && $islink) { switch ($fact) { case 'ASSO': case 'ASSO': $tmp = WT_Individual::getInstance($value); if ($tmp) { echo ' ', $tmp->getFullname(); } break; case 'SOUR': $tmp = WT_Source::getInstance($value); if ($tmp) { echo ' ', $tmp->getFullname(); } break; case 'NOTE': $tmp = WT_Note::getInstance($value); if ($tmp) { echo ' ', $tmp->getFullname(); } break; case 'OBJE': $tmp = WT_Media::getInstance($value); if ($tmp) { echo ' ', $tmp->getFullname(); } break; case 'REPO': $tmp = WT_Repository::getInstance($value); if ($tmp) { echo ' ', $tmp->getFullname(); } break; } } // pastable values if ($fact=='FORM' && $upperlevel=='OBJE') print_autopaste_link($element_id, $FILE_FORM_accept); echo $extra, ''; return $element_id; } // prints collapsable fields to add ASSO/RELA, SOUR, OBJE ... function print_add_layer($tag, $level=2) { global $FULL_SOURCES; switch ($tag) { case 'SOUR': echo " ", WT_I18N::translate('Add a new source citation'), ''; echo help_link('edit_add_SOUR'); echo '
'; echo ''; break; case 'ASSO': case 'ASSO2': //-- Add a new ASSOciate if ($tag=='ASSO') { echo " ", WT_I18N::translate('Add a new associate'), ''; echo help_link('edit_add_ASSO'); echo '
'; echo '