/// <summary>
        /// Gets the appropriate wrapper object
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        MetaWeblogWrapper GetWrapper()
        {
            MetaWeblogWrapper wrapper;

            if (WeblogInfo.Type == WeblogTypes.MetaWeblogApi)
            {
                wrapper = new MetaWeblogWrapper(WeblogInfo.ApiUrl,
                                                WeblogInfo.Username,
                                                mmApp.DecryptString(WeblogInfo.Password),
                                                WeblogInfo.BlogId);
            }
            else
            {
                wrapper = new WordPressWrapper(WeblogInfo.ApiUrl,
                                               WeblogInfo.Username,
                                               mmApp.DecryptString(WeblogInfo.Password));
            }

            return(wrapper);
        }
        /// <summary>
        /// Parses each of the images in the document and posts them to the server.
        /// Updates the HTML with the returned Image Urls
        /// </summary>
        /// <param name="html">HTML that contains images</param>
        /// <param name="basePath">image file name</param>
        /// <param name="wrapper">blog wrapper instance that sends</param>
        /// <param name="metaData">metadata containing post info</param>
        /// <param name="imgFileMapping">mapping of filename with hash to NewMediaObject</param>
        /// <returns>update HTML string for the document with updated images</returns>
        private string SendImages(string html, string basePath,
                                  MetaWeblogWrapper wrapper, Dictionary <string, MediaObjectInfo> imgFileMapping)
        {
            // base folder name for uploads - just the folder name of the image
            var baseName = Path.GetFileName(basePath);

            baseName = FileUtils.SafeFilename(baseName).Replace(" ", "-");

            var doc = new HtmlDocument();

            doc.LoadHtml(html);
            try
            {
                // send up normalized path images as separate media items
                var images = doc.DocumentNode.SelectNodes("//img");
                if (images != null)
                {
                    foreach (HtmlNode img in images)
                    {
                        string origImageLink = img.Attributes["src"]?.Value;
                        string imgFile       = StringUtils.UrlDecode(origImageLink);

                        if (imgFile == null)
                        {
                            continue;
                        }

                        if (!imgFile.StartsWith("http://") && !imgFile.StartsWith("https://"))
                        {
                            if (!imgFile.Contains(":\\"))
                            {
                                imgFile = Path.Combine(basePath, imgFile.Replace("/", "\\"));
                            }


                            if (System.IO.File.Exists(imgFile))
                            {
                                var uploadFilename = Path.GetFileName(imgFile);
                                var media          = new MediaObject()
                                {
                                    Type = ImageUtils.GetImageMediaTypeFromFilename(imgFile),
                                    Bits = System.IO.File.ReadAllBytes(imgFile),
                                    Name = baseName + "/" + uploadFilename
                                };

                                //use file name with hash to check if file is already uploaded
                                var             imgFileChk  = origImageLink + "#" + Convert.ToBase64String(MD5.Create().ComputeHash(media.Bits));
                                MediaObjectInfo mediaResult = null;
                                if (imgFileMapping != null && imgFileMapping.ContainsKey(imgFileChk))
                                {
                                    //Image has already uploaded
                                    mediaResult = imgFileMapping[imgFileChk];
                                }
                                else
                                {
                                    mediaResult = wrapper.NewMediaObject(media);
                                    if (imgFileMapping != null)
                                    {
                                        imgFileMapping.Add(imgFileChk, mediaResult);
                                    }
                                }

                                img.Attributes["src"].Value = mediaResult.URL;

                                // use first image as featured image
                                if (!DontInferFeaturedImage)
                                {
                                    if (string.IsNullOrEmpty(FeaturedImageUrl))
                                    {
                                        FeaturedImageUrl = mediaResult.URL;
                                    }
                                    if (string.IsNullOrEmpty(FeatureImageId))
                                    {
                                        FeatureImageId = mediaResult.Id;
                                    }
                                }

                                if (WeblogAddinConfiguration.Current.ReplacePostImagesWithOnlineUrls)
                                {
                                    mmApp.Model.ActiveDocument.CurrentText =
                                        mmApp.Model.ActiveDocument.CurrentText
                                        .Replace($"]({origImageLink})", $"]({mediaResult.URL})")
                                        .Replace($"=\"{origImageLink}\"", $"=\"{mediaResult.URL}\"");
                                }
                            }
                        }
                        WindowUtilities.DoEvents();
                    }

                    html = doc.DocumentNode.OuterHtml;
                }
            }
            catch (Exception ex)
            {
                ErrorMessage = "Error posting images to Weblog: " + ex.GetBaseException().Message;
                mmApp.Log("Failed to post image to Weblog", ex);
                return(null);
            }

            return(html);
        }
        /// <summary>
        /// Parses each of the images in the document and posts them to the server.
        /// Updates the HTML with the returned Image Urls
        /// </summary>
        /// <param name="html">HTML that contains images</param>
        /// <param name="basePath">image file name</param>
        /// <param name="wrapper">blog wrapper instance that sends</param>
        /// <param name="metaData">metadata containing post info</param>
        /// <returns>update HTML string for the document with updated images</returns>
        private string SendImages(string html, string basePath,
                                  MetaWeblogWrapper wrapper)
        {
            // base folder name for uploads - just the folder name of the image
            var baseName = Path.GetFileName(basePath);

            baseName = FileUtils.SafeFilename(baseName).Replace(" ", "-");

            var doc = new HtmlDocument();

            doc.LoadHtml(html);
            try
            {
                // send up normalized path images as separate media items
                var images = doc.DocumentNode.SelectNodes("//img");
                if (images != null)
                {
                    foreach (HtmlNode img in images)
                    {
                        string imgFile = img.Attributes["src"]?.Value;
                        imgFile = StringUtils.UrlDecode(imgFile);

                        if (imgFile == null)
                        {
                            continue;
                        }

                        if (!imgFile.StartsWith("http://") && !imgFile.StartsWith("https://"))
                        {
                            if (!imgFile.Contains(":\\"))
                            {
                                imgFile = Path.Combine(basePath, imgFile.Replace("/", "\\"));
                            }

                            if (System.IO.File.Exists(imgFile))
                            {
                                var uploadFilename = Path.GetFileName(imgFile);
                                var media          = new MediaObject()
                                {
                                    Type = ImageUtils.GetImageMediaTypeFromFilename(imgFile),
                                    Bits = System.IO.File.ReadAllBytes(imgFile),
                                    Name = baseName + "/" + uploadFilename
                                };
                                var mediaResult = wrapper.NewMediaObject(media);
                                img.Attributes["src"].Value = mediaResult.URL;

                                // use first image as featured image
                                if (!DontInferFeaturedImage)
                                {
                                    if (string.IsNullOrEmpty(FeaturedImageUrl))
                                    {
                                        FeaturedImageUrl = mediaResult.URL;
                                    }
                                    if (string.IsNullOrEmpty(FeatureImageId))
                                    {
                                        FeatureImageId = mediaResult.Id;
                                    }
                                }
                            }
                        }
                        WindowUtilities.DoEvents();
                    }

                    html = doc.DocumentNode.OuterHtml;
                }
            }
            catch (Exception ex)
            {
                ErrorMessage = "Error posting images to Weblog: " + ex.Message;
                return(null);
            }

            return(html);
        }