//private static bool isFileSystemUri(string uriString)
        //{
        //    Uri uriResult;

        //    return result;
        //}

        public static bool FetchSingle(string url, out object resource)
        {
            //TODO: how to handle relative files/paths?
            // use cd to determine exactly how to process relative paths
            Uri uri;

            if (string.IsNullOrEmpty(url))
            {
                resource = null;
                return(false);
            }

            if (url.StartsWith(X3DTypeConverters.URN_WEB3D_MEDIA))
            {
                //TODO: database drive common URNs
                //TODO: make an assett store making use of URNs

                url = url.Remove(0, X3DTypeConverters.URN_WEB3D_MEDIA.Length);
                url = url.TrimStart();

                url = "http://www.web3d.org/WorkingGroups/media/" + url; // bad to hard code URNs
            }
            else if (url.StartsWith(X3DTypeConverters.URN))
            {
                Console.WriteLine("TODO: cant handle this URN {0}", url);
                resource = null;
                return(false);
            }

            string tmp = X3DTypeConverters.removeQuotes(url);

            if (tmp.StartsWith(X3DTypeConverters.DATA_TEXT_PLAIN))
            {
                //TODO: complete implementation of data:uri as seen in https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs

                string dataTextPlain = tmp.Remove(0, X3DTypeConverters.DATA_TEXT_PLAIN.Length);
                dataTextPlain = dataTextPlain.TrimStart();

                MemoryStream stream = new MemoryStream();
                StreamWriter writer = new StreamWriter(stream);
                writer.Write(dataTextPlain);
                writer.Flush();
                stream.Position = 0;

                resource = stream;

                return(true);
            }

            url = X3DTypeConverters.removeQuotes(url);

            if (!CapabilityEnabled(System.IO.Path.GetExtension(url)))
            {
                switch (System.Windows.Forms.MessageBox.Show("File Extension of type " + System.IO.Path.GetExtension(url) + " is not implemented yet", "Not imp", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information))
                {
                case System.Windows.Forms.DialogResult.Yes:
                    break;

                case System.Windows.Forms.DialogResult.No:
                    System.Windows.Forms.MessageBox.Show("Perhaps this feature will be implemented soon");
                    break;
                }
                resource = null;
                return(false);
            }

            if (url.ToLower().StartsWith("file://"))
            {
                if (url.ToLower().StartsWith("file:///"))
                {
                    url = url.Remove(0, 8);
                }
                else
                {
                    url = url.Remove(0, 7);
                }
                url.Replace('/', '\\');
            }

            if (GetMIMETypeByURL(url) != X3DMIMEType.UNKNOWN)
            {
                // File is an X3D compatible Scene Graph .x3d, .x3db, .vrml etc

                //if (string.IsNullOrEmpty(SceneManager.CurrentLocation))
                //{
                //SceneManager.CurrentLocation = (new System.IO.DirectoryInfo(url)).Parent.FullName;
                //}

                // get the current path to the html document
                set_cd(BaseURL);
                // what if the *.x3d file is a relative address and no CurrentLocation can be found??? SEE THIS X3D example:
                // http://www.web3d.org/x3d/content/examples/Conformance/Appearance/ImageTexture/_pages/page13.html
                //http://www.web3d.org/x3d/content/examples/Conformance/Appearance/ImageTexture/ElevationGrid.x3d
            }

            //if(GetMIMETypeByURL(url)!=X3DMIMEType.UNKNOWN) {
            //CurrentLocation=url.TrimEnd().TrimEnd(System.IO.Path.GetFileName(url).ToCharArray());
            //}
            Uri www_url;
            Uri base_uri;

            //MessageBox.Show("for debugging purposes..");

            if (isrelative(url))
            {
                if (isWebUrl(CurrentLocation))
                {
                    url = url.Replace("\\", "/");
                }
                else
                {
                    url = url.Replace("/", "\\");
                }


                if (url.StartsWith("/"))
                {
                    url = "." + url;
                }


                if (!isWebUrl(CurrentLocation) && isrelative(url))
                {
                    // Is on the file system. Unix or Windows.

                    url = SceneManager.CurrentLocation
                          + (SceneManager.CurrentLocation.EndsWith("\\") ? "" : "\\")
                          + url;
                }
                else if (isWebUrl(CurrentLocation) && isrelative(url))
                {
                    if (string.IsNullOrEmpty(SceneManager.CurrentLocation))
                    {
                        SceneManager.CurrentLocation = (new System.IO.DirectoryInfo(url)).Parent.FullName;
                    }

                    base_uri = new Uri(CurrentLocation);

                    if (Uri.TryCreate(base_uri, url, out www_url))
                    {
                        url = www_url.ToString();
                        if (System.IO.Path.GetFileName(url) == System.IO.Path.GetFileName(BaseURL))
                        {
                            url = BaseURL;
                        }
                    }
                    else
                    {
                        Console.WriteLine("** panic ** cant handle this url {0}", url);
                        resource = null;
                        return(false);
                    }
                }
            }

            if (url.ToLower().StartsWith("file://"))
            {
                if (url.ToLower().StartsWith("file:///"))
                {
                    url = url.Remove(0, 8);
                }
                else
                {
                    url = url.Remove(0, 7);
                }
                url.Replace('/', '\\');
            }


            uri = new Uri(url);

            if (uri.IsFile)
            {
                // it should be a file on the local file system

                if (File.Exists(url))
                {
                    //FileStream fs = File.OpenRead(url);
                    //string txt = File.ReadAllText(url);

                    // Replace line endings because XDocument, and XMLDocument dont handle them well inside attribute values
                    //txt = txt.Replace("\r\n", "\n")
                    //         .Replace("\r", "\n")
                    //         .Replace("\n", "
"); // 
   




                    byte[] bytes;

                    //bytes = UTF8Encoding.UTF8.GetBytes(txt);
                    bytes = File.ReadAllBytes(url);

                    // Read all bytes now so that we quickly loose lock to file
                    MemoryStream ms = new MemoryStream(bytes);

                    X3DMIMEType mimeType = GetMIMETypeByURL(url);

                    switch (mimeType)
                    {
                    case X3DMIMEType.UNKNOWN:
                        resource = (Stream)ms;
                        break;

                    case X3DMIMEType.X3D:
                        resource = fromStream((Stream)ms);
                        break;

                    case X3DMIMEType.X3DBinary:
                        resource = fromStream((Stream)ms, mimeType);
                        break;

                    default:
                        resource = null;
                        break;
                    }
                    return(true);
                }
                else
                {
                    resource = null;
                    return(false);
                }
            }
            else
            {
                HttpWebRequest  request;
                HttpWebResponse response;
                X3DMIMEType     m;

                request = (HttpWebRequest)WebRequest.Create(url);

                request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.None;
                request.CachePolicy         = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
                request.KeepAlive           = true;
                request.Timeout             = 10000;
                request.ReadWriteTimeout    = 32000;
                request.Method = "GET";
                //request.Method="post";
                //request.ContentType = "text/plain";
                //request.UserAgent = "x3d-finely-sharpened-3.3";

                byte[]       lnBuffer, lnFile;
                MemoryStream fileStream  = null;
                string       contentType = string.Empty;

                try
                {
                    using (response = (HttpWebResponse)request.GetResponse())
                    {
                        // Handle the response now and buffer quickly into local cache ..
                        contentType = response.ContentType;

                        using (BinaryReader lxBR = new BinaryReader(response.GetResponseStream()))
                        {
                            using (MemoryStream lxMS = new MemoryStream())
                            {
                                lnBuffer = lxBR.ReadBytes(1024);
                                while (lnBuffer.Length > 0)
                                {
                                    lxMS.Write(lnBuffer, 0, lnBuffer.Length);
                                    lnBuffer = lxBR.ReadBytes(1024);
                                }
                                lnFile        = new byte[(int)lxMS.Length];
                                lxMS.Position = 0;
                                lxMS.Read(lnFile, 0, lnFile.Length);
                            }
                        }

                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            fileStream = new MemoryStream(lnFile, false);
                        }
                        else
                        {
                            resource = null;
                            return(false);
                        }
                    }


                    // Response is closed off and we have now a cached copy of it in a MemoryStream
                    // This process usually avoids timeouts when requesting say Images or larger files.

                    if (fileStream == null)
                    {
                        resource = null;
                        return(false);
                    }

                    m = GetMIMETypeByURL(url);

                    if (string.IsNullOrEmpty(contentType) || m == X3DMIMEType.UNKNOWN)
                    {
                        if (m == X3DMIMEType.UNKNOWN)
                        {
                            // response is a generic resource
                            resource = fileStream;
                        }
                        else
                        {
                            // response is a scene
                            resource = fromStream(fileStream, m);

                            set_cd(url);
                        }
                    }
                    else
                    {
                        // response is a scene
                        resource = fromStream(fileStream, m);

                        set_cd(url);
                    }
                    return(true);
                }
                catch (WebException wex)
                {
                    if (wex.Status == WebExceptionStatus.Timeout)
                    {
                        Console.WriteLine(string.Format("Timed out requesting resource '{0}'", url));
                        resource = null;
                        return(false);
                    }
                    else
                    {
                        // Skip download. If MFString was used, there should hopefully be a URL that works

                        Console.WriteLine("** skipping ** url {0}", url);

                        resource = null;
                        return(false);
                    }
                }
            }
        }