// Constructor
 public CPlaceStructure( CPlaceStructure ps )
     : base(ps.Gedcom)
 {
     m_sPlaceName = ps.m_sPlaceName;
     m_sPlaceHierarchy = ps.m_sPlaceHierarchy;
     m_sPlacePhoneticVariation = ps.m_sPlacePhoneticVariation;
     m_sPlacePhoneticType = ps.m_sPlacePhoneticType;
     m_sPlaceRomanizedVariation = ps.m_sPlaceRomanizedVariation;
     m_sPlaceRomanizedType = ps.m_sPlaceRomanizedType;
     m_sPlaceLatitude = ps.m_sPlaceLatitude;
     m_sPlaceLongitude = ps.m_sPlaceLongitude;
     m_alNoteStructures = new ArrayList();
     foreach( CNoteStructure ns in ps.m_alNoteStructures )
     {
         m_alNoteStructures.Add( ns.CopyConstructor() );
     }
     m_alSourceCitations = new ArrayList();
     foreach( CSourceCitation sc in ps.m_alSourceCitations )
     {
         m_alSourceCitations.Add( sc.CopyConstructor() );
     }
 }
        // Parser
        public static CPlaceStructure Parse( CGedcom gedcom, int level )
        {
            CGedcomLine gedcomLine;

            // Temporary holders for class members. Saves constructing a class early.
            string sPlaceName;
            string sPlaceHierarchy = "";
            string sPlacePhoneticVariation = "";
            string sPlacePhoneticType = "";
            string sPlaceRomanizedVariation = "";
            string sPlaceRomanizedType = "";
            string sPlaceLatitude = "";
            string sPlaceLongitude = "";
            ArrayList noteStructures = new ArrayList();
            ArrayList sourceCitations = new ArrayList();

            CSourceCitation sourceCitation;
            CNoteStructure noteStructure;

            // There must be one of these, it defines the object.
            if ((gedcomLine = gedcom.GetLine(level, "PLAC")) == null)
            {
                // Not one of us
                return null;
            }
            sPlaceName = gedcomLine.LineItem;
            gedcom.IncrementLineIndex(1);

            bool bParsingFinished;
            do
            {
                bParsingFinished = true;

                if( (gedcomLine = gedcom.GetLine(level+1, "FORM")) != null )
                {
                    sPlaceHierarchy = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(level+1, "FONE")) != null ) // WRONG!! These are 0:M
                {
                    sPlacePhoneticVariation = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    if( (gedcomLine = gedcom.GetLine(level+2, "TYPE")) != null )
                    {
                        sPlacePhoneticType = gedcomLine.LineItem;
                        gedcom.IncrementLineIndex(1);
                    }
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(level+1, "ROMN")) != null ) // WRONG!! These are 0:M
                {
                    sPlaceRomanizedVariation = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    if( (gedcomLine = gedcom.GetLine(level+2, "TYPE")) != null )
                    {
                        sPlaceRomanizedType = gedcomLine.LineItem;
                        gedcom.IncrementLineIndex(1);
                    }
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(level+1, "MAP")) != null )
                {
                    gedcom.IncrementLineIndex(1);
                    bool bParsingFinished2;
                    do
                    {
                        bParsingFinished2 = true;
                        if( (gedcomLine = gedcom.GetLine(level+2, "LATI")) != null )
                        {
                            sPlaceLatitude = gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                        else if( (gedcomLine = gedcom.GetLine(level+2, "LONG")) != null )
                        {
                            sPlaceLongitude = gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                    }
                    while( !bParsingFinished2 );

                    bParsingFinished = false;
                }
                else if( (sourceCitation = CSourceCitation.Parse( gedcom, level+1 )) != null )
                {
                    sourceCitations.Add( sourceCitation );
                    bParsingFinished = false;
                }
                else if( (noteStructure = CNoteStructure.Parse( gedcom, level+1 )) != null )
                {
                    noteStructures.Add( noteStructure );
                    bParsingFinished = false;
                }
                else if( ( gedcomLine = gedcom.GetLine()).Level > level )
                {
                    LogFile.TheLogFile.WriteLine( LogFile.DT_GEDCOM, LogFile.EDebugLevel.Warning, "Unknown tag :" );
                    LogFile.TheLogFile.WriteLine( LogFile.DT_GEDCOM, LogFile.EDebugLevel.Warning, gedcomLine.ToString() );
                    gedcom.IncrementLineIndex(1);
                    bParsingFinished = false;
                }
            }
            while( !bParsingFinished );

            // Parsing went ok. Construct a new object and return it.
            CPlaceStructure ps = new CPlaceStructure( gedcom );
            ps.m_sPlaceName = sPlaceName;
            ps.m_sPlaceHierarchy = sPlaceHierarchy;
            ps.m_sPlacePhoneticVariation = sPlacePhoneticVariation;
            ps.m_sPlacePhoneticType = sPlacePhoneticType;
            ps.m_sPlaceRomanizedVariation = sPlaceRomanizedVariation;
            ps.m_sPlaceRomanizedType = sPlaceRomanizedType;
            ps.m_sPlaceLatitude = sPlaceLatitude;
            ps.m_sPlaceLongitude = sPlaceLongitude;
            ps.m_alNoteStructures = noteStructures;
            ps.m_alSourceCitations = sourceCitations;
            return ps;
        }
 // Copy constructor
 public CEventDetail( CEventDetail ed )
     : base(ed.Gedcom)
 {
     m_sEventOrFactClassification = ed.m_sEventOrFactClassification;
     if( ed.m_dateValue != null )
     {
         m_dateValue = new CPGDate( ed.m_dateValue );
     }
     else
     {
         m_dateValue = null;
     }
     if( ed.m_placeStructure != null )
     {
         m_placeStructure = new CPlaceStructure( ed.m_placeStructure );
     }
     else
     {
         m_placeStructure = null;
     }
     if( ed.m_addressStructure != null )
     {
         m_addressStructure = new CAddressStructure( ed.m_addressStructure );
     }
     else
     {
         m_addressStructure = null;
     }
     m_sResponsibleAgency = ed.m_sResponsibleAgency;
     m_sReligiousAffiliation = ed.m_sReligiousAffiliation;
     m_sCauseOfEvent = ed.m_sCauseOfEvent;
     m_sRestrictionNotice = ed.m_sRestrictionNotice;
     m_alNoteStructures = new ArrayList();
     foreach( CNoteStructure ns in ed.m_alNoteStructures )
     {
         m_alNoteStructures.Add( ns.CopyConstructor() );
     }
     m_alSourceCitations = new ArrayList();
     foreach( CSourceCitation sc in ed.m_alSourceCitations )
     {
         m_alSourceCitations.Add( sc.CopyConstructor() );
     }
     m_alMultimediaLinks = new ArrayList();
     foreach( CMultimediaLink ml in ed.m_alMultimediaLinks )
     {
         m_alMultimediaLinks.Add( ml.CopyConstructor() );
     }
     m_sAgeAtEvent = ed.m_sAgeAtEvent;
     m_sHusbandAgeAtEvent = ed.m_sHusbandAgeAtEvent;
     m_sWifeAgeAtEvent = ed.m_sWifeAgeAtEvent;
     m_xrefFam = ed.m_xrefFam;
     m_bAdoptedByHusband = ed.m_bAdoptedByHusband;
     m_bAdoptedByWife = ed.m_bAdoptedByWife;
     m_xrefAdoptedChild = ed.m_xrefAdoptedChild;
     m_sAlternativePlace = ed.m_sAlternativePlace;
 }