function findMarriages(id)
{
  if (typeof(people[id].marriages) != "undefined")
  {
    return people[id].marriages;
  }

  var result = new Array();

  var counter = 0;
  for (var i = 0; i < marriages.length; i++)
  {
    if (typeof(marriages[i]) == "undefined")
    {
      continue;
    }
    if (people[id].sex == "M" && marriages[i].husband == id)
    {
      result[counter] = i;
      counter++;
    }
    else if (people[id].sex == "F" && marriages[i].wife == id)
    {
      result[counter] = i;
      counter++;
    }
  }

  people[id].marriages = result;

  return result;
}

function findMarriage(husband, wife)
{
  for (var i = 0; i < marriages.length; i++)
  {
    if (typeof(marriages[i]) == "undefined")
    {
      continue;
    }
    if (marriages[i].husband == husband && marriages[i].wife == wife)
    {
      return i;
    }
  }

  return -1;
}

function findChildren(theMarriages)
{
  var result = new Array();

  for (var i = 0; i < theMarriages.length; i++)
  {
    if (typeof(marriages[theMarriages[i].children]) != "undefined")
    {
      result[i] = marriages[theMarriages[i]].children;
      continue;
    }
    var marriage = marriages[theMarriages[i]];
    result[i] = new Array();
    var counter = 1;
    var foundChild = true;
    while (foundChild == true)
    {
      foundChild = false;
      for (var j = 0; j < people.length; j++)
      {
  if (typeof(people[j]) == "undefined")
  {
    continue;
  }
        if (typeof(people[j].father) == "undefined"
            || typeof(people[j].mother) == "undefined")
        {
          continue;
        }
        if (people[j].father == marriage.husband
            && people[j].mother == marriage.wife
            && people[j].siblingIndex == counter)
        {
          foundChild = true;
          result[i][counter - 1] = j;
          counter++;
          break;
        }
      }
    }

    theMarriages[i].children = result[i];
  }

  return result;
}

function writeImageCaption(image)
{
  if (typeof(image.caption) != "undefined" && image.caption != "")
  {
    document.write(image.caption.replace(/\n/g, "<BR>"));
  }
  if (typeof(image.description) != "undefined" && image.description != "")
  {
    if (typeof(image.caption) != "undefined" && image.caption != "")
    {
      document.write("<BR>");
    }
    document.write(image.description.replace(/\n/g, "<BR>"));
  }
  var dateStr = getAbbrevFullDateStr(image);
  if (dateStr != "")
  {
    if ((typeof(image.caption) != "undefined" && image.caption != "")
        || (typeof(image.description) != "undefined"
            && image.description != ""))
    {
      document.write("<BR>");
    }
    document.write(dateStr);
  }
}

function getImageCaption(image)
{
  var str = "";
  if (typeof(image.caption) != "undefined" && image.caption != "")
  {
    str = str + image.caption.replace(/\n/g, "; ");
  }
  if (typeof(image.description) != "undefined" && image.description != "")
  {
    if (typeof(image.caption) != "undefined" && image.caption != "")
    {
      str = str + "; ";
    }
    str = str + image.description.replace(/\n/g, "; ");
  }
  var dateStr = getAbbrevFullDateStr(image);
  if (dateStr != "")
  {
    if ((typeof(image.caption) != "undefined" && image.caption != "")
        || (typeof(image.description) != "undefined"
            && image.description != ""))
    {
      str = str + "; ";
    }
    str = str + dateStr;
  }

  return str;
}

function getEventText(person, event)
{
  var str = "";
  var pronoun1 = "";
  var pronoun2 = "";

  if (person == "")
  {
    pronoun1 = "They";
    pronoun2 = "Their";
  }
  else if (person.sex == "F")
  {
    pronoun1 = "She";
    pronoun2 = "Her";
  }
  else if (person.sex == "M")
  {
    pronoun1 = "He";
    pronoun2 = "His";
  }
  else // if (person.sex == "U")
  {
    pronoun1 = "He/she";
    pronoun2 = "His/her";
  }

  if (event.eventType == "Census")
  {
    str = pronoun1 + " appeared on the " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Christening")
  {
    str = pronoun1 + " was christened" + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Baptism")
  {
    if (typeof(event.description) != "undefined")
    {
      str = pronoun1 + " was baptized " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
    }
    else
    {
      str = pronoun1 + " was baptized " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
    }
  }
  else if (event.eventType == "Confirmation")
  {
    str = pronoun1 + " was confirmed " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Social Security Number")
  {
    str = pronoun2 + " social security number was " + event.description + ".";
  }
  else if (event.eventType == "Residence")
  {
    if (typeof(event.description) != "undefined")
    {
      str = pronoun1 + " lived at " + event.description + " in " + getPlaceStr(event.place) + getFullDateStrWithPrep(event) + ".";
    }
    else
    {
      str = pronoun1 + " lived in " + getPlaceStr(event.place) + getFullDateStrWithPrep(event) + ".";
    }
  }
  else if (event.eventType == "School")
  {
    str = pronoun1 + " attended school at " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Graduation")
  {
    str = pronoun1 + " graduated from " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Employment")
  {
    str = pronoun1 + " was employed as a " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Engagement")
  {
    var plc = getPlaceStr(event.place);
    if (plc != "")
    {
      plc = " in " + plc;
    }
    str = pronoun1 + " were engaged " + getFullDateStrWithPrep(event) + plc + ".";
  }
  else if (event.eventType == "Rehearsal Dinner")
  {
    str = pronoun1 + " attended a rehearsal dinner for their wedding at " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Occupation")
  {
    str = pronoun1 + " worked as " + event.description + getFullDateStrWithPrep(event);
    if (typeof(event.place) != "undefined")
    {
      str = str + " in " + getPlaceStr(event.place);
    }
    str = str + ".";
  }
  else if (event.eventType == "Military Service")
  {
    str = pronoun1 + " served in the " + event.description + getFullDateStrWithPrep(event) + ".";
  }
  else if (event.eventType == "Military Discharge")
  {
    str = pronoun1 + " was discharged from the " + event.description + getFullDateStrWithPrep(event);
    if (typeof(event.place) != "undefined")
    {
      str = str + " in " + getPlaceStr(event.place);
    }
    str = str + ".";
  }
  else if (event.eventType == "Military Promotion")
  {
    str = pronoun1 + " was promoted to " + event.description + getFullDateStrWithPrep(event) + ".";
  }
  else if (event.eventType == "Organization Leadership")
  {
    str = pronoun1 + " served as " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Organization Membership")
  {
    str = pronoun1 + " became a member of " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Wedding")
  {
    str = pronoun1 + " participated in the wedding of " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Immigration")
  {
    str = pronoun1 + " immigrated " + event.description + getFullDateStrWithPrep(event) + ".";
  }
  else if (event.eventType == "Military Muster Roll")
  {
    str = pronoun1 + " appeared on " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Land")
  {
    str = pronoun1 + " owned land " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Land Purchase")
  {
    str = pronoun1 + " purchased land " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Land Sale")
  {
    str = pronoun1 + " sold land " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Loan")
  {
    str = pronoun1 + " takes out a loan " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Land Grant")
  {
    str = pronoun1 + " was granted land " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Land Patent")
  {
    str = pronoun1 + " was issued a patent for granted land " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Land Survey")
  {
    str = pronoun1 + " has land surveyed " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Tax Roll")
  {
    str = pronoun1 + " appeared on the tax roll in " + getPlaceStr(event.place) + getFullDateStrWithPrep(event) + ".";
  }
  else if (event.eventType == "Voter Registration")
  {
    str = pronoun1 + " was registered to vote in " + getPlaceStr(event.place) + getFullDateStrWithPrep(event) + ".";
  }
  else if (event.eventType == "Military Draft")
  {
    str = pronoun1 + " registered for the " + event.description + " draft " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Court")
  {
    str = pronoun1 + " was involved in a court case " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Will")
  {
    str = pronoun1 + " signed a will " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Deed of Gift")
  {
    str = pronoun1 + " signed a deed of gift " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Cattle Brand")
  {
    str = pronoun1 + " registered a cattle brand " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Probate")
  {
    str = pronoun2 + " estate is in probate " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Public Service")
  {
    var plc = "";
    if (typeof(event.place) != "undefined")
    {
      plc = " in " + getPlaceStr(event.place);
    }
    str = pronoun1 + " served as " + event.description + getFullDateStrWithPrep(event) + plc + ".";
  }
  else if (event.eventType == "Church")
  {
    str = pronoun1 + " was a member of " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Power of Attorney")
  {
    var desc = "";
    if (typeof(event.description) != "undefined")
    {
      desc = event.description;
    }
    str = pronoun1 + " grants power of attorney " + desc + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Deposition")
  {
    var desc = "";
    if (typeof(event.description) != "undefined")
    {
      desc = event.description;
    }
    str = pronoun1 + " gave a deposition " + desc + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Inheritance")
  {
    var desc = "";
    if (typeof(event.description) != "undefined")
    {
      desc = event.description;
    }
    str = pronoun1 + " received an inheritance " + desc + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Pension Certificate")
  {
    str = pronoun1 + " was issued a pension certificate " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Declaration of Intent")
  {
    str = pronoun1 + " declared his intention to become a citizen of the United States " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Citizenship")
  {
    str = pronoun1 + " became a citizen of " + event.description + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Bond")
  {
    str = pronoun1 + " was bonded " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Election")
  {
    str = pronoun1 + " participated in an election " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Published")
  {
    str = pronoun1 + " had work published in " + event.description + getFullDateStrWithPrep(event) + ".";
  }
  else if (event.eventType == "Trust")
  {
    str = pronoun1 + " was part of a Trust set up " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Passport")
  {
    str = pronoun1 + " was issued a passport " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Award")
  {
    str = pronoun1 + " received an award " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Accident")
  {
    str = pronoun1 + " was in an accident " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }
  else if (event.eventType == "Pension")
  {
    str = pronoun1 + " applied for a pension " + getFullDateStrWithPrep(event) + " in " + getPlaceStr(event.place) + ".";
  }

  return str;
}

function setChildrenFlag()
{
  for (var i = 0; i < people.length; i++)
  {
    if (typeof(people[i]) == "undefined")
    {
      continue;
    }
    if (typeof(people[i].father) != "undefined")
    {
      people[people[i].father].hasChildren = true;
    }
    if (typeof(people[i].mother) != "undefined")
    {
      people[people[i].mother].hasChildren = true;
    }
  }
}

function markDirectAncestors(startAt, genStart)
{
  if (typeof(startAt) == "undefined")
  {
    startAt = 0;
  }
  if (typeof(genStart) == "undefined")
  {
    genStart = 1;
  }

  people[startAt].primary = "true";

  // Catch my children
  people[1000].primary = "true";
  people[1776].primary = "true";

  people[startAt].generation = "" + genStart;
  markParents(people[startAt], genStart + 1);

  setChildrenFlag();
}

function markParents(person, generation)
{
  if (typeof(person.father) != "undefined")
  {
    people[person.father].primary = "true";
    if (typeof(people[person.father].generation) == "undefined"
        || people[person.father].generation == "")
    {
      people[person.father].generation = "" + generation;
    }
    else
    {
      people[person.father].generation = people[person.father].generation + ";" + generation;
    }
    markParents(people[person.father], (generation + 1));
  }

  if (typeof(person.mother) != "undefined")
  {
    people[person.mother].primary = "true";
    if (typeof(people[person.mother].generation) == "undefined"
        || people[person.mother].generation == "")
    {
      people[person.mother].generation = "" + generation;
    }
    else
    {
      people[person.mother].generation = people[person.mother].generation + ";" + generation;
    }
    markParents(people[person.mother], (generation + 1));
  }
}

function calculateGenerations()
{
  var primaries = new Array();
  var labels = new Array();

  //primaries[0] = 68;
  //labels[0] = "James A. Andrews, Sr.: ";
  //  primaries[0] = 30;
  //  labels[0] = "Jane Baldwin: ";
  //  primaries[0] = 414;
  //  labels[0] = "Zachariah Landrum: ";
  //  primaries[3] = 366;
  //  labels[3] = "Paul Thompson: ";

  //  for (var i = 0; i < primaries.length; i++)
  //  {
  //    people[primaries[i]].generation[people[primaries[i]].generation.length] = "Primary ancestor: " + (i + 1);

  //    calcGenerationsChildren(primaries[i], labels[i] + (i + 1));
  //  }
}

//function calcGenerationsChildren(id, level)
//{
//   var theMarriages = findMarriages(id);
//   var theChildren = findChildren(theMarriages);
//   var useMarriage = -1;
//   for (var j = 0; j < theMarriages.length; j++)
//   {
//     for (var k = 0; k < theChildren[j].length; k++)
//     {
//       if (people[theChildren[j][k]].primary == "true")
//       {
//         useMarriage = j;
//         break;
//       }
//     }

//     if (useMarriage != -1)
//     {
//       break;
//     }
//   }

//   if (useMarriage != -1)
//   {
//     for (var j = 0; j < theChildren[useMarriage].length; j++)
//     {
//       people[theChildren[useMarriage][j]].generation[people[theChildren[useMarriage][j]].generation.length] = level + "." + (j + 1);
//
//       calcGenerationsChildren(theChildren[useMarriage][j], level + "." + (j + 1));
//     }
//   }
//}

function calculateRelationship(id, marriage)
{
  var relationships = new Array();
  relationships[0] = ""; // Not used
  relationships[1] = ""; // Son/Daughter
  relationships[2] = "";
  relationships[3] = ""; // Mother/Father
  relationships[4] = "Grand";
  relationships[5] = "Great Grand";
  relationships[6] = "2nd Great Grand";
  relationships[7] = "3rd Great Grand";
  relationships[8] = "4th Great Grand";
  relationships[9] = "5th Great Grand";
  relationships[10] = "6th Great Grand";
  relationships[11] = "7th Great Grand";
  relationships[12] = "8th Great Grand";
  relationships[13] = "9th Great Grand";
  relationships[14] = "10th Great Grand";
  relationships[15] = "11th Great Grand";
  relationships[16] = "12th Great Grand";

  var cousinCounter = new Array();
  cousinCounter[0] = "";
  cousinCounter[1] = "";
  cousinCounter[2] = "First";
  cousinCounter[3] = "Second";
  cousinCounter[4] = "Third";
  cousinCounter[5] = "Fourth";
  cousinCounter[6] = "Fifth";
  cousinCounter[7] = "Sixth";
  cousinCounter[8] = "Seventh";
  cousinCounter[9] = "Eighth";
  cousinCounter[10] = "Ninth";
  cousinCounter[11] = "Tenth";
  cousinCounter[12] = "Eleventh";
  cousinCounter[13] = "Twelfth";

  var results = new Array();
  var resultCounter = 0;

  if (people[id].primary == "true")
  {
    var tokenCounter = 0;
    var generations = new Array();
    var tempStr = people[id].generation;
    var idx = tempStr.indexOf(";");
    while (idx > -1)
    {
      var thisGen = parseInt(tempStr.substring(0, idx));
      generations[tokenCounter] = thisGen;
      tokenCounter++;
      tempStr = tempStr.substring(idx + 1);
      idx = tempStr.indexOf(";");
    }
    generations[tokenCounter] = parseInt(tempStr);

    for (var i = 0; i < generations.length; i++)
    {
      var thisGeneration = generations[i];
      if (people[id].sex == "M")
      {
        if (thisGeneration == 1)
        {
          if (marriage)
          {
            if (addUniqueResult(results, resultCounter, "Children"))
            {
              resultCounter++;
            }
          }
          else
          {
            if (addUniqueResult(results, resultCounter, "Son"))
            {
              resultCounter++;
            }
          }
        }
        else if (thisGeneration == 3)
        {
          if (marriage)
          {
            if (addUniqueResult(results, resultCounter, "Parents"))
            {
              resultCounter++;
            }
          }
          else
          {
            if (addUniqueResult(results, resultCounter, "Father"))
            {
              resultCounter++;
            }
          }
        }
        else if (thisGeneration > 3)
        {
          if (marriage)
          {
            if (addUniqueResult(results, resultCounter, relationships[thisGeneration] + "parents"))
            {
              resultCounter++;
            }
          }
          else
          {
            if (addUniqueResult(results, resultCounter, relationships[thisGeneration] + "father"))
            {
              resultCounter++;
            }
          }
        }
      }
      else
      {
        if (thisGeneration == 1)
        {
          if (marriage)
          {
            if (addUniqueResult(results, resultCounter, "Children"))
            {
              resultCounter++;
            }
          }
          else
          {
            if (addUniqueResult(results, resultCounter, "Daughter"))
            {
              resultCounter++;
            }
          }
        }
        else if (thisGeneration == 3)
        {
          if (marriage)
          {
            if (addUniqueResult(results, resultCounter, "Parents"))
            {
              resultCounter++;
            }
          }
          else
          {
            if (addUniqueResult(results, resultCounter, "Mother"))
            {
              resultCounter++;
            }
          }
        }
        else if (thisGeneration > 3)
        {
          if (marriage)
          {
            if (addUniqueResult(results, resultCounter, relationships[thisGeneration] + "parents"))
            {
              resultCounter++;
            }
          }
          else
          {
            if (addUniqueResult(results, resultCounter, relationships[thisGeneration] + "mother"))
            {
              resultCounter++;
            }
          }
        }
      }
    }
  }
  else
  {
    var counterStr = searchParents(id, 1);
    if (counterStr != -1)
    {
      var idx = counterStr.indexOf(":");
      var counter = parseInt(counterStr.substring(0, idx));
      var generationStr = counterStr.substring(idx + 1);

      var tokenCounter = 0;
      var generations = new Array();
      var tempStr = generationStr;
      idx = tempStr.indexOf(";");
      while (idx > -1)
      {
        var thisGen = parseInt(tempStr.substring(0, idx));
        generations[tokenCounter] = thisGen - 1;
        tokenCounter++;
        tempStr = tempStr.substring(idx + 1);
        idx = tempStr.indexOf(";");
      }
      generations[tokenCounter] = parseInt(tempStr) - 1;
      for (var i = 0; i < generations.length; i++)
      {
        var thisGeneration = generations[i];
        if (counter == 1)
        {
          // Aunt/Uncle
          if (thisGeneration == 3)
          {
            if (people[id].sex == "M")
            {
              if (addUniqueResult(results, resultCounter, "Uncle"))
              {
                resultCounter++;
              }
            }
            else
            {
              if (addUniqueResult(results, resultCounter, "Aunt"))
              {
                resultCounter++;
              }
            }
          }
          if (thisGeneration > 3)
          {
            if (people[id].sex == "M")
            {
              if (addUniqueResult(results, resultCounter, relationships[thisGeneration] + " Uncle"))
              {
                resultCounter++;
              }
            }
            else
            {
              if (addUniqueResult(results, resultCounter, relationships[thisGeneration] + " Aunt"))
              {
                resultCounter++;
              }
            }
          }
        }
        else if (counter > 1)
        {
          var str = cousinCounter[counter] + " Cousin";
          if (counter + 1 != thisGeneration)
          {
            str = str + " " + (thisGeneration - (counter + 1)) + " times removed";
          }
          if (addUniqueResult(results, resultCounter, str))
          {
            resultCounter++;
          }
        }
      }
    }
  }

  if (results.length == 0)
  {
    results[0] = "NONE";
  }

  return results;
}

function addUniqueResult(results, resultCounter, result)
{
  var found = false;
  for (var i = 0; i < results.length; i++)
  {
    if (results[i] == result)
    {
      found = true;
    }
  }
  if (!found)
  {
    results[resultCounter] = result;
    return true;
  }
  return false;
}

function searchParents(person, counter)
{
  var result = -1;
  if (typeof(people[person].father) != "undefined")
  {
    if (people[people[person].father].primary == "true")
    {
      return counter + ":" + people[people[person].father].generation;
    }
    result = searchParents(people[person].father, (counter + 1));
  }

  if (result == -1 && typeof(people[person].mother) != "undefined")
  {
    if (people[people[person].mother].primary == "true")
    {
      return counter + ":" + people[people[person].mother].generation;
    }
    result = searchParents(people[person].mother, (counter + 1));
  }

  return result;
}
