Size FindSizeAttribute(string input)
        {
            Size size = new Size(_width, _height);

            if (string.IsNullOrEmpty(input))
                return size;

            try
            {
                RequiredAttribute[] attrWidth = new RequiredAttribute[] { new RequiredAttribute("width"), new RequiredAttribute("height") };
                IElementPredicate predicate = new OrPredicate(new BeginTagPredicate("embed", attrWidth), new BeginTagPredicate("object", attrWidth));
                HtmlExtractor ex = new HtmlExtractor(input);
                if (ex.Seek(predicate).Success)
                {
                    BeginTag tag = (BeginTag)ex.Element;
                    size = new Size(Convert.ToInt32(tag.GetAttributeValue("width"), CultureInfo.InvariantCulture), Convert.ToInt32(tag.GetAttributeValue("height"), CultureInfo.InvariantCulture));

                }
            }
            catch (Exception ex)
            {
                Trace.Fail("Exception thrown while trying to find video size: " + ex);
            }

            return size;
        }
        internal static IElementPredicate Parse(string criterion)
        {
            SimpleHtmlParser parser = new SimpleHtmlParser(criterion);
            Element el = parser.Next();
            if (el == null)
            {
                Trace.Fail("Criterion was null");
                throw new ArgumentException("Criterion was null");
            }
            if (parser.Next() != null)
            {
                Trace.Fail("Too many criteria");
                throw new ArgumentException("Too many criteria");
            }

            if (el is BeginTag)
            {
                BeginTag tag = (BeginTag)el;

                if (tag.HasResidue || tag.Unterminated)
                {
                    Trace.Fail("Malformed criterion");
                    throw new ArgumentException("Malformed criterion");
                }

                RequiredAttribute[] attributes = new RequiredAttribute[tag.Attributes.Length];
                for (int i = 0; i < attributes.Length; i++)
                    attributes[i] = new RequiredAttribute(tag.Attributes[i].Name, tag.Attributes[i].Value);
                return new BeginTagPredicate(tag.Name, attributes);
            }
            else if (el is EndTag)
            {
                return new EndTagPredicate(((EndTag)el).Name);
            }
            else if (el is Text)
            {
                return new TextPredicate(el.RawText);
            }
            else if (el is Comment)
            {
                return new CommentPredicate(el.RawText);
            }
            else
            {
                Trace.Fail("Invalid criterion \"" + criterion + "\"");
                throw new ArgumentException("Invalid criterion \"" + criterion + "\"");
            }
        }