anchor.diff:  		return left(description, find(".", description) - 1); // return just the first sentence
   	}
   	/*
  +	*  Gets a product description
  +	*/
  +	private string function generateProductDescription(){
  +		var description = generateLongDescription();
  +		// generate a heading
  +		description &= "<h3>" & generateTitle() & "</h3>";
  +		// generate a list
  +		description &= "<ul>";
  +		for(var i = 1; i <= randRange(5, 15); i++){
  +			description &= "<li>" & generateShortDescription() & "</li>";
  +		}
  +		description &= "<ul>";
  +		// generate another long description
  +		description &= generateLongDescription();
  +		return description;
  +	}
  +	/*
   	*  Gets a long description
   	*/
   	private string function generateLongDescription(){
   		var description = [];
  -		var paragraphs = randRange(1, 5); // use 1 to 5 paragraphs for the description
  +		var paragraphs = randRange(1, 3); // use 1 to 5 paragraphs for the description
   		for(var i = 1; i <= paragraphs; i++){
   			arrayAppend(description, variables.configs.paragraphs.paragraphs[randRange(1, arrayLen(variables.configs.paragraphs.paragraphs))]);
   		}
  
positive.code: 			doc['reviewer_name'] = generateName();
  			doc['reviewer_email'] = generateEmail(doc.reviewer_name);
  			doc['rating'] = generateRating();
  			doc['review'] = generateLongDescription();
  			doc['review_date'] = generateDate(end_date=now());
  			// write the review document
  			cb.set(arguments.product_id & "_review_" & review_id, doc);
  
negative.code: 	*/
  	private array function generateAlternateImages(){
  		var alternates = [];
  		var images = randRange(1, 3);
  		for(var i = 1; i <= images; i++){
  			arrayAppend(alternates, generateImage());
  		}
  