private void SetOffsets(Match offsetMatch)
 {
     var offset1 = offsetMatch.Groups["offset1"].Value;
     var offset2 = offsetMatch.Groups["offset2"].Value;
     var flip = false;
     if (offset1.ToLower() == "top" || offset1.ToLower() == "bottom" || offset2.ToLower() == "right" || offset2.ToLower() == "left")
         flip = true;
     var offset1Position = ",top,bottom,right,left,center".IndexOf(offset1.ToLower()) > 0
                               ? ParseStringOffset(offset1)
                               : ParseNumericOffset(offset1);
     var offset2Position = ",top,bottom,right,left,center".IndexOf(offset2.ToLower()) > 0
                               ? ParseStringOffset(offset2)
                               : ParseNumericOffset(offset2);
     if (flip)
     {
         if(offset2Position.PositionMode != PositionMode.Percent || offset2Position.Offset > 0) XOffset = offset2Position;
         if(offset1Position.PositionMode != PositionMode.Percent || offset1Position.Offset > 0) YOffset = offset1Position;
     }
     else
     {
         if(offset1Position.PositionMode != PositionMode.Percent || offset1Position.Offset > 0) XOffset = offset1Position;
         if(offset2Position.PositionMode != PositionMode.Percent || offset2Position.Offset > 0) YOffset = offset2Position;
     }
 }
 private Position ParseStringOffset(string offsetString)
 {
     var offset = new Position {PositionMode = PositionMode.Direction};
     Direction direction;
     Enum.TryParse(offsetString, true, out direction);
     offset.Direction = direction;
     return offset;
 }
        public BackgroundImageClass(string originalClassString, string parentCssUrl)
        {
            var offsetExplicitelySet = new bool[2];
            OriginalClassString = originalClassString;
            var match = Regex.ImageUrlPattern.Match(originalClassString);
            if (match.Success)
            {
                OriginalImageUrl = match.Groups["url"].Value.Replace("'", "").Replace("\"", "").Trim();
                if (OriginalImageUrl.Length > 0)
                {
                    ImageUrl = RelativeToAbsoluteUtility.ToAbsolute(parentCssUrl, OriginalImageUrl);
                    OriginalClassString = OriginalClassString.Replace(OriginalImageUrl, ImageUrl);
                }
            }
            var repeatMatch = Regex.RepeatPattern.Matches(originalClassString);
            if(repeatMatch.Count > 0)
            {
                Repeat = (RepeatStyle) Enum.Parse(typeof(RepeatStyle), repeatMatch[repeatMatch.Count-1].Value.Replace("-",""), true);
            }
            var widthMatch = Regex.WidthPattern.Matches(originalClassString);
            if (widthMatch.Count > 0)
                Width = Int32.Parse(widthMatch[widthMatch.Count - 1].Groups["width"].Value);

            var heightMatch = Regex.HeightPattern.Matches(originalClassString);
            if (heightMatch.Count > 0)
                Height = Int32.Parse(heightMatch[heightMatch.Count - 1].Groups["height"].Value);

            if(Width != null || Height != null)
            {
                var paddingMatches = Regex.PaddingPattern.Matches(originalClassString);
                if (paddingMatches.Count > 0)
                {
                    var padVals = new int[4];
                    foreach (var pads in from Match paddingMatch in paddingMatches select GetPadding(paddingMatch))
                    {
                        if (pads[0] != null)
                            padVals[0] = (int)pads[0];
                        if (pads[1] != null)
                            padVals[1] = (int)pads[1];
                        if (pads[2] != null)
                            padVals[2] = (int)pads[2];
                        if (pads[3] != null)
                            padVals[3] = (int)pads[3];
                    }
                    if(Width != null)
                    {
                        if (padVals[1] < 0 || padVals[3] < 0)
                            Width = null;
                        else
                            Width += (padVals[1] + padVals[3]);
                    }
                    if (Height != null)
                    {
                        if (padVals[0] < 0 || padVals[2] < 0)
                            Height = null;
                        else
                            Height += (padVals[0] + padVals[2]);
                    }
                }
            }

            var offsetMatches = Regex.OffsetPattern.Matches(originalClassString);
            if (offsetMatches.Count > 0)
            {
                foreach (Match offsetMatch in offsetMatches)
                    SetOffsets(offsetMatch, offsetExplicitelySet);
            }
            if(XOffset.PositionMode == PositionMode.Direction && !offsetExplicitelySet[1])
                YOffset = new Position(){PositionMode = PositionMode.Direction};
            if (YOffset.PositionMode == PositionMode.Direction && !offsetExplicitelySet[0])
                XOffset = new Position() { PositionMode = PositionMode.Direction };
        }
 private Position ParseNumericOffset(string offsetString)
 {
     var offset = new Position();
     if (string.IsNullOrEmpty(offsetString))
         return offset;
     if (offsetString.Length > 2 && "|in|cm|mm|em|ex|pt|pc".IndexOf(offsetString.Substring(offsetString.Length-2,2).ToLower()) > -1)
         return offset;
     var trim = 0;
     if (offsetString.EndsWith("%"))
     {
         trim = 1;
         offset.PositionMode = PositionMode.Percent;
     }
     else
         offset.PositionMode = PositionMode.Unit;
     if (offsetString.ToLower().EndsWith("px"))
         trim = 2;
     int units;
     Int32.TryParse(offsetString.Substring(0, offsetString.Length - trim), out units);
     offset.Offset = units;
     return offset;
 }
        private void SetOffsets(Match offsetMatch, bool[] offsetExplicitelySet)
        {
            var offset1 = offsetMatch.Groups["offset1"].Value;
            var offset2 = offsetMatch.Groups["offset2"].Value;
            var flip = false;
            if (offset1.ToLower() == "top" || offset1.ToLower() == "bottom" || offset2.ToLower() == "right" || offset2.ToLower() == "left")
                flip = true;
            var offset1Position = ",top,bottom,right,left,center".IndexOf(offset1.ToLower()) > 0
                                      ? ParseStringOffset(offset1)
                                      : ParseNumericOffset(offset1);
            var offset2Position = ",top,bottom,right,left,center".IndexOf(offset2.ToLower()) > 0
                                      ? ParseStringOffset(offset2)
                                      : ParseNumericOffset(offset2);
            if (flip)
            {
                if(offset2Position.PositionMode != PositionMode.Percent || offset2Position.Offset > 0) XOffset = offset2Position;
                if(offset1Position.PositionMode != PositionMode.Percent || offset1Position.Offset > 0) YOffset = offset1Position;
                if (offset1.Length > 0) offsetExplicitelySet[1] = true;
                if (offset2.Length > 0) offsetExplicitelySet[0] = true;
            }
            else
            {
                if(offset1Position.PositionMode != PositionMode.Percent || offset1Position.Offset > 0) XOffset = offset1Position;
                if(offset2Position.PositionMode != PositionMode.Percent || offset2Position.Offset > 0) YOffset = offset2Position;
                if (offset1.Length > 0) offsetExplicitelySet[0] = true;
                if (offset2.Length > 0) offsetExplicitelySet[1] = true;
            }

            Important = offsetMatch.ToString().ToLower().Contains("!important");
        }