public void UpdateTimeSpanRange(KmlTimeSpan span)
        {
            if (!span.UnBoundedBegin)
            {
                if (TimeSpan.BeginTime > span.BeginTime)
                {
                    TimeSpan.BeginTime = span.BeginTime;
                    TimeSpan.UnBoundedBegin = false;
                }

                if (TimeSpan.EndTime < span.BeginTime)
                {
                    TimeSpan.EndTime = span.BeginTime;
                    TimeSpan.UnBoundedEnd = false;
                }

            }

            if (!span.UnBoundedEnd)
            {
                if (TimeSpan.EndTime < span.EndTime)
                {
                    TimeSpan.EndTime = span.EndTime;
                    TimeSpan.UnBoundedEnd = false;
                }

                if (TimeSpan.BeginTime > span.EndTime)
                {
                    TimeSpan.BeginTime = span.EndTime;
                    TimeSpan.UnBoundedBegin = false;
                }

            }
        }
        // todo Define remainder of vars
        public override void LoadDetails(XmlNode node, KmlRoot owner)
        {
            if (node["name"] != null)
            {
                Name = node["name"].InnerText;
            }

            foreach (XmlNode child in node.ChildNodes)
            {
                if (child.Name == "Style")
                {
                    KmlStyle style = new KmlStyle();
                    style.LoadDetails(child, owner);
                    Style = style;
                    if (!string.IsNullOrEmpty(style.ID))
                    {
                        owner.Styles.Add(style.ID, style);
                    }
                }
                if (child.Name == "StyleMap")
                {
                    KmlStyleMap style = new KmlStyleMap();
                    style.LoadDetails(child, owner);
                    if (!string.IsNullOrEmpty(style.ID))
                    {
                        owner.Styles.Add(style.ID, style);
                    }
                }
            }

            base.LoadDetails(node, owner);

            if (node["open"] != null)
            {
                open = node["open"].InnerText.Trim() == "1";
            }

            if (node["visibility"] != null)
            {
                visibility = node["visibility"].InnerText.Trim() == "1";
            }

            if (node["atom:author"] != null)
            {
                atom_author = node["atom:author"].InnerText;
            }

            if (node["atom:link"] != null)
            {
                atom_link = node["atom:link"].InnerText;
            }

            if (node["address"] != null)
            {
                address = node["address"].InnerText;
            }

            if (node["xal:AddressDetails"] != null)
            {
                xal_AddressDetails = node["xal:AddressDetails"].InnerText;
            }

            if (node["description"] != null)
            {
                description = node["description"].InnerText;
            }

            if (node["Snippet"] != null)
            {
                Snippet = node["Snippet"].InnerText;
            }

            if (node["Region"] != null)
            {
                region = new KmlRegion();
                region.LoadDetails(node["Region"], owner);
            }
            if (node["LookAt"] != null)
            {
                LookAt = new KmlLookAt();
                LookAt.LoadDetails(node["LookAt"], owner);
            }

            if (node["TimeSpan"] != null)
            {
                Time = new KmlTimeSpan();
                Time.LoadDetails(node["TimeSpan"], owner);
                owner.UpdateTimeSpanRange(Time);
            }

            if (node["TimeStamp"] != null)
            {
                Time = new KmlTimeSpan();
                Time.LoadDetails(node["TimeStamp"], owner);
                owner.UpdateTimeSpanRange(Time);
            }

            if (node["styleUrl"] != null)
            {
                string url = node["styleUrl"].InnerText;

                if (url.StartsWith("#"))
                {
                    // Internal reference
                    if (owner != null)
                    {
                        if (owner.Document != null)
                        {
                            this.Style = owner.Styles[url.Remove(0, 1)];
                        }
                    }
                }
            }

            if (node["StyleSelector"] != null)
            {
                Style = new KmlStyle();
                if (node["StyleSelector"]["Style"] != null)
                {
                    Style.LoadDetails(node["StyleSelector"]["Style"], owner);
                }

                //todo add stle options

            }
            //todo finish up all of this ! Missing fields and types galore
        }
        public KmlRoot(string filename, KmlRoot owner)
        {
            TimeSpan = new KmlTimeSpan();
            // Set high and low points.
            TimeSpan.BeginTime = new DateTime(3999, 1, 1);
            TimeSpan.EndTime = new DateTime(1, 1, 1);

            Owner = owner;
            if (Uri.IsWellFormedUriString(filename, UriKind.Absolute))
            {
                BaseUri = new Uri(filename);
            }

            if (!File.Exists(filename) && owner != null & owner.BaseUri != null)
            {
                Uri newUri = new Uri(owner.BaseUri, filename);
                filename = newUri.ToString();
            }

            XmlDocument doc = new XmlDocument();
            XmlNamespaceManager NamespaceManager = new XmlNamespaceManager(doc.NameTable);
            NamespaceManager.AddNamespace("atom", "http://www.w3.org/2005/Atom");

            if (filename.ToLower().Contains(".kmz"))
            {
                if (Uri.IsWellFormedUriString(filename, UriKind.Absolute))
                {
                    Stream fs = UiTools.GetMemoryStreamFromUrl(filename);
                    Archive = new ZipArchive(fs);
                    foreach (ZipEntry entry in Archive.Files)
                    {
                        if (entry.Filename.ToLower().EndsWith(".kml"))
                        {
                            doc.Load(entry.GetFileStream());
                        }
                    }
                }
                else
                {
                    // using (FileStream fs = new FileStream(filename, FileMode.Open))
                    FileStream fs = new FileStream(filename, FileMode.Open);
                    {
                        ZipArchive archive = new ZipArchive(fs);
                        foreach (ZipEntry entry in archive.Files)
                        {
                            if (entry.Filename.ToLower().EndsWith(".kml"))
                            {
                                doc.Load(entry.GetFileStream());
                                Archive = archive;
                            }
                        }
                    }
                }
            }
            else
            {
                try
                {
                    //todo this really needs to be fixed.
                    doc.Load(filename);
                }
                catch
                {
                }
            }
            XmlNode kml = doc["kml"];
            if (kml == null)
            {
                return;
            }

            if (kml.Attributes["hint"] != null)
            {
                if (kml.Attributes["hint"].InnerText.ToLower().Contains("sky"))
                {
                    sky = true;
                }
            }

            LoadDetails(kml);
            LoadStatus = KmlLoadStatus.Loaded;
        }