Пример #1
0
        public static void KeywordSearchRequestStub(AmazonSearchArgument amazonSearchArgument)
        {
            KeywordRequest keywordRequest = new KeywordRequest();

            if (string.IsNullOrEmpty(amazonSearchArgument.AccessKeyID))
            {
                amazonSearchArgument.AccessKeyID = AccessKeyID;
            }

            System.Console.WriteLine(amazonSearchArgument);

            keywordRequest.devtag  = amazonSearchArgument.AccessKeyID;
            keywordRequest.keyword = amazonSearchArgument.Keyword;
            keywordRequest.locale  = amazonSearchArgument.Locale;
            keywordRequest.mode    = amazonSearchArgument.Mode;
            keywordRequest.page    = amazonSearchArgument.Page;
            keywordRequest.sort    = amazonSearchArgument.Sort;
            //keywordRequest.tag
            keywordRequest.type = amazonSearchArgument.Type;

            return;

            using (AmazonSearchService amazonSearchService = new AmazonSearchService())
            {
                try
                {
                    ProductInfo productInfo = amazonSearchService.KeywordSearchRequest(keywordRequest);
                    if (productInfo.Details.Length > 0)
                    {
                        System.Console.WriteLine(productInfo.Details[0].ProductName);
                        String url = productInfo.Details[0].ImageUrlLarge;
                        using (WebClient webClient = new WebClient())
                        {
                            webClient.DownloadFile(url, @"c:" + "/" + "Prince" + ".jpg");

                            /*
                             * WebRequest webReq = WebRequest.Create(productInfo.Details[0].ImageUrlMedium);
                             * WebResponse webResp = webReq.GetResponse();
                             * _image = Image.FromStream(webResp.GetResponseStream());*
                             */
                        }
                    }
                }
                catch (SoapException)
                {
                }
            }
        }
Пример #2
0
 public ProductInfo KeywordSearchRequest(KeywordRequest KeywordSearchRequest)
 {
     object[] results = this.Invoke("KeywordSearchRequest", new object[] {
         KeywordSearchRequest});
     return ((ProductInfo)(results[0]));
 }
Пример #3
0
 public System.IAsyncResult BeginKeywordSearchRequest(KeywordRequest KeywordSearchRequest, System.AsyncCallback callback, object asyncState)
 {
     return this.BeginInvoke("KeywordSearchRequest", new object[] {
         KeywordSearchRequest}, callback, asyncState);
 }
        /// <summary>
        /// Creates an AdWords Campaign grouped by category
        /// </summary>
        /// <param name="UseSandbox">Call the webservices in the test env</param>
        /// <param name="AffiliateSiteRefId"></param>
        /// <param name="Name">Campaign Name</param>
        /// <param name="Countries">Targeted countires</param>
        /// <param name="Languages">Targeted Languages</param>
        /// <param name="BudgetPeriod">The duration over which to spend the budgetAmount. For most developers, Daily is the only allowable option.</param>
        /// <param name="BudgetAmount">The amount of the budget in micros. Use budgetPeriod to set the duration over which to spend this amount.</param>
        /// <param name="KeywordMaxCpc">The default maximum cost-per-click bid for Keyword criteria in this ad group. See the note on bid amounts for more information on using this field.</param>
        /// <param name="MaxAdsPerGroup">Max Ads to create for each AdGroup</param>
        /// <param name="MaxAdvertiserCompetitionScale">The Max level of competition allowed from advertisers for keyword variations, on a scale from 0 to 5. Set to -1 if data is not available</param>
        /// <param name="MinSearchVolumeScale">The Min amount of searches to allowed related to keyword variations, on a scale from 0 to 5. Set to -1 if data is not available</param>
        /// <param name="DisplayUrl">Display Url to use for each Ad</param>
        /// <param name="destinationUrlPrefix">Destination Url Prefix for the destination Url of the Ads created.</param>
        /// <param name="UseKeywordVariations">Check for Keyword variations</param>
        /// <param name="MaxVariations">Max number of Keyword variations to use.</param>
        /// <param name="AdKeywordType">The type of keyword, indicating how it is targeted. This is not mutable after being set the first time. Values are: Broad=0,Phrase=1,Exact=2</param>
        //public void CreateCampaignGroupByProduct(bool UseSandbox, Guid AffiliateSiteRefId, string Name, String[] Countries, String[] Languages, int BudgetPeriod,
        //                                        Moneyv200906 BudgetAmount, long KeywordMaxCpc, int MaxAdGroups, int MaxAdvertiserCompetitionScale, int MinSearchVolumeScale,
        //                                        string DisplayUrl, string destinationUrlPrefix, bool GetKeywordsFromLandingPage, int MaxVariations, int AdKeywordType)
        //{
        //    // Create a user (reads headers from App.config file).
        //    AdWordsUser user = new AdWordsUser();
        //    if (UseSandbox)
        //        user.UseSandbox();	// use sandbox
        //    AccountService accountService = (AccountService)user.GetService(ApiServices.v13.AccountService);
        //    string[] accounts = accountService.getClientAccounts();
        //    try
        //    {
        //        #region Create Campaign
        //        // Create a new campaign with an ad group.  First create a
        //        // campaign, so we can get its id.
        //        Campaignv200906 newCampaign = new Campaignv200906();
        //        newCampaign.budget.amount = BudgetAmount;
        //        //newCampaign.budget.amountSpecified = true;
        //        newCampaign.budget.period = (BudgetPeriodv200906)Enum.ToObject(typeof(BudgetPeriodv200906), BudgetPeriod);
        //        newCampaign.budget.periodSpecified = true;
        //        // The campaign name is optional.  An error results if a campaign
        //        // of the same name already exists.
        //        newCampaign.name = Name;
        //        //TODO:newCampaign.networkTargeting = new NetworkType[] { NetworkType.SearchNetwork };
        //        // Target the campaign at
        //        CampaignServicev200906 campaignService = (CampaignServicev200906)user.GetService(ApiServices.v200906.CampaignService);
        //        // Set the campaign status to paused, we don't want to start
        //        // paying for this test.
        //        newCampaign.status = CampaignStatusv200906.PAUSED;
        //        // Add this campaign.  The campaign object is returned with ids
        //        // filled in.
        //        // Define an Add operation to add the campaign.
        //        CampaignOperation campaignOperation = new CampaignOperation();
        //        campaignOperation.operatorSpecified = true;
        //        campaignOperation.@operator = CampaignOperatorv200906.ADD;
        //        campaignOperation.operand = newCampaign;
        //        try
        //        {
        //            CampaignReturnValue results =
        //              campaignService.mutate(new CampaignOperation[] { campaignOperation });
        //            if (results != null && results.value != null && results.value.Length > 0)
        //            {
        //                Trace.TraceInformation("New campaign with name = \"{0}\" and id = " + "\"{1}\" was created.", results.value[0].name, results.value[0].id);
        //            }
        //        }
        //        catch (Exception ex)
        //        {
        //            throw new Exception("Failed to create campaign. " + ex.Message);
        //        }
        //        long campaignId = newCampaign.id;
        //        #endregion
        //        #region Targeting
        //        CampaignTargetServicev200906 service = (CampaignTargetServicev200906)user.GetService(ApiServices.v200906.CampaignTargetService);
        //        // Create a language target - for English language.
        //        LanguageTargetv200906 languageTarget = new LanguageTargetv200906();
        //        languageTarget.languageCode = "en";
        //        LanguageTargetList languageTargetList = new LanguageTargetList();
        //        languageTargetList.targets = new LanguageTargetv200906[] { languageTarget };
        //        languageTargetList.campaignId = campaignId;
        //        languageTargetList.campaignIdSpecified = true;
        //        // Create a country target - include US, exclude metrocode 743.
        //        CountryTargetv200906 countryTarget = new CountryTargetv200906();
        //        countryTarget.countryCode = "US";
        //        countryTarget.excludedSpecified = true;
        //        countryTarget.excluded = false;
        //        MetroTargetv200906 metroTarget = new MetroTargetv200906();
        //        metroTarget.excludedSpecified = true;
        //        metroTarget.excluded = true;
        //        metroTarget.metroCode = "743";
        //        GeoTargetList geoTargetList = new GeoTargetList();
        //        geoTargetList.targets = new GeoTargetv200906[] { countryTarget, metroTarget };
        //        geoTargetList.campaignId = campaignId;
        //        geoTargetList.campaignIdSpecified = true;
        //        // Create a network target - Google Search.
        //        NetworkTargetv200906 networkTarget1 = new NetworkTargetv200906();
        //        networkTarget1.networkCoverageTypeSpecified = true;
        //        networkTarget1.networkCoverageType = NetworkCoverageTypev200906.GOOGLE_SEARCH;
        //        NetworkTargetv200906 networkTarget2 = new NetworkTargetv200906();
        //        networkTarget2.networkCoverageTypeSpecified = true;
        //        networkTarget2.networkCoverageType = NetworkCoverageTypev200906.SEARCH_NETWORK;
        //        NetworkTargetList networkTargetList = new NetworkTargetList();
        //        networkTargetList.targets = new NetworkTargetv200906[] { networkTarget1, networkTarget2 };
        //        networkTargetList.campaignId = campaignId;
        //        networkTargetList.campaignIdSpecified = true;
        //        TargetList[] targets =
        //            new TargetList[] { languageTargetList, geoTargetList, networkTargetList };
        //        ArrayList campaignTargetOperations = new ArrayList();
        //        foreach (TargetList target in targets)
        //        {
        //            CampaignTargetOperation ops = new CampaignTargetOperation();
        //            ops.operatorSpecified = true;
        //            ops.@operator = CampaignTargetOperatorv200906.SET;
        //            ops.operand = target;
        //            campaignTargetOperations.Add(ops);
        //        }
        //        try
        //        {
        //            service.mutate((CampaignTargetOperation[])
        //              campaignTargetOperations.ToArray(typeof(CampaignTargetOperation)));
        //            Console.WriteLine("Geo, language, and network targeting were " +
        //                "successfully added to campaign id = \"{0}\".", campaignId);
        //        }
        //        catch (Exception ex)
        //        {
        //            Console.WriteLine("Failed to create campaign targeting. " +
        //                "Exception says \"{0}\"", ex.Message);
        //        }
        //        #endregion
        //        #region Create your Services
        //        //create your services
        //        List<SeedKeyword> keywords = new List<SeedKeyword>();
        //        AdService adService = (AdService)user.GetService(ApiServices.v200906.AdGroupAdService);
        //        KeywordToolService keywordToolService = (KeywordToolService)user.GetService(ApiServices.v13.KeywordToolService);
        //        AdGroupService adgroupService = (AdGroupService)user.GetService(ApiServices.v200906.AdGroupService);
        //        TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService(ApiServices.v13.TrafficEstimatorService);
        //        #endregion
        //        #region Enumerate thru all the categories
        //        //enumerate thru all the categories
        //        foreach (SiteCategory siteCategory in DataRepository.SiteCategoryProvider.GetByAffiliateSiteRefId(AffiliateSiteRefId))
        //        {
        //            int GroupAdCount = 0;
        //            DataRepository.SiteCategoryProvider.DeepLoad(siteCategory, true, DeepLoadType.IncludeChildren, typeof(TList<SiteCategoryCategoryMapping>));
        //            //////Create an ad group by site category
        //            ////AdGroup newAdGroup = new AdGroup();
        //            ////newAdGroup.name = siteCategory.SiteCategory;
        //            ////newAdGroup.keywordMaxCpc = KeywordMaxCpc;
        //            ////newAdGroup.keywordMaxCpcSpecified = true;
        //            ////// Associate this ad group with the newly created campaign.  Send
        //            ////// the request to add the new ad group.
        //            ////AdGroup myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup);
        //            ////long adGroupId = myAdGroup.id;
        //            #region Enumerate thru the category mappings to get the merchants
        //            //enumerate thru the categoru mappings to get the merchants
        //            foreach (SiteCategoryCategoryMapping catMap in siteCategory.SiteCategoryCategoryMappingCollection)
        //            {
        //                if (GroupAdCount >= MaxAdGroups)
        //                    break;
        //                DataRepository.SiteCategoryCategoryMappingProvider.DeepLoad(catMap, true, DeepLoadType.IncludeChildren, typeof(Category));
        //                DataRepository.CategoryProvider.DeepLoad(catMap.CategoryRefIdSource, true, DeepLoadType.IncludeChildren, typeof(TList<Merchant>));
        //                catMap.CategoryRefIdSource.MerchantCollection.Shuffle();
        //                foreach (Merchant merch in catMap.CategoryRefIdSource.MerchantCollection)
        //                {
        //                    if (GroupAdCount >= MaxAdGroups)
        //                        break;
        //                    DataRepository.MerchantProvider.DeepLoad(merch, true, DeepLoadType.IncludeChildren, typeof(TList<Product>));
        //                    //shuffle the products
        //                    merch.ProductCollection.Shuffle();
        //                    // enumerate thru all the merchant's products
        //                    foreach (Product prod in merch.ProductCollection)
        //                    {
        //                        //Create an ad group by site category
        //                        AdGroup newAdGroup = new AdGroup();
        //                        newAdGroup.name = siteCategory.Name + "-" + prod.Name;
        //                        newAdGroup.keywordMaxCpc = KeywordMaxCpc;
        //                        newAdGroup.keywordMaxCpcSpecified = true;
        //                        Trace.TraceInformation(prod.Name);
        //                        string cleanProdName = StringUtils.ScrubProdName(StringUtils.RemoveDuplicateWords(prod.Name));
        //                        string urlProdName = StringUtils.ScrubProdNameUrl(cleanProdName) + ".aspx";
        //                        int c = 0;
        //                        keywords.Clear();
        //                        string[] rawKeywords = new string[] { "" };
        //                        //check to see if the product record has keywords
        //                        //if (prod.Keywords != null)
        //                        //    rawKeywords = prod.Keywords.Split(',');
        //                        //if (rawKeywords.Length < 2)
        //                        rawKeywords = cleanProdName.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
        //                        foreach (string str in rawKeywords)
        //                        {
        //                            int tryInt = 0; //not empty, not a number, and not lower case
        //                            if (str.Trim() != "" && !int.TryParse(str.Trim(), out tryInt)) //&& !isLowerCase(str.Trim().Substring(0, 1).ToCharArray()[0])
        //                            {
        //                                SeedKeyword sw = new SeedKeyword();
        //                                sw.text = StringUtils.ScrubKeywords(str);
        //                                if (sw.text.Trim() != "")
        //                                {
        //                                    sw.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                    sw.negative = false;
        //                                    keywords.Add(sw);
        //                                    c++;
        //                                    if (c == 10) //TODO: fix this to get all words
        //                                        break;
        //                                }
        //                            }
        //                        }
        //                        //Create an add for each product
        //                        //
        //                        // IMPORTANT: create an ad before adding keywords!  Else the
        //                        // minCpc will have a higher value.
        //                        TextAd newTextAd = new TextAd();
        //                        newTextAd.headline = prod.Name;
        //                        while (newTextAd.headline.Length > 25)
        //                        {
        //                            newTextAd.headline = newTextAd.headline.Substring(0, newTextAd.headline.LastIndexOf(" ")).Substring(0, newTextAd.headline.Substring(0, newTextAd.headline.LastIndexOf(" ")).LastIndexOf(" "));
        //                        }
        //                        if (prod.Description.Length > 35)
        //                        {
        //                            string[] words = prod.Description.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
        //                            //descriptions are limited to 35 chars
        //                            foreach (string wrd in words)
        //                            {
        //                                string word = StringUtils.ScrubKeywords(wrd);
        //                                if (word.Trim() != "")
        //                                {
        //                                    if (newTextAd.description1 == null || (newTextAd.description1.Length + word.Length) < 35)
        //                                        newTextAd.description1 += word + " ";
        //                                    else if (newTextAd.description2 == null || (newTextAd.description2.Length + word.Length) < 35)
        //                                    {
        //                                        newTextAd.description1 = newTextAd.description1.PadRight(35);
        //                                        newTextAd.description2 += word + " ";
        //                                    }
        //                                    else
        //                                    {
        //                                        newTextAd.description2 = newTextAd.description2.PadRight(35);
        //                                        break;
        //                                    }
        //                                }
        //                            }
        //                            if (newTextAd.description2 == null || (newTextAd.description2.Length + string.Format("{0:c}", prod.Price).Length) < 35)
        //                                newTextAd.description2 += string.Format("{0:c}", prod.Price);
        //                        }
        //                        else
        //                        {
        //                            newTextAd.description1 = prod.Description;
        //                            newTextAd.description2 = string.Format("{0:c}", prod.Price);
        //                        }
        //                        newTextAd.displayUrl = DisplayUrl;
        //                        newTextAd.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                        //newTextAd.adGroupId = adGroupId;
        //                        //don't add it yet, there is a check below to see if it meets criteria
        //                        SeedKeyword[] keywordsArray = new SeedKeyword[] { new SeedKeyword() };
        //                        keywordsArray = keywords.ToArray();
        //                        //add variations if requested
        //                        if (GetKeywordsFromLandingPage)
        //                        {
        //                            SiteKeywordGroups siteKeywordGroups = keywordToolService.getKeywordsFromSite(newTextAd.destinationUrl, false, Languages, Countries);
        //                            int maxVariations = 0;
        //                            bool AdAdded = false;
        //                            // Associate this ad group with the newly created campaign.  Send
        //                            // the request to add the new ad group.
        //                            AdGroup myAdGroup; //= adgroupService.addAdGroup(campaignId, newAdGroup);
        //                            long adGroupId = 0; //= myAdGroup.id;
        //                            if (siteKeywordGroups.keywords != null)
        //                            {
        //                                foreach (SiteKeyword sitekeyword in siteKeywordGroups.keywords)
        //                                {
        //                                    //Trace.TraceInformation("Checking Site Keyword " + maxVariations + ":" + sitekeyword.text);
        //                                    // check for low compitition and high search volumes
        //                                    if (sitekeyword.advertiserCompetitionScale <= MaxAdvertiserCompetitionScale && sitekeyword.lastMonthSearchVolume >= MinSearchVolumeScale)
        //                                    {
        //                                        // Add keywords to the newly created ad group.
        //                                        //add keywords and url to dbs
        //                                        AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords();
        //                                        kws.KeywordRefId = Guid.NewGuid();
        //                                        kws.Keywords = sitekeyword.text;
        //                                        kws.Url = newTextAd.destinationUrl;
        //                                        kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                        DataRepository.KeywordsProvider.Insert(kws);
        //                                        CriterionService criterionService = (CriterionService)user.GetService(ApiServices.v200906.CampaignCriterionService);
        //                                        // check for low compitition and high search volumes
        //                                        #region Create Ad & Keywords from the Product Name
        //                                        if (!AdAdded)
        //                                        {
        //                                            // Associate this ad group with the newly created campaign.  Send
        //                                            // the request to add the new ad group.
        //                                            myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup);
        //                                            adGroupId = myAdGroup.id;
        //                                            newTextAd.adGroupId = adGroupId;
        //                                            // create the new add
        //                                            try
        //                                            {
        //                                                //we found a keyword that meets criteria so ad the new Ad.
        //                                                Ad[] myAds = adService.addAds(new Ad[] { newTextAd });
        //                                                GroupAdCount++;
        //                                                Trace.TraceInformation("Text ad" + GroupAdCount + ": " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                                //Trace.TraceInformation("Text ad: " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                                AdAdded = true;
        //                                            }
        //                                            catch
        //                                            {
        //                                                //do nothing
        //                                                Trace.TraceError("***Text ad Failed:" + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                            }
        //                                            //Add the Product name as a whole phrase
        //                                            try
        //                                            {
        //                                                //add keywords and url to dbs
        //                                                kws = new AffiliTrac.Entities.Keywords();
        //                                                kws.KeywordRefId = Guid.NewGuid();
        //                                                kws.Keywords = cleanProdName;
        //                                                kws.Url = newTextAd.destinationUrl;
        //                                                kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                                DataRepository.KeywordsProvider.Insert(kws);
        //                                                Keyword newKeyword = new Keyword();
        //                                                newKeyword.adGroupId = adGroupId;
        //                                                newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                                newKeyword.text = cleanProdName;
        //                                                //TODO: Use the Traffic Estimator to determine the
        //                                                // the maxCpc to use
        //                                                newKeyword.maxCpc = KeywordMaxCpc;
        //                                                newKeyword.maxCpcSpecified = true;
        //                                                newKeyword.criterionType = CriterionType.Keyword;
        //                                                newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                                Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                                newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                                criterionService.addCriteria(newCriteria);
        //                                            }
        //                                            catch
        //                                            {
        //                                                //do nothing
        //                                                Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName);
        //                                            }
        //                                            //Add the individual product name keywords
        //                                            foreach (SeedKeyword sk in keywordsArray)
        //                                            {
        //                                                try
        //                                                {
        //                                                    //add keywords and url to dbs
        //                                                    kws = new AffiliTrac.Entities.Keywords();
        //                                                    kws.KeywordRefId = Guid.NewGuid();
        //                                                    kws.Keywords = sk.text;
        //                                                    kws.Url = newTextAd.destinationUrl;
        //                                                    kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                                    DataRepository.KeywordsProvider.Insert(kws);
        //                                                    // Add keywords to the newly created ad group.
        //                                                    Keyword newKeyword = new Keyword();
        //                                                    newKeyword.adGroupId = adGroupId;
        //                                                    newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                                    newKeyword.text = sk.text;
        //                                                    //TODO: Use the Traffic Estimator to determine the
        //                                                    // the maxCpc to use
        //                                                    newKeyword.maxCpc = KeywordMaxCpc;
        //                                                    newKeyword.maxCpcSpecified = true;
        //                                                    newKeyword.criterionType = CriterionType.Keyword;
        //                                                    newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                                    Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                                    newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                                    criterionService.addCriteria(newCriteria);
        //                                                }
        //                                                catch
        //                                                {
        //                                                    //do nothing
        //                                                    Trace.TraceError("***Add Criteria Failed: Keyword" + sk.text);
        //                                                }
        //                                            }
        //                                        }
        //                                        #endregion
        //                                        #region Create keywords from the keyword suggestion gotten from the landing page
        //                                        try
        //                                        {
        //                                            Keyword newKeyword = new Keyword();
        //                                            newKeyword = new Keyword();
        //                                            newKeyword.adGroupId = adGroupId;
        //                                            newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                            newKeyword.text = sitekeyword.text;
        //                                            //TODO: Use the Traffic Estimator to determine the
        //                                            // the maxCpc to use
        //                                            newKeyword.maxCpc = KeywordMaxCpc;
        //                                            newKeyword.maxCpcSpecified = true;
        //                                            newKeyword.criterionType = CriterionType.Keyword;
        //                                            newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                            Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                            newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                            criterionService.addCriteria(newCriteria);
        //                                        }
        //                                        catch
        //                                        {
        //                                            //do nothing
        //                                            Trace.TraceError("***Add Criteria Failed: Keyword" + sitekeyword.text);
        //                                        }
        //                                        #endregion
        //                                    }
        //                                    maxVariations++;
        //                                    if (maxVariations > MaxVariations)
        //                                        break;
        //                                }
        //                            }
        //                            //check add variations for product name raw keywords
        //                            try
        //                            {
        //                                KeywordVariations keywordVariations = keywordToolService.getKeywordVariations(keywordsArray, true, Languages, Countries);
        //                                foreach (KeywordVariation keywordVariation in keywordVariations.moreSpecific)
        //                                {
        //                                    if (Languages[0].ToString() == keywordVariation.language && keywordVariation.advertiserCompetitionScale <= MaxAdvertiserCompetitionScale && keywordVariation.lastMonthSearchVolume >= MinSearchVolumeScale)
        //                                    {
        //                                        // Add keywords to the newly created ad group.
        //                                        //add keywords and url to dbs
        //                                        AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords();
        //                                        kws.KeywordRefId = Guid.NewGuid();
        //                                        kws.Keywords = keywordVariation.text;
        //                                        kws.Url = newTextAd.destinationUrl;
        //                                        kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                        DataRepository.KeywordsProvider.Insert(kws);
        //                                        CriterionService criterionService = (CriterionService)user.GetService(ApiServices.v200906.CampaignCriterionService);
        //                                        // check for low compitition and high search volumes
        //                                        #region Create Ad & Keywords from the Product Name
        //                                        if (!AdAdded)
        //                                        {
        //                                            // Associate this ad group with the newly created campaign.  Send
        //                                            // the request to add the new ad group.
        //                                            myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup);
        //                                            adGroupId = myAdGroup.id;
        //                                            newTextAd.adGroupId = adGroupId;
        //                                            // create the new add
        //                                            try
        //                                            {
        //                                                //we found a keyword that meets criteria so ad the new Ad.
        //                                                Ad[] myAds = adService.addAds(new Ad[] { newTextAd });
        //                                                GroupAdCount++;
        //                                                Trace.TraceInformation("Text ad" + GroupAdCount + ": " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                                //Trace.TraceInformation("Text ad: " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                                AdAdded = true;
        //                                            }
        //                                            catch
        //                                            {
        //                                                //do nothing
        //                                                Trace.TraceError("***Text ad Failed:" + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                            }
        //                                            //Add the Product name as a whole phrase
        //                                            try
        //                                            {
        //                                                //add keywords and url to dbs
        //                                                kws = new AffiliTrac.Entities.Keywords();
        //                                                kws.KeywordRefId = Guid.NewGuid();
        //                                                kws.Keywords = cleanProdName;
        //                                                kws.Url = newTextAd.destinationUrl;
        //                                                kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                                DataRepository.KeywordsProvider.Insert(kws);
        //                                                Keyword newKeyword = new Keyword();
        //                                                newKeyword.adGroupId = adGroupId;
        //                                                newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                                newKeyword.text = cleanProdName;
        //                                                //TODO: Use the Traffic Estimator to determine the
        //                                                // the maxCpc to use
        //                                                newKeyword.maxCpc = KeywordMaxCpc;
        //                                                newKeyword.maxCpcSpecified = true;
        //                                                newKeyword.criterionType = CriterionType.Keyword;
        //                                                newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                                Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                                newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                                criterionService.addCriteria(newCriteria);
        //                                            }
        //                                            catch (Exception ex)
        //                                            {
        //                                                //do nothing
        //                                                Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName + ex.Message);
        //                                            }
        //                                            //Add the individual product name keywords
        //                                            foreach (SeedKeyword sk in keywordsArray)
        //                                            {
        //                                                try
        //                                                {
        //                                                    //add keywords and url to dbs
        //                                                    kws = new AffiliTrac.Entities.Keywords();
        //                                                    kws.KeywordRefId = Guid.NewGuid();
        //                                                    kws.Keywords = sk.text;
        //                                                    kws.Url = newTextAd.destinationUrl;
        //                                                    kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                                    DataRepository.KeywordsProvider.Insert(kws);
        //                                                    // Add keywords to the newly created ad group.
        //                                                    Keyword newKeyword = new Keyword();
        //                                                    newKeyword.adGroupId = adGroupId;
        //                                                    newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                                    newKeyword.text = sk.text;
        //                                                    //TODO: Use the Traffic Estimator to determine the
        //                                                    // the maxCpc to use
        //                                                    newKeyword.maxCpc = KeywordMaxCpc;
        //                                                    newKeyword.maxCpcSpecified = true;
        //                                                    newKeyword.criterionType = CriterionType.Keyword;
        //                                                    newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                                    Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                                    newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                                    criterionService.addCriteria(newCriteria);
        //                                                }
        //                                                catch (Exception ex)
        //                                                {
        //                                                    //do nothing
        //                                                    Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName + ex.Message);
        //                                                }
        //                                            }
        //                                        }
        //                                        #endregion
        //                                        #region Create keywords from the keyword suggestion gotten from the landing page
        //                                        try
        //                                        {
        //                                            Keyword newKeyword = new Keyword();
        //                                            newKeyword = new Keyword();
        //                                            newKeyword.adGroupId = adGroupId;
        //                                            newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                            newKeyword.text = keywordVariation.text;
        //                                            //TODO: Use the Traffic Estimator to determine the
        //                                            // the maxCpc to use
        //                                            newKeyword.maxCpc = KeywordMaxCpc;
        //                                            newKeyword.maxCpcSpecified = true;
        //                                            newKeyword.criterionType = CriterionType.Keyword;
        //                                            newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                            Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                            newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                            criterionService.addCriteria(newCriteria);
        //                                        }
        //                                        catch (Exception ex)
        //                                        {
        //                                            //do nothing
        //                                            Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName + ex.Message);
        //                                        }
        //                                        #endregion
        //                                    }
        //                                }
        //                            }
        //                            catch
        //                            {//this call fails quite a bit so we need the try catch
        //                            }
        //                        }
        //                        else
        //                        {
        //                            #region Create Keywords from the Product Name Only
        //                            //  create the ad
        //                            // Associate this ad group with the newly created campaign.  Send
        //                            // the request to add the new ad group.
        //                            AdGroup myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup);
        //                            long adGroupId = myAdGroup.id;
        //                            newTextAd.adGroupId = adGroupId;
        //                            try
        //                            {
        //                                //we found a keyword that meets criteria so ad the new Ad.
        //                                Ad[] myAds = adService.addAds(new Ad[] { newTextAd });
        //                                GroupAdCount++;
        //                                Trace.TraceInformation("Text ad" + GroupAdCount + ": " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                                //Trace.TraceInformation("Text ad: " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                            }
        //                            catch
        //                            {
        //                                //do nothing
        //                                Trace.TraceError("***Text ad Failed:" + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2);
        //                            }
        //                            //Add the Product name as a whole phrase
        //                            CriterionService criterionService = (CriterionService)user.GetService(ApiServices.v200906.CampaignCriterionService);
        //                            //add keywords and url to dbs
        //                            AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords();
        //                            kws.KeywordRefId = Guid.NewGuid();
        //                            kws.Keywords = cleanProdName;
        //                            kws.Url = newTextAd.destinationUrl;
        //                            kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                            DataRepository.KeywordsProvider.Insert(kws);
        //                            try
        //                            {
        //                                Keyword newKeyword = new Keyword();
        //                                newKeyword.adGroupId = adGroupId;
        //                                newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                newKeyword.text = cleanProdName;
        //                                //TODO: Use the Traffic Estimator to determine the
        //                                // the maxCpc to use
        //                                newKeyword.maxCpc = KeywordMaxCpc;
        //                                newKeyword.maxCpcSpecified = true;
        //                                newKeyword.criterionType = CriterionType.Keyword;
        //                                newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                criterionService.addCriteria(newCriteria);
        //                            }
        //                            catch
        //                            {
        //                                //do nothing
        //                                Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName);
        //                            }
        //                            //Add the individual product name keywords
        //                            foreach (SeedKeyword sk in keywordsArray)
        //                            {
        //                                //add keywords and url to dbs
        //                                kws = new AffiliTrac.Entities.Keywords();
        //                                kws.KeywordRefId = Guid.NewGuid();
        //                                kws.Keywords = sk.text;
        //                                kws.Url = newTextAd.destinationUrl;
        //                                kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;
        //                                DataRepository.KeywordsProvider.Insert(kws);
        //                                try
        //                                {
        //                                    // Add keywords to the newly created ad group.
        //                                    Keyword newKeyword = new Keyword();
        //                                    newKeyword.adGroupId = adGroupId;
        //                                    newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType);
        //                                    newKeyword.text = sk.text;
        //                                    //TODO: Use the Traffic Estimator to determine the
        //                                    // the maxCpc to use
        //                                    newKeyword.maxCpc = KeywordMaxCpc;
        //                                    newKeyword.maxCpcSpecified = true;
        //                                    newKeyword.criterionType = CriterionType.Keyword;
        //                                    newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName;
        //                                    Criterion[] newCriteria = new Criterion[] { newKeyword };
        //                                    newCriteria[0].destinationUrl = newKeyword.destinationUrl;
        //                                    criterionService.addCriteria(newCriteria);
        //                                }
        //                                catch
        //                                {
        //                                    //do nothing
        //                                    Trace.TraceError("***Add Criteria Failed: Keyword" + sk.text);
        //                                }
        //                            }
        //                            #endregion
        //                        }
        //                        if (GroupAdCount >= MaxAdGroups)
        //                            break;
        //                    }
        //                }
        //            }
        //            #endregion
        //        }
        //        #endregion
        //        #region Log everything created
        //        AdGroup[] adGroups = adgroupService.getAllAdGroups(campaignId);
        //        foreach (AdGroup adGroup in adGroups)
        //        {
        //            Trace.TraceInformation("Ad group: " + adGroup.name);
        //            Ad[] ads = adService.getAllAds(new long[] { adGroup.id });
        //            foreach (Ad ad in ads)
        //            {
        //                if (ad is TextAd)
        //                {
        //                    TextAd textAd = (TextAd)ad;
        //                    Trace.TraceInformation("Text ad: " + textAd.headline + " Text Line1:" + textAd.description1 + " Text Line2:" + textAd.description2);
        //                }
        //            }
        //        }
        //        #endregion
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}
        /// <summary>
        /// CreateKeywordsByAffiliateSiteRefId
        /// </summary>
        /// <param name="CheckAgainstAdwordsAPI"></param>
        /// <param name="UseSandbox"></param>
        /// <param name="AffiliateSiteRefId"></param>
        /// <param name="destinationUrlPrefix"></param>
        /// <param name="MaxAdvertiserCompetitionScale"></param>
        /// <param name="MinSearchVolumeScale"></param>
        /// <param name="MaxEstimateCpc"></param>
        /// <param name="MinEstimateCpc"></param>
        /// <param name="MaxEstimateClicksPerDay"></param>
        /// <param name="MinEstimateClicksPerDay"></param>
        /// <param name="getVariations"></param>
        /// <param name="getSiteKeywords"></param>
        /// <param name="Languages"></param>
        /// <param name="Countries"></param>
        public VList<SiteCategoryKeywords> CreateKeywordsByAffiliateSiteRefId(bool CheckAgainstAdwordsAPI, bool UseSandbox, Guid AffiliateSiteRefId,
            bool getVariations, bool getSiteKeywords, int maxKeywordsPerEstimate, String[] Languages,
            String[] Countries, decimal maxApiUsageDollars)
        {
            // Create a user (reads headers from App.config file).
            AdWordsUser user = new AdWordsUser();

            VList<SiteCategoryKeywords> reserachList = new VList<SiteCategoryKeywords>();

            //get seo parameters
            SeoParameters seop = DataRepository.SeoParametersProvider.GetByAffiliateSiteRefId(AffiliateSiteRefId)[0];

            if (CheckAgainstAdwordsAPI)
            {
                if (UseSandbox)
                    user.UseSandbox();	// use sandbox

                AccountService accountService = (AccountService)user.GetService(ApiServices.v13.AccountService);
                string[] accounts = accountService.getClientAccounts();
            }

            try
            {
                #region Create your Services
                //create your services
                List<KeywordRequest> keywords = new List<KeywordRequest>();
                //List<SeedKeyword> keywordsForVariation = new List<SeedKeyword>();

                TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService(ApiServices.v13.TrafficEstimatorService);
                AdGroupAdServicev200906 adService = (AdGroupAdServicev200906)user.GetService(ApiServices.v200906.AdGroupAdService);

                KeywordToolService keywordToolService = (KeywordToolService)user.GetService(ApiServices.v13.KeywordToolService);
                AdGroupServicev200906 adgroupService = (AdGroupServicev200906)user.GetService(ApiServices.v200906.AdGroupService);

                #endregion

                #region Enumerate thru all the categories
                bool SiteCategoryKeywordMaxCntReached = false;
                int SiteCategoryKeywordMaxCnt = 0;
                int SiteCategoryAdMaxCnt = 0;
                int SiteCategoryKeywordCnt = 0;

                // calculate max values by budget
                CalculateKeywordCountsPerSiteCategoryByApiBudget(out SiteCategoryKeywordMaxCnt, out SiteCategoryAdMaxCnt);

                //enumerate thru all the categories
                foreach (SiteCategory siteCategory in DataRepository.SiteCategoryProvider.GetByAffiliateSiteRefId(AffiliateSiteRefId))
                {
                    if (SiteCategoryKeywordMaxCntReached)
                    {
                        SiteCategoryKeywordMaxCntReached = false;
                        SiteCategoryKeywordCnt = 0;
                    }

                    DataRepository.SiteCategoryProvider.DeepLoad(siteCategory, true, DeepLoadType.IncludeChildren, typeof(TList<SiteCategoryCategoryMapping>));

                    #region Enumerate thru the category mappings to get the merchants
                    //enumerate thru the categoru mappings to get the merchants
                    foreach (SiteCategoryCategoryMapping catMap in siteCategory.SiteCategoryCategoryMappingCollection)
                    {
                        if (SiteCategoryKeywordMaxCntReached)
                            break;

                        DataRepository.SiteCategoryCategoryMappingProvider.DeepLoad(catMap, true, DeepLoadType.IncludeChildren, typeof(Category));
                        DataRepository.CategoryProvider.DeepLoad(catMap.CategoryRefIdSource, true, DeepLoadType.IncludeChildren, typeof(TList<Merchant>));
                        catMap.CategoryRefIdSource.MerchantCollection.Shuffle();
                        foreach (Merchant merch in catMap.CategoryRefIdSource.MerchantCollection)
                        {
                            if (SiteCategoryKeywordMaxCntReached)
                                break;

                            DataRepository.MerchantProvider.DeepLoad(merch, true, DeepLoadType.IncludeChildren, typeof(TList<Product>));

                            //shuffle the products
                            merch.ProductCollection.Shuffle();

                            // enumerate thru all the merchant's products
                            foreach (Product prod in merch.ProductCollection)
                            {
                                if (SiteCategoryKeywordMaxCntReached)
                                    break;

                                Trace.TraceInformation(prod.Name);
                                //scrub the product name to extract the keywords
                                string cleanProdKeywords = StringUtils.ScrubProdName(StringUtils.RemoveDuplicateWords(prod.Name));

                                string urlProdRefId = siteCategory.ProductUrlPrefix + prod.ProductRefId.ToString();

                                keywords.Clear();

                                //create an array of keywords
                                string[] rawKeywords = new string[] { "" };
                                //seperate into individual keywords
                                rawKeywords = cleanProdKeywords.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                                List<string> cleanKeyword = new List<string>();
                                foreach (string str in rawKeywords)
                                {
                                    int tryInt = 0; //not empty, not a number, and not lower case
                                    if (str.Length > 2 && str.Trim() != "" && !int.TryParse(str.Trim(), out tryInt)) //&& !isLowerCase(str.Trim().Substring(0, 1).ToCharArray()[0])
                                    {
                                        cleanKeyword.Add(StringUtils.ScrubKeywords(str));
                                    }
                                }

                                //seperate into keywords phrases
                                //TODO: KeywordPhraseWordCount use this config
                                for (int i = 0; i < rawKeywords.Length - 1; i++)
                                {
                                    int tryInt = 0; //not empty, not a number, and not lower case
                                    if (rawKeywords[i].Length > 2 && rawKeywords[i].Trim() != "" && !int.TryParse(rawKeywords[i].Trim(), out tryInt) && rawKeywords[i + 1].Length > 2 && rawKeywords[i + 1].Trim() != "" && !int.TryParse(rawKeywords[i + 1].Trim(), out tryInt))
                                    {
                                        cleanKeyword.Add(StringUtils.ScrubKeywords(rawKeywords[i] + " " + StringUtils.ScrubKeywords(rawKeywords[i + 1])));
                                    }
                                }

                                //also add a key word for the entire product name
                                cleanKeyword.Add(prod.Name);

                                foreach (string keyword in cleanKeyword)
                                {
                                    if (DataRepository.KeywordsProvider.GetByUrlKeywords(urlProdRefId, keyword) == null)
                                    {
                                        //add keywords and url to dbs
                                        AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords();
                                        kws.KeywordRefId = Guid.NewGuid();
                                        kws.Keywords = keyword;
                                        kws.Url = urlProdRefId;
                                        kws.ProductRefId = prod.ProductRefId;
                                        kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId;

                                        DataRepository.KeywordsProvider.Insert(kws);
                                        SiteCategoryKeywordCnt += 1;

                                        if (SiteCategoryKeywordCnt >= SiteCategoryKeywordMaxCnt)
                                        {
                                            SiteCategoryKeywordMaxCntReached = true;
                                            break;
                                        }
                                    }
                                }
                            }

                        }
                    }
                    #endregion
                }
                #endregion

                #region Check Traffic Estimates for Keywords
                if (CheckAgainstAdwordsAPI)
                {
                    try
                    {
                        int apiUnitUsage = 0;
                        reserachList = DataRepository.SiteCategoryKeywordsProvider.GetDistinct(AffiliateSiteRefId);
                        foreach (SiteCategoryKeywords kw in reserachList)
                        {
                            //TODO: check usage
                            //if (apiUsage >= maxApiUsage)
                            //    break;

                            KeywordRequest sw = new KeywordRequest();
                            sw.text = kw.Keywords;

                            sw.type = kw.Keywords.IndexOf(' ') > 0 ? KeywordType.Phrase : KeywordType.Broad; //check to see if it's a phrase
                            sw.maxCpc = seop.MaxEstimateCpc;
                            sw.maxCpcSpecified = true;
                            sw.typeSpecified = true;
                            keywords.Add(sw);

                            #region Add Aditional Search types
                            //sw = new KeywordRequest();
                            //sw.text = StringUtils.ScrubKeywords(str);
                            //if (sw.text.Length > 2 && sw.text.Trim() != "")
                            //{
                            //    sw.type = KeywordType.Exact;
                            //    sw.maxCpc = 1000000;
                            //    sw.maxCpcSpecified = true;
                            //    sw.typeSpecified = true;

                            //    keywords.Add(sw);
                            //}

                            //sw = new KeywordRequest();
                            //sw.text = StringUtils.ScrubKeywords(str);
                            //if (sw.text.Length > 2 && sw.text.Trim() != "")
                            //{
                            //    sw.type = KeywordType.Phrase;
                            //    sw.maxCpc = 1000000;
                            //    sw.maxCpcSpecified = true;
                            //    sw.typeSpecified = true;

                            //    keywords.Add(sw);
                            //}
                            #endregion
                        }

                        // check traffic estimates 100 at a time
                        for (int i = 0; i < keywords.Count; i += maxKeywordsPerEstimate)
                        {
                            if (i >= keywords.Count)
                                break;

                            KeywordRequest[] keywordsRequestArray = new KeywordRequest[] { new KeywordRequest() };
                            keywordsRequestArray = keywords.GetRange(i, keywords.Count - i >= maxKeywordsPerEstimate ? maxKeywordsPerEstimate : keywords.Count - i).ToArray();
                            KeywordEstimate[] KeywordEstimates = null;

                            try
                            {
                                KeywordEstimates = trafficEstimatorService.estimateKeywordList(keywordsRequestArray);

                                foreach (KeywordRequest kr in keywordsRequestArray)
                                {
                                    Trace.TraceInformation("Accepted keyword :" + kr.text);
                                }

                                //apiUsage += DataRepository.PpcApiRequestTypesProvider.GetByName("").ApiUnitCostPerItem; //((decimal)keywordsRequestArray.Length * (decimal).20);

                                //Trace.TraceInformation("API Usage :" + apiUsage.ToString("{0:c}"));

                            }
                            catch (Exception ex)
                            {
                                //do nothing
                                Trace.TraceError("***Get Keyword Traffic Estimates Failed: " + ex.Message);
                                foreach (KeywordRequest kr in keywordsRequestArray)
                                {
                                    Trace.TraceInformation("Possible bad keyword :" + kr.text);
                                }

                                // TODO: now go thru and do them individually

                                continue;

                            }

                            if (KeywordEstimates.Length > 0)
                            {
                                int c = 0;
                                foreach (KeywordEstimate keywordEstimate in KeywordEstimates)
                                {
                                    //Trace.TraceInformation("Checking Site Keyword " + maxVariations + ":" + sitekeyword.text);
                                    // check for low compitition and high search volumes

                                    if (UseSandbox || (keywordEstimate.lowerClicksPerDay >= seop.MinEstimateClicksPerDay && keywordEstimate.lowerCpc <= seop.MaxEstimateCpc))
                                    {
                                        // mark MeetsSeoParm on all keyword records with this keyword
                                        TList<Keywords> updateList = DataRepository.KeywordsProvider.GetByKeywords(keywordsRequestArray[c].text);
                                        foreach (Keywords ukw in updateList)
                                        {
                                            ukw.MeetsSeoCriteria = true;
                                        }

                                        DataRepository.KeywordsProvider.Update(updateList);
                                    }

                                    c++;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //do nothing
                        Trace.TraceError("***Get Keyword Traffic Estimates Failed: " + ex.Message);
                    }
                }

                #endregion

                //go get the updated list again
                reserachList = DataRepository.SiteCategoryKeywordsProvider.GetDistinct(AffiliateSiteRefId);

                return reserachList;

            }
            catch (Exception ex)
            {
                Trace.TraceError("Error:" + ex.Message);
                throw ex;
            }
        }