static public PopupInfo FromDictionary(IDictionary<string, object> dictionary)
        {
            var popupInfo = new PopupInfo();

            if (dictionary.ContainsKey("title"))
                popupInfo.Title = dictionary["title"] as string;
            if (dictionary.ContainsKey("description"))
            {
                popupInfo.Description = dictionary["description"] as string;
                //If there is a description, then no attributes should be displayed.
                //User chose CUSTOM or SINGLE if the string is not empty
                if (!string.IsNullOrEmpty(popupInfo.Description))
                    popupInfo.hideAttributes = true;
                else
                    //User chose NONE in XO if the string is empty - however disregard as this is not true for JS Viewer
                    //The workaround is for the user to uncheck all attribute fields before selecting NONE in XO.
                    popupInfo.hideAttributes = false;
            }
            else
                popupInfo.hideAttributes = false;// If no description in Json, attributes should be displayed using field infos
            if (dictionary.ContainsKey("showAttachments"))
                popupInfo.ShowAttachments = Convert.ToBoolean(dictionary["showAttachments"]);
            if (dictionary.ContainsKey("fieldInfos"))
            {
                IEnumerable enumFieldInfos = dictionary["fieldInfos"] as IEnumerable;
                if (enumFieldInfos != null)
                {
                    List<FieldInfo> fieldInfos = new List<FieldInfo>();
                    foreach (IDictionary<string, object> item in enumFieldInfos)
                    {
                        FieldInfo fi = FieldInfo.FromDictionary(item);
                        if (fi != null)
                            fieldInfos.Add(fi);
                    }
                    popupInfo.FieldInfos = fieldInfos;
                }
            }
            if (dictionary.ContainsKey("mediaInfos"))
            {
                IEnumerable enumMediaInfos = dictionary["mediaInfos"] as IEnumerable;
                if (enumMediaInfos != null)
                {
                    List<MediaInfo> mediaInfos = new List<MediaInfo>();
                    foreach (IDictionary<string, object> item in enumMediaInfos)
                    {
                        MediaInfo mi = MediaInfo.FromDictionary(item);
                        if (mi != null)
                            mediaInfos.Add(mi);
                    }
                    popupInfo.MediaInfos = mediaInfos;
                }
            }

            return popupInfo;
        }
 private void GenerateImageMedia(StringBuilder sb, PopupInfo.MediaInfo mediaInfo)
 {
     if (mediaInfo.Value.ContainsKey("linkURL") &&
                              !string.IsNullOrEmpty(mediaInfo.Value["linkURL"] as string))
     {
         sb.AppendFormat("<HyperlinkButton NavigateUri=\"{0}\" TargetName=\"_blank\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">",
                         GetBinding(mediaInfo.Value["linkURL"]));
         sb.Append("<HyperlinkButton.Template>");
         sb.Append("<ControlTemplate>");
     }
     if (mediaInfo.Value.ContainsKey("sourceURL") &&
         !string.IsNullOrEmpty(mediaInfo.Value["sourceURL"] as string))
         sb.AppendFormat("<Image Source=\"{0}\" Stretch=\"Uniform\" HorizontalAlignment=\"Center\"" +
                         " VerticalAlignment=\"Center\" MaxHeight=\"145\" Margin=\"0,5,0,0\" />",
                         GetBinding(mediaInfo.Value["sourceURL"]));
     if (mediaInfo.Value.ContainsKey("linkURL") &&
         !string.IsNullOrEmpty(mediaInfo.Value["linkURL"] as string))
     {
         sb.Append("</ControlTemplate>");
         sb.Append("</HyperlinkButton.Template>");
         sb.Append("</HyperlinkButton>");
     }
 }