NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @author Jamie22 // @name FamilySearch Relationship Name // @version 0.5 // @description Script for FamilySearch.org that describes the relationship between you and another person on your family tree when you click "View My Relationship", ie. Grandmother, 3 Times Great Grandfather, 4th Cousin Twice Removed, etc. // @match https://www.familysearch.org/tree/* // @copyright 2019 James Shorrock // @require http://code.jquery.com/jquery-latest.js // @require https://gist.github.com/raw/2625891/waitForKeyElements.js // @grant GM_addStyle // @license GPL-3.0-or-later; https://www.gnu.org/licenses/gpl-3.0.en.html // ==/UserScript== // This will be used to display the relationship name on the page var rlNameSpan = null; waitForKeyElements("fs-person-page", addShowListener); function addShowListener() { var btnRelationship = document.getElementsByTagName("fs-person-page")[0].shadowRoot.querySelector(".relationship-calc-opener"); btnRelationship.addEventListener("click", getFamilyJSON); } function getFamilyJSON() { var loggedInPersonId = $("simple-router").attr("logged-in-person-id"); var ancestorId = window.location.pathname.split('/')[4]; $.getJSON('https://www.familysearch.org/service/tree/tree-data/my-relatives/tree-graph-relation/' + loggedInPersonId + '/' + ancestorId, nameRelationship); } function grand(rel, numgen) { if (numgen >= 2) rel = "Grand" + rel; if (numgen >= 3) rel = "Great " + rel; if (numgen == 4) rel = "Great " + rel; if (numgen >= 5) rel = (numgen - 2) + ' Times ' + rel; return rel; } function ordinalSuffixOf(i) { var j = i % 10, k = i % 100; if (j == 1 && k != 11) return i + "st"; if (j == 2 && k != 12) return i + "nd"; if (j == 3 && k != 13) return i + "rd"; return i + "th"; } function nameRelationship(relChart) { var isDiffBranch = false; var isInLaw = false; // 1 for up, -1 for down var direction = 0; var numGenerationsUp = 0; var numGenerationsDown = 0; var persons = relChart.data.persons; var ancestorGender = persons[persons.length-1].gender; // Travese the people in the relationship chart for(var i = 0; i < persons.length; i++) { if (!persons[i].relationshipToPrevious) continue; if (persons[i].relationshipToPrevious == "FATHER" || persons[i].relationshipToPrevious == "MOTHER") { direction = 1; numGenerationsUp++; } if (persons[i].relationshipToPrevious == "SON" || persons[i].relationshipToPrevious == "DAUGHTER") { if (direction == 1) isDiffBranch = true; direction = -1; numGenerationsDown++; } if (persons[i].relationshipToPrevious == "MAN" || persons[i].relationshipToPrevious == "WOMAN") isInLaw = true; } var relationship = ''; var numGenerations = 0; // Direct ancestor or descendant if (!isDiffBranch) { if (direction == 1) { if (ancestorGender == "FEMALE") relationship = "mother"; else relationship = "father"; numGenerations = numGenerationsUp; } else { if (ancestorGender == "FEMALE") relationship = "daughter"; else relationship = "son"; numGenerations = numGenerationsDown; } relationship = grand(relationship, numGenerations); } else { // Sibling if (numGenerationsUp == 1 && numGenerationsDown == 1) { if (ancestorGender == "FEMALE") relationship = "Sister"; else relationship = "Brother"; } // Niece or nephew if (numGenerationsUp == 1 && numGenerationsDown >= 2) { if (ancestorGender == "FEMALE") relationship = "niece"; else relationship = "nephew"; relationship = grand(relationship, numGenerationsDown-1); } // Uncle or aunt if (numGenerationsUp >= 2 && numGenerationsDown == 1) { if (ancestorGender == "FEMALE") relationship = "aunt"; else relationship = "uncle"; relationship = grand(relationship, numGenerationsUp-1); } // Cousin if (numGenerationsUp >= 2 && numGenerationsDown >= 2) { var cousinNum = Math.min(numGenerationsUp, numGenerationsDown)-1; var removedNum = Math.abs(numGenerationsUp - numGenerationsDown); relationship = ordinalSuffixOf(cousinNum) + ' Cousin'; if (removedNum == 1) relationship += ' Once Removed'; if (removedNum == 2) relationship += ' Twice Removed'; if (removedNum >= 3) relationship += ' ' + removedNum + ' Times Removed'; } if (isInLaw) relationship += ' In-Law'; } // Capitalize first letter relationship = relationship.charAt(0).toUpperCase() + relationship.slice(1); // Display the relationship name at the bottom of the relationship chart popup if(rlNameSpan === null) { var infoIcon = document.getElementsByTagName("fs-person-page")[0].shadowRoot.querySelector("#relationshipCalc").shadowRoot.querySelector("#info-icon"); rlNameSpan = document.createElement('span'); rlNameSpan.style.fontSize = "18px"; rlNameSpan.style.paddingLeft = "100px"; infoIcon.parentNode.insertBefore(rlNameSpan, infoIcon.nextSibling); } rlNameSpan.innerHTML = relationship; }