private static HtmlString BuildEditableImageTag <TModel>(
            GlassHtmlMvc <TModel> glassView,
            object item,
            bool isAdvancedImage,
            AdvancedImageField advancedImageField,
            bool useAdvancedImage,
            object parameters      = null,
            bool outputHeightWidth = false,
            float cropFactor       = 0)
        {
            if (!isAdvancedImage)
            {
                return(glassView.RenderImage(item, itemField => itemField, parameters, true, outputHeightWidth));
            }

            var attributes = new SafeDictionary <string>();
            var src        = advancedImageField.Src;

            if (useAdvancedImage)
            {
                src += $"?{advancedImageField.GetFocalPointParameters(advancedImageField.Width, cropFactor)}";
            }

            var protectedUrl = HashingUtils.ProtectAssetUrl(src);

            attributes.Add("src", protectedUrl);
            return(BuildImageTag(attributes, advancedImageField));
        }
        public override object GetField(Field field, SitecoreFieldConfiguration config, SitecoreDataMappingContext context)
        {
            var sitecoreImage = new ImageField(field);
            var defaultImage  = new AdvancedImageField();

            if (sitecoreImage.Value.IsEmptyOrNull())
            {
                return(defaultImage);
            }

            var xml = new XmlDocument();

            xml.LoadXml(sitecoreImage.Value);

            var resultImage = AdvancedImageHelper.ConvertMediaItemToField(xml.DocumentElement, field.Database);

            return(resultImage ?? defaultImage);
        }
        internal static AdvancedImageField ConvertMediaItemToField(XmlElement elementNode, Database database)
        {
            var id        = elementNode.GetAttribute("mediaid");
            var mediaItem = database.GetItem(new ID(id));

            if (mediaItem == null)
            {
                return(null);
            }

            var cropX    = elementNode.HasAttribute("cropx") ? elementNode.GetAttribute("cropx") : string.Empty;
            var cropY    = elementNode.HasAttribute("cropy") ? elementNode.GetAttribute("cropy") : string.Empty;
            var focusX   = elementNode.HasAttribute("focusx") ? elementNode.GetAttribute("focusx") : string.Empty;
            var focusY   = elementNode.HasAttribute("focusy") ? elementNode.GetAttribute("focusy") : string.Empty;
            var showFull = elementNode.HasAttribute("showFull") ? elementNode.GetAttribute("showFull") : "false";

            float.TryParse(cropX, NumberStyles.Any, CultureInfo.InvariantCulture, out var cx);
            float.TryParse(cropY, NumberStyles.Any, CultureInfo.InvariantCulture, out var cy);
            float.TryParse(focusX, NumberStyles.Any, CultureInfo.InvariantCulture, out var fx);
            float.TryParse(focusY, NumberStyles.Any, CultureInfo.InvariantCulture, out var fy);
            bool.TryParse(showFull, out var sf);

            var resultImage = new AdvancedImageField();

            resultImage.ShowFull    = sf;
            resultImage.CropX       = cx;
            resultImage.CropY       = cy;
            resultImage.FocusX      = fx;
            resultImage.FocusY      = fy;
            resultImage.Alt         = mediaItem["Alt"];
            resultImage.Border      = mediaItem["Border"];
            resultImage.Class       = mediaItem["Class"];
            resultImage.Width       = Convert.ToInt32(string.IsNullOrEmpty(mediaItem["Width"]) ? "0" : mediaItem["Width"]);
            resultImage.Height      = Convert.ToInt32(string.IsNullOrEmpty(mediaItem["Height"]) ? "0" : mediaItem["Height"]);
            resultImage.HSpace      = Convert.ToInt32(string.IsNullOrEmpty(mediaItem["HSpace"]) ? "0" : mediaItem["HSpace"]);
            resultImage.Language    = mediaItem.Language;
            resultImage.MediaId     = mediaItem.ID.ToGuid();
            resultImage.MediaExists = true;
            resultImage.Src         = MediaManager.GetMediaUrl(mediaItem);
            resultImage.VSpace      = Convert.ToInt32(string.IsNullOrEmpty(mediaItem["VSpace"]) ? "0" : mediaItem["VSpace"]);

            return(resultImage);
        }