public Money CalculatePriceReduction(IBasketLine basketLine) {
			
			/*
			 * Buy N, get one free
			 * i.e. Buy 4, pay for 3
			 */
			try {
				int quantity = basketLine.Quantity / (PromotionBase.AuxData + 1);

				//See how many multiples we have
				if (quantity * (PromotionBase.AuxData + 1) > basketLine.Quantity) {
					quantity--;
				}

				if (quantity > 0) {

					Money discount = new Money(basketLine.LinePrice);
					discount.RoundingMode = RoundingMode.AlwaysRoundUp;

					discount.Divide(basketLine.Quantity);
					discount.Multiply(quantity);

					return discount;

				} else {

					return new Money(0);

				}

			} catch (Exception e) {
				LogManager.GetLogger(GetType()).Error(e);
				return new Money(0);
			}
		}
		public void Process(IBasket basket) {

            IBasketLine[] lineArray = new IBasketLine[basket.BasketItemList.Count];
            basket.BasketItemList.CopyTo(lineArray, 0);

            Hashtable original = new Hashtable();

			foreach (IBasketLine line in lineArray) {
				
				if (original.ContainsKey(line.ItemCode)) {

                    IBasketLine orgLine = original[line.ItemCode] as IBasketLine;

                    if (orgLine != null) {
                        orgLine.Quantity += line.Quantity;
                        basket.RemoveItem(line);
                    }

				} else {
                    original.Add(line.ItemCode, line);
				}
			}
		}
		public Money CalculatePriceReduction(IBasketLine basketLine) {
			return GenericPromotion.CalculateDefaultPriceReduction(basketLine.LinePrice, basketLine.Quantity, PromotionBase);
		}
 protected string RenderItemTotal(IBasketLine line) {
     return HtmlFormatUtils.FormatMoney(line.LinePrice);
 }
        protected string RenderImageUrl(IBasketLine line) {

            return GetProductImageUrl(line.ItemCode);
        }
        public virtual void RemoveItem(IBasketLine item) {

            BasketItem bi = item as BasketItem;

            if (bi != null) {
                BasketItemList.Remove(bi);
            } else if (item != null) {
                RemoveItem(item.BasketItemID);
            }
        }
        public static string FormatUnitLinePrice(IBasketLine line, IBasketRules rules, ITextTranslator translator) {
			return FormatMoney(line.UnitLinePrice, rules, translator);
		}
		public static string FormatUnitLinePrice(IBasketLine line) {
			return FormatMoney(line.UnitLinePrice);
		}
		public void RemoveItem(IBasketLine item) {
			_basket.RemoveItem(item);
		}
 public void Save(IBasketLine basketLine) {
     _commonDao.SaveOrUpdateObject(basketLine as BasketItem);
 }