public void Parse(JObject searchResultsJSONObject, SearchResultList searchResultList)
        {
            try 
            {
                JArray resultsJArray = searchResultsJSONObject.Value<JArray>("statuses");
                foreach (JObject resultJObject in resultsJArray)
                {
                    SearchResultItem resultItem = new SearchResultItem();
                    resultItem.Provider = ProviderEnum.Twitter;

                    string content = resultJObject.Value<string>("text");

                    if (content != null && !content.Contains("#"))
                    {
                        resultItem.Abstract = content.ParseTwitterURL().ParseTwitterUsername().ParseTwitterHashtag();

                        JObject userDataJObject = resultJObject.Value<JObject>("user");

                        string image = userDataJObject.Value<string>("profile_image_url");
                        resultItem.ImageURL = image;

                        string name = userDataJObject.Value<string>("name");
                        resultItem.Title = name;

                        string screenName = userDataJObject.Value<string>("screen_name");
                        string url = "http://www.twitter.com/" + screenName;
                        resultItem.URL = url;

                        string publishedDateValue = resultJObject.Value<string>("created_at");
                        if (publishedDateValue != null)
                        {
                            // format: Sun, 30 Oct 2011 19:54:11 +0000",(publishedDateValue, "ddd, dd MMM yyyy HH':'mm':'ss z");
                            // new format Mon Sep 24 03:35:21 +0000 2012
                            //publishedDateValue = publishedDateValue.Replace("+0000", "+0");
                            //DateTime publishedDate = DateParser.Parse(publishedDateValue, "ddd MMM HH':'mm':'ss z yyyy");
                            //resultItem.PublishedDate = publishedDate;
                        }

                        searchResultList.Add(resultItem);
                    }
                }
            }
            catch (Exception exception)
            {
                ErrorService.Log("TwitterSearchParser", "Search", searchResultList.ToString(), exception);
            }
        }
// INCORRECT RESULT
//{
//  "responseData": null,
//  "responseDetails": "Quota Exceeded.  Please see http://code.google.com/apis/websearch",
//  "responseStatus": 403
//}

// CORRECT RESULT
//        {
//  "responseData": {
//    "results": [
//      {
//        "GsearchResultClass": "GwebSearch",
//        "unescapedUrl": "http://en.wikipedia.org/wiki/Stefan_Savi%C4%87",
//        "url": "http://en.wikipedia.org/wiki/Stefan_Savi%25C4%2587",
//        "visibleUrl": "en.wikipedia.org",
//        "cacheUrl": "http://www.google.com/search?q=cache:HWRCbR1U9oEJ:en.wikipedia.org",
//        "title": "<b>Stefan Savi?</b> - Wikipedia, the free encyclopedia",
//        "titleNoFormatting": "Stefan Savi? - Wikipedia, the free encyclopedia",
//        "content": "<b>Stefan Savi?</b> (Cyrillic: ?????? ?????; born 8 January 1991) is a Montenegrin   footballer who plays for Manchester City in the Premier League. A centre-back <b>...</b>"
//      }
//    ],
//    "cursor": {
//      "resultCount": "55,500",
//      "pages": [
//        {
//          "start": "0",
//          "label": 1
//        }
//      ],
//      "estimatedResultCount": "55500",
//      "currentPageIndex": 0,
//      "moreResultsUrl": "http://www.google.com/search?oe=utf8&ie=utf8&source=uds&start=0&hl=en&q=Stefan+Savic",
//      "searchResultTime": "0.18"
//    }
//  },
//  "responseDetails": null,
//  "responseStatus": 200
//}


        public void Parse(JObject searchResultsJSONObject, SearchResultList searchResultList)
        {
            try 
            {
                JObject responseDataJObject = searchResultsJSONObject.Value<JObject>("responseData");
                if (responseDataJObject != null)
                {
                    JArray resultsJArray = responseDataJObject.Value<JArray>("results");
                    foreach (JObject resultJObject in resultsJArray)
                    {
                        SearchResultItem resultItem = new SearchResultItem();
                        resultItem.Provider = ProviderEnum.Google;

                        string title = resultJObject.Value<string>("titleNoFormatting");
                        resultItem.Title = TextCleaner.RemoveHtml(title);

                        string content = resultJObject.Value<string>("content");
                        resultItem.Abstract = TextCleaner.RemoveHtml(content);

                        string url = resultJObject.Value<string>("unescapedUrl");
                        resultItem.URL = TextCleaner.RemoveHtml(url);

                        string publisher = resultJObject.Value<string>("publisher");
                        if (publisher != null)
                        {
                            resultItem.Source = publisher;
                        }

                        string publishedDateValue = resultJObject.Value<string>("publishedDate");
                        if (publishedDateValue != null)
                        {
                            // format: Thu, 19 Nov 2009 13:05:26 -08:00
                            DateTime publishedDate = DateParser.Parse(publishedDateValue, "ddd, dd MMM yyyy HH':'mm':'ss zzz");
                            resultItem.PublishedDate = publishedDate;
                        }

                        searchResultList.Add(resultItem);

                    }
                }
            }
            catch (Exception exception)
            {
                ErrorService.Log("GoogleSearchParser", "Search", searchResultList.ToString(), exception);
            }
        }
        private SearchResultList SearchNews(SearchContext searchContext)
        {
            SearchResultList resultList = new SearchResultList();
            
            try
            {
                string query = searchContext.Query;
                //int page = searchContext.Page;
                //int count = searchContext.Count;
                //int start = (page - 1) * count;
                string accountKey = ConfigService.GetConfig(ConfigKeys.BING_API_KEY, "");

                BingSearchContainer bingContainer = new BingSearchContainer(new Uri("https://api.datamarket.azure.com/Bing/Search/News"));
                bingContainer.Credentials = new NetworkCredential(accountKey, accountKey);

                DataServiceQuery<NewsResult> newsQuery = bingContainer.News(query, "en-us", "strict", null, null, null, null, null);
                IEnumerable<NewsResult> newsResults = newsQuery.Execute();
                foreach (NewsResult result in newsResults)
                {
                    SearchResultItem searchResultItem = new SearchResultItem();
                    searchResultItem.Provider = ProviderEnum.Bing;
                    searchResultItem.Title = result.Title;
                    searchResultItem.URL = result.Url;
                    searchResultItem.Source = result.Source;
                    searchResultItem.PublishedDate = (DateTime) result.Date;
                    string abstractText = result.Description;
                    abstractText = TextCleaner.StripTag(abstractText, "<", ">"); // remove any html tags
                    abstractText = TextCleaner.RemoveHtml(abstractText);
                    searchResultItem.Abstract = abstractText;
                    resultList.Add(searchResultItem);

                }
            }
            catch (Exception exception)
            {
                ErrorService.Log("BingSearchService", "SearchNews", searchContext.ToString(), exception);
                if (exception.ToString().Contains("Insufficient balance"))
                {
                    hasInsufficientBalance = true;
                }
            }

            return resultList;
        }
        public void Parse(XmlDocument xmlDocument, SearchResultList searchResultList)
        {
            string urlTemplate = "http://farm{0}.staticflickr.com/{1}/{2}_{3}.jpg";

            try 
            {
                XmlNodeList resultNodes = xmlDocument.SelectNodes("rsp/photos/photo");
                if (resultNodes != null)
                {
                    foreach (XmlNode resultNode in resultNodes)
                    {
                        Console.WriteLine("resultNode");

                        SearchResultItem resultItem = new SearchResultItem();
                        resultItem.Provider = ProviderEnum.Flickr;

                        string id = resultNode.Attributes["id"].Value;
                        string secret = resultNode.Attributes["secret"].Value;
                        string server = resultNode.Attributes["server"].Value;
                        string farm = resultNode.Attributes["farm"].Value;
                        string title = resultNode.Attributes["title"].Value;
                        string url = string.Format(urlTemplate, farm, server, id, secret);

                        resultItem.ImageURL = url;
                        resultItem.Title = title;

                        Console.WriteLine(url);

                        searchResultList.Add(resultItem);
                    }
                }
            }
            catch (Exception exception)
            {
                ErrorService.Log("FlickrSearchParser", "Search", searchResultList.ToString(), exception);
            }
        }
        private SearchResultList SearchNews(SearchContext searchContext)
        {
            SearchResultList resultList = new SearchResultList();

            try
            {
                string query = searchContext.Query;
                int page = searchContext.Page;
                int count = searchContext.Count;
                int start = (page - 1) * count;
                string urlTemplate = "http://boss.yahooapis.com/ysearch/news/v1/{0}?appid={1}&start={2}&count={3}&orderby=date&age=7d&style=raw&format=xml";
                string api = ConfigService.GetConfig(ConfigKeys.YAHOO_API_KEY, "");

                string url = string.Format(urlTemplate, query, api, start, count);

                XmlDocument xmlDocument = new XMLConnector().GetXMLDocument(url);
                XmlNamespaceManager nsmanager = new XmlNamespaceManager(xmlDocument.NameTable);
                nsmanager.AddNamespace("default", "http://www.inktomi.com/");

                XmlNodeList resultNodes = xmlDocument.SelectNodes("default:ysearchresponse/default:resultset_news/default:result", nsmanager);
                if (resultNodes != null)
                {
                    foreach (XmlNode resultNode in resultNodes)
                    {
                        SearchResultItem resultItem = new SearchResultItem();
                        resultItem.Provider = ProviderEnum.Yahoo;

                        XmlNode titleNode = resultNode.SelectSingleNode("default:title", nsmanager);
                        if (titleNode != null)
                        {
                            resultItem.Title = titleNode.InnerText;
                        }

                        XmlNode abstractNode = resultNode.SelectSingleNode("default:abstract", nsmanager);
                        if (abstractNode != null)
                        {
                            string abstractText = abstractNode.InnerText;
                            abstractText = TextCleaner.StripTag(abstractText, "<", ">"); // remove any html tags
                            abstractText = TextCleaner.RemoveHtml(abstractText);
                            resultItem.Abstract = abstractText;
                        }

                        XmlNode urlNode = resultNode.SelectSingleNode("default:url", nsmanager);
                        if (urlNode != null)
                        {
                            resultItem.URL = urlNode.InnerText;
                        }

                        XmlNode sourceNode = resultNode.SelectSingleNode("default:source", nsmanager);
                        if (sourceNode != null)
                        {
                            resultItem.Source = sourceNode.InnerText;
                        }

                        XmlNode dateNode = resultNode.SelectSingleNode("default:date", nsmanager);
                        XmlNode timeNode = resultNode.SelectSingleNode("default:time", nsmanager);
                        if (dateNode != null && timeNode != null)
                        {
                            //format <date>2009/11/20</date><time>01:03:57</time> 
                            string dateString = dateNode.InnerText + " " + timeNode.InnerText + " +0";
                            if (dateString != null)
                            {
                                DateTime publishedDate = DateParser.Parse(dateString, "yyyy'/'MM'/'dd HH':'mm':'ss z");
                                resultItem.PublishedDate = publishedDate;
                            }
                        }

                        resultList.Add(resultItem);
                    }
                }
            }
            catch (Exception exception)
            {
                ErrorService.Log("YahooSearchService", "SearchNews", searchContext.ToString(), exception);
            }

            return resultList;
        }
        private SearchResultList SearchImages(SearchContext searchContext)
        {
            SearchResultList resultList = new SearchResultList();

            try
            {
                string query = searchContext.Query;
                //int page = searchContext.Page;
                //int count = searchContext.Count;
                //int start = (page - 1) * count;
                string accountKey = ConfigService.GetConfig(ConfigKeys.BING_API_KEY, "");

                BingSearchContainer bingContainer = new BingSearchContainer(new Uri("https://api.datamarket.azure.com/Bing/Search/Images/"));
                bingContainer.Credentials = new NetworkCredential(accountKey, accountKey);

                DataServiceQuery<ImageResult> webQuery = bingContainer.Image(query, "en-us", "strict", null, null, null);
                IEnumerable<ImageResult> imageResults = webQuery.Execute();
                foreach (ImageResult result in imageResults)
                {
                    SearchResultItem searchResultItem = new SearchResultItem();
                    searchResultItem.Provider = ProviderEnum.Bing;
                    searchResultItem.Title = result.Title;
                    searchResultItem.URL = result.MediaUrl;
                    searchResultItem.ImageURL = result.MediaUrl;
                    searchResultItem.Abstract = result.Title;
                    resultList.Add(searchResultItem);
                }
            }
            catch (Exception exception)
            {
                ErrorService.Log("BingSearchService", "SearchImages", searchContext.ToString(), exception);
                if (exception.ToString().Contains("Insufficient balance"))
                {
                    hasInsufficientBalance = true;
                }
            }

            return resultList;
        }