/// <summary>
		/// Creates a list of the top ten products in a category, wraps those
		/// product names and Amazon Urls in a Product object and appends the
		/// Constants.AMAZON_TAG_IDENTIFIER onto the Url of the product link.
		/// </summary>
		/// <param name="category">the category id used to locate the list of
		/// top ten products.</param>
		/// <returns>a list of Product objects</returns>
		/// <remarks>
		/// IMPORTANT: the value indicated in Constants.AMAZON_TAG_IDENTIFIER
		/// MUST be included in the DetailPageURL of every product.
		/// </remarks>
		public List<Product> GetTopTenProducts(Category category)
		{
			List<Product> ret = new List<Product>();

			// create a list of request parameters
			Dictionary<string, string> requestParameters = new Dictionary<string, string>();
			requestParameters.Add("Service", "AWSECommerceService");
			requestParameters.Add("Version", Constants.AMAZON_API_VERSION);
			requestParameters.Add("Operation", "BrowseNodeLookup");
			requestParameters.Add("BrowseNodeId", category.CategoryId);
			requestParameters.Add("ResponseGroup", "TopSellers");

			string signedUrl = Amazon.Sign(requestParameters);
			XNamespace ns = Constants.AMAZON_DOCUMENT_NAMESPACE;

			// contact Amazon retrieve the list of BrowseNodes as XML
			var root = XElement.Load(signedUrl);

			// get the list of all children under BrowseNodes/BrowseNode/Children/BrowseNode
			var nodes = from node in root
							.Element(ns + "BrowseNodes")
							.Element(ns + "BrowseNode")
							.Element(ns + "TopItemSet")
							.Descendants(ns + "TopItem")
						select new
						{
							Asin = node.Element(ns + "ASIN").Value,
							Title = node.Element(ns + "Title").Value,
							DetailPageURL = node.Element(ns + "DetailPageURL").Value
						};

			List<string> asins = new List<string>();
			foreach (var node in nodes)
			{
				string url = GetAmazonUrlWithTag(node.DetailPageURL);

				Product product =
					new Product(node.Title,
						new Uri(url),
						node.Asin);
				ret.Add(product);
				asins.Add(product.Asin);
			}

			return ret;
		}