public Address(ContactInfo contactInfo)
        {
            if (contactInfo.InfoType != ContactInfoType.Address) throw new ArgumentException();

            City = JObject.Parse(contactInfo.Data)["city"].Value<String>();
            Country = JObject.Parse(contactInfo.Data)["country"].Value<String>();
            State = JObject.Parse(contactInfo.Data)["state"].Value<String>();
            Street = JObject.Parse(contactInfo.Data)["street"].Value<String>();
            Zip = JObject.Parse(contactInfo.Data)["zip"].Value<String>();
            Category = contactInfo.Category;
            CategoryName = contactInfo.CategoryToString();
            IsPrimary = contactInfo.IsPrimary;
        }
        public static bool TryParse(ContactInfo contactInfo, out Address res)
        {
            if (contactInfo.InfoType != ContactInfoType.Address)
            {
                res = null;
                return false;
            }

            try
            {
                res = Newtonsoft.Json.JsonConvert.DeserializeObject<Address>(contactInfo.Data);
                res.Category = contactInfo.Category;
                res.CategoryName = contactInfo.CategoryToString();
                res.IsPrimary = contactInfo.IsPrimary;
                return true;
            }
            catch (Exception)
            {
                res = null;
                return false;
            }
        }
 public ContactInfoWrapper(ContactInfo contactInfo)
     : base(contactInfo.ID)
 {
     InfoType = contactInfo.InfoType;
     Category = contactInfo.Category;
     CategoryName = contactInfo.CategoryToString();
     Data = contactInfo.Data;
     IsPrimary = contactInfo.IsPrimary;
     ID = contactInfo.ID;
 }
        protected String RenderContactInfo(ContactInfo contactInfo)
        {

            switch (contactInfo.InfoType)
            {
                case ContactInfoType.Email:
                    return String.Format("<a class='crm-email linkMedium' href='mailto:{0}'>{0}</a><span class='textMediumDescribe'> ({1})</span>", contactInfo.Data.HtmlEncode(), contactInfo.CategoryToString());
                case ContactInfoType.Phone:
                    return String.Format("<div class='crm-phone'>{0}<span class='textMediumDescribe'> ({1})</span></div>", contactInfo.Data.HtmlEncode(), contactInfo.CategoryToString());
                //case ContactInfoType.Website:
                //    return String.Format("<a class='crm-website' href='${0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.Skype:
                //    return String.Format("<div class='crm-skype'>{0}<span class='textSmallDescribe'> ({1})</span></div>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.Twitter:
                //    return String.Format("<a class='crm-twitter' href='http://twitter.com/{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.LinkedIn:
                //    return String.Format("<a class='crm-linkedin' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.Facebook:
                //    return String.Format("<a class='crm-facebook' href='http://facebook.com/{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.LiveJournal:
                //    return String.Format("<a class='rm-livejournal' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.MySpace:
                //    return String.Format("<a class='crm-myspace' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.GMail:
                //    return String.Format("<a class='crm-gmail' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.Blogger:
                //    return String.Format("<a class='crm-blogger' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.Yahoo:
                //    return String.Format("<a class='crm-yahoo' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.MSN:
                //    return String.Format("<a class='crm-msn' href='{0}' target='_blank'>${0}</a><span class='textSmallDescribe'> ({1})</span>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.ICQ:
                //    return String.Format("<div class='crm-icq'>{0}<span class='textSmallDescribe'> ({1})</span></div>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.Jabber:
                //    return String.Format("<div class='crm-jabber'>{0}<span class='textSmallDescribe'> ({1})</span></div>", contactInfo.Data, contactInfo.CategoryToString());
                //case ContactInfoType.AIM:
                //    return String.Format("<div class='crm-aim'>{0}<span class='textSmallDescribe'> ({1})</span></div>", contactInfo.Data, contactInfo.CategoryToString());
                case ContactInfoType.Address:
                    var address = JObject.Parse(contactInfo.Data);

                    var street = address[AddressPart.Street.ToString().ToLower()].ToString().HtmlEncode();
                    var city = address[AddressPart.City.ToString().ToLower()].ToString().HtmlEncode();
                    var state = address[AddressPart.State.ToString().ToLower()].ToString().HtmlEncode();
                    var country = address[AddressPart.Country.ToString().ToLower()].ToString().HtmlEncode();
                    var zip = address[AddressPart.Zip.ToString().ToLower()].ToString().HtmlEncode();

                    var text = street;
                    var tmp = String.IsNullOrEmpty(city) ? "" : city + ", ";

                    if (!String.IsNullOrEmpty(state)) { tmp += state + ", "; }
                    if (!String.IsNullOrEmpty(zip)) { tmp += zip; }
                    tmp = tmp.Trim().TrimEnd(',');
                    if (!String.IsNullOrEmpty(tmp)) { text = !String.IsNullOrEmpty(text) ? text + ",<br/>" + tmp : tmp; }
                    text = !String.IsNullOrEmpty(text) && !String.IsNullOrEmpty(country) ? text + ",<br/>" + country : text;
                    
                    var href = "";
                    if (!String.IsNullOrEmpty(street)) { href += street + ", "; }
                    if (!String.IsNullOrEmpty(city)) { href += city + ", "; }
                    if (!String.IsNullOrEmpty(state)) { href += state + ", "; }
                    if (!String.IsNullOrEmpty(zip)) { href += zip + ", "; }
                    if (!String.IsNullOrEmpty(country)) { href += country + ", "; }
                    href = href.Trim().TrimEnd(',');

                    return String.Format("<div class='crm-address'>{0}"
                        + "<span class='textMediumDescribe'> ({2})</span><br/>"
                        + "<a class='linkMedium' style='text-decoration: underline;' href='http://maps.google.com/maps?q={1}' target='_blank'>"
                        + CRMContactResource.ShowOnMap + "</a>"
                        + "</div>", text, href, contactInfo.CategoryToString());

                default:
                    return contactInfo.Data;
            }

        }