/// <summary>
        /// Returns the .NET color that matches an element's background color.
        /// </summary>
        /// <param name="element"></param>
        /// <param name="detectImage">
        /// Takes background-image into account when looking for background color.
        /// This is positionally sensitive so if you're not sure if your elements
        /// are in the "correct" positions relative to each other (such as in
        /// Web Layout view) you may want to set this to false.
        /// </param>
        /// <param name="pageUrl">The URL that should be used to escape relative background image paths. Can be null.</param>
        /// <param name="defaultColor"></param>
        /// <returns></returns>
        public static Color GetBackgroundColor(IHTMLElement element, bool detectImage, string pageUrl, Color defaultColor)
        {
            Rectangle childBounds = new Rectangle(HTMLElementHelper.CalculateOffset(element), new Size(element.offsetWidth, element.offsetHeight));

            while (element != null)
            {
                IHTMLCurrentStyle style    = ((IHTMLElement2)element).currentStyle;
                string            colorStr = style.backgroundColor as string;
                if (!string.IsNullOrEmpty(colorStr) && colorStr != "transparent")
                {
                    if (colorStr == "inherit")
                    {
                        detectImage = false;
                    }
                    else
                    {
                        return(GetColorFromHexColor(ParseColorToHex(colorStr), defaultColor));
                    }
                }

                string imageUrl = style.backgroundImage;
                if (detectImage &&
                    !string.IsNullOrEmpty(imageUrl) &&
                    imageUrl != "none" &&
                    (style.backgroundRepeat == "repeat" || style.backgroundRepeat == "repeat-y"))
                {
                    StyleUrl styleUrl = new CssParser(imageUrl.Trim()).Next() as StyleUrl;
                    Trace.Assert(styleUrl != null, "Style URL could not be parsed");
                    if (styleUrl != null)
                    {
                        // If there's a background image URL...
                        string url = styleUrl.LiteralText;
                        using (Stream imageStream = GetStreamForUrl(url, pageUrl, element))
                        {
                            if (imageStream != null)
                            {
                                // ...and we were able to open/download it...
                                using (Image image = Image.FromStream(imageStream))
                                {
                                    if (image is Bitmap)
                                    {
                                        // ...and it's a Bitmap, then use it to get the color.
                                        Rectangle containerBounds = new Rectangle(HTMLElementHelper.CalculateOffset(element), new Size(element.offsetWidth, element.offsetHeight));
                                        Color     color           = GetColorFromBackgroundImage((Bitmap)image,
                                                                                                childBounds,
                                                                                                containerBounds,
                                                                                                style);
                                        // We can't use semi-transparent backgrounds, keep looking
                                        if (color.A == 255)
                                        {
                                            return(color);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                element = element.parentElement;
            }

            return(defaultColor);
        }