/// <summary>
        /// Parses a Facebook feed
        /// </summary>
        public static FacebookFeed ParseFeed(JToken token, Dictionary<ulong, FacebookUser> people)
        {
            FacebookFeed result = new FacebookFeed();

              // Get id, time and actors (source and target)
              result.ID = (string)token["post_id"];
              result.Date = GeneralUtils.UnixTimestampToDateTime((Int64)token["created_time"]);
              if (tokenHasValue(token["actor_id"]))
            result.SourceUser = people[(UInt64)token["actor_id"]];
              if (tokenHasValue(token["target_id"]))
            result.TargetUser = people[(UInt64)token["target_id"]];

              // Get the core message
              if (tokenHasValue(token["message"]))
              {
            // Get the message tags, null if no tags
            result.MessageTags = getTags(token["message_tags"]);

            // Format our message
            result.Message = removeTabs((string)token["message"]);
            result.XmlMessage = RichTextBoxParser.
              ParseStringToXamlWithTags(result.Message, result.MessageTags);

            result.HasMessage = true; // Used for binding message visibility
              }

              // Description + Description tags + xmal description
              if (tokenHasValue(token["description"]))
              {
            // Get description tags, null if no tags
            result.DescriptionTags = getTags(token["description_tags"]);

            // Format description
            result.Description = (string)token["description"];
            result.XmlDescription = RichTextBoxParser.
              ParseStringToXamlWithTags(result.Description, result.DescriptionTags, true);
              }

              #region Facebook Properties (Like, Comment, Share)

              FacebookItem fbItem = new FacebookItem();

              // Likes
              if (tokenHasValue(token["likes"]["count"]))
              {
            fbItem.LikesCount = (int)token["likes"]["count"];

            // Grab friend likes
            IList<FacebookUser> flikes = new List<FacebookUser>();
            foreach (JToken person in token["likes"]["friends"].Children())
            {
              FacebookUser likedUser = null;
              people.TryGetValue((ulong)person, out likedUser);
              if (likedUser != null)
            flikes.Add(people[(ulong)person]);
            }
            if (flikes.Count > 0)
              fbItem.FriendLikes = flikes;
              }

              // Comments
              if (tokenHasValue(token["comments"]["count"]))
              {
            fbItem.CommentsCount = (int)token["comments"]["count"];

            // Grab some comments
            List<FacebookComment> comments = new List<FacebookComment>();
            foreach (JToken comment in token["comments"]["comment_list"])
              comments.Add(ParseFacebookComment(comment, ref people));
            if (comments.Count > 0)
              fbItem.Comments = comments;
              }

              result.SocialProperties = fbItem;

              #endregion

              #region Facebook Attachment

              // Attachment
              if (tokenHasValue(token["attachment"]) && token.HasValues)
              {
            FacebookAttachment fbAttach = new FacebookAttachment();
            JToken attachment = token["attachment"];

            // Figure out attachment type, href and name
            fbAttach.Type = FacebookAttachment.MediaType.Link; // Defaults to Link type
            if (tokenHasValue(attachment["href"]))
              fbAttach.Source = new Uri((string)attachment["href"]);
            if (tokenHasValue(attachment["name"]))
              fbAttach.Name = removeTabs((string)attachment["name"]);

            // Adjust values if we have some media in the attachment
            if (tokenHasValue(attachment["media"]) && attachment["media"].HasValues)
            {
              // We only use the first media for now
              JToken media = attachment["media"][0];

              // Adjust type
              if (tokenHasValue(media["type"]))
              {
            string type = (string)media["type"];
            if (type.Equals("photo")) fbAttach.Type = FacebookAttachment.MediaType.Image;
            else if (type.Equals("link")) fbAttach.Type = FacebookAttachment.MediaType.Link;
            // TODO: Treat videos as links for now
            else if (type.Equals("video")) fbAttach.Type = FacebookAttachment.MediaType.Link;
            else fbAttach.Type = FacebookAttachment.MediaType.NotSupported;
              }

              // Add Src
              if (tokenHasValue(media["src"]))
              {
            fbAttach.Icon = new Uri((string)media["src"]);
              }

              // Use media href instead of attachment href
              if (tokenHasValue(media["href"]))
              {
            fbAttach.Source = new Uri((string)media["href"]);

            // Adjust source if attachment is a facebook image
            if (fbAttach.Type == FacebookAttachment.MediaType.Image)
              fbAttach.Source = guessLargeImageFromIcon(fbAttach.Icon);
              }

              // Add description if this attachment is a link
              if (fbAttach.Type == FacebookAttachment.MediaType.Link &&
            tokenHasValue(attachment["description"]))
            fbAttach.Description = GeneralUtils.TrimWords((string)attachment["description"], maxLinkLength);
            }

            // Add this attachment to our feed if the attachment is valid (has a source)
            if (fbAttach.Source != null)
              result.Attachment = fbAttach;
              }

              #endregion

              // Finally add the current feedtype
              if (token["typle"] != null)
            result.FeedType = DetermineFacebookFeedType(result, (int)token["type"]);

              // Ignore any type of feeds that we currently do not support
              if ((result.Attachment != null && result.Attachment.Type == FacebookAttachment.MediaType.NotSupported) ||
            (result.Message == null && result.Description == null && result.Attachment == null))
            return null;

              return result;
        }
        /// <summary>
        /// Guess the type of the facebook feed from the content is has
        /// </summary>
        private static FeedType DetermineFacebookFeedType(FacebookFeed feed, int type)
        {
            FeedType result = FeedType.NotSupported;

              // Figure out type from supplied type param
              if      (type == 56 && feed.TargetUser != null)     result = FeedType.Conversation;
              else if ((type == 80 || type == 128 || type == 247) &&
                feed.Attachment != null)                  result = FeedType.Attachment;
              else if (type == 46 || feed.Message != null)        result = FeedType.Text;
              else                                                result = FeedType.Action;
              return result;
        }