public ActionCatalogItemGetOfAbs(IExpressionViewModel expressionViewModel)
			: base("Get off $ []".Localize(), expressionViewModel)
		{
			WithLabel("Get".Localize());
			_amountEl = WithUserInput<decimal>(1, 0) as UserInputElement;
			WithLabel("$ off".Localize());
		}
		public ActionCatalogItemGiftNumItemOfSku(IExpressionViewModel expressionViewModel)
			: base("Gift [] of Sku []", expressionViewModel)
        {
            WithLabel("Gift");
            _quantityEl = WithUserInput(1, 0) as UserInputElement;
			_itemsInSKUEl = WithElement(new ItemsInSku(expressionViewModel)) as ItemsInSku;
        }
        public ActionRedirectAlert(IExpressionViewModel expressionViewModel)
            : base("Raise redirect alert", expressionViewModel)
		{
            WithLabel("Raise redirect alert\r\n  (use {CaseId}, {ContactId} as parameters)");
			_redirectEl = WithUserInput<string>(string.Empty) as UserInputElement;
			_redirectEl.DefaultValue = @"...?customerid={ContactId}&caseid={CaseId}";
		}
		public ConditionGeoTimeZone(IExpressionViewModel expressionViewModel)
            : base("Are browsing from a time zone -/+ offset from UTC []".Localize(), expressionViewModel)
		{
            WithLabel("Are browsing from a time zone -/+ offset from UTC ".Localize());
			CompareConditions = WithElement(new CompareConditions(true)) as CompareConditions;
            _valEl = WithCustomDict(GetTimeZonesArray(), new string[] { "select time zone".Localize() }) as UserInputElement;
		}
		public ActionCartGetOfRelSubtotal(IExpressionViewModel expressionViewModel)
			: base("Get [] % off cart subtotal".Localize(), expressionViewModel)
		{
			WithLabel("Get".Localize());
			_amountEl = WithUserInput(0, 0, 100) as UserInputElement;
			WithLabel("% off cart subtotal".Localize());
		}
		public ConditionGeoCountry(IExpressionViewModel expressionViewModel)
            : base("Are browsing from country []".Localize(), expressionViewModel)
		{
            WithLabel("Browsing from country ".Localize());
			_matchEl = WithElement(new MatchingContains(false, false)) as MatchingContains;
            _valEl = WithCustomDict(GetCountryList(expressionViewModel), new[] { "select country".Localize() }) as UserInputElement;
		}
		public ConditionGeoContinent(IExpressionViewModel expressionViewModel)
			: base("Are browsing from continent []", expressionViewModel)
		{
			WithLabel("Are browsing from continent ");
			_matchEl = WithElement(new MatchingContains(false, false)) as MatchingContains;
			_valEl = WithDict(new string[] { "Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "Oceania (Melanesia, Polinesia, Micronesia)", "South America" }, "select continent") as UserInputElement;
		}
		public ConditionGeoConnectionType(IExpressionViewModel expressionViewModel)
            : base("Are browsing from an internet connection type []".Localize(), expressionViewModel)
		{
            WithLabel("Are browsing from an internet connection type ".Localize());
			_matchEl = WithElement(new MatchingContains(false, false)) as MatchingContains;
            _valEl = WithDict(new string[] { "Ocx", "Tx", "Consumer satellite", "Frame relay", "Dsl" }, "select connection type".Localize()) as UserInputElement;
		}
 public ActionCartGetOfAbsSubtotal(IExpressionViewModel expressionViewModel)
     : base("Get $[] off cart subtotal", expressionViewModel)
 {
     WithLabel("Get $");
     _amountEl = WithUserInput<decimal>(0, 0) as UserInputElement;
     WithLabel("off cart subtotal");
 }
		public ConditionGeoIpRoutingType(IExpressionViewModel expressionViewModel)
			: base("Are browsing from an internet IP routing of type []".Localize(), expressionViewModel)
		{
			WithLabel("Are browsing from an internet IP routing of type ".Localize());
			_matchEl = WithElement(new MatchingContains(false, false)) as MatchingContains;
			_valEl = WithDict(new string[] { "Fixed", "Anonymizer", "Aol", "Aolpop", "Aoldialup", "Aolproxy", "Pop", "Superpop", "Stallite", "Cache proxy", "International proxy", "Regional proxy", "Mobile gateway", "None" }, "select routing type".Localize()) as UserInputElement;
		}
		public ActionCatalogItemGetOfRel(IExpressionViewModel expressionViewModel)
			: base("Get [] % off", expressionViewModel)
        {
            WithLabel("Get");
            _amountEl = WithUserInput(0, 0, 100) as UserInputElement;
            WithLabel("% off");
        }
		public ConditionGeoState(IExpressionViewModel expressionViewModel)
			: base("Are browsing from state/province []", expressionViewModel)
		{
			WithLabel("Browsing from state/province ");
			_matchEl = WithElement(new MatchingContains(false, false)) as MatchingContains;
			_stateEl = WithCustomDict(GetStatesList(expressionViewModel), new string[] { "select state" }) as UserInputElement;
		}
		public ConditionCodeContains(IExpressionViewModel expressionViewModel)
			: base("Entry code contains []", expressionViewModel)
		{
			WithLabel("Entry code contains ");
			//_skuEl = WithElement(new MatchContainsStringElement(expressionViewModel)) as MatchContainsStringElement;
			_skuEl = WithUserInput<string>(string.Empty) as UserInputElement;
			WithAvailableExcluding(() => new ItemsInSku(expressionViewModel));
		}
		public ConditionCategoryPropertyIs(IExpressionViewModel expressionViewModel)
			: base("Category property is []".Localize(), expressionViewModel)
		{
			WithLabel("Category property is ".Localize());
			_propEl = WithUserInput<string>(string.Empty) as UserInputElement;
			WithLabel(" and value is ".Localize());
			_propValueEl = WithUserInput<string>(string.Empty) as UserInputElement;
		}
		public ActionShippingGetOfRelShippingMethod(IExpressionViewModel expressionViewModel)
			: base("Get [] % off shipping", expressionViewModel)
        {
            WithLabel("Get");
			_amountEl = WithUserInput(0, 0, 100) as UserInputElement;
            WithLabel("% off shipping ");
			_shippingMethodSelectorEl = WithElement(new ShippingMethodSelector(expressionViewModel)) as ShippingMethodSelector;
        }
		public ConditionItemPropertyIs(IExpressionViewModel expressionViewModel)
			: base("Item property is [] ", expressionViewModel)
		{
			WithLabel("Item property is ");
			_propEl = WithUserInput<string>(string.Empty) as UserInputElement;
			WithLabel(" and value is ");
			_propValueEl = WithUserInput<string>(string.Empty) as UserInputElement;
		}
		public ActionCartItemGetFreeNumItemOfSku(IExpressionViewModel promotionViewModel)
            : base("Get [] free items of SKU []", promotionViewModel)
        {
            WithLabel("Get");
            _numItemEl = WithUserInput(1) as UserInputElement;
            WithLabel("free");
			_itemsInSkuEl = WithElement(new ItemsInSku(promotionViewModel)) as ItemsInSku;
        }
		public ActionShippingGetOfAbsShippingMethod(IExpressionViewModel expressionViewModel)
			: base("Get $[] off shipping".Localize(), expressionViewModel)
		{
			WithLabel("Get $ ".Localize());
			_amountEl = WithUserInput<decimal>(1, 0) as UserInputElement;
			WithLabel("off shipping ".Localize());
			_shippingMethodSelectorEl = WithElement(new ShippingMethodSelector(expressionViewModel)) as ShippingMethodSelector;
		}
		public ConditionCurrencyIs(IExpressionViewModel expressionViewModel)
			: base("Currency is []".Localize(), expressionViewModel)
		{
			WithLabel("Currency is ".Localize());

			var allCurrencies = GetAvailableCurrencies(expressionViewModel);
			var defaultCurrency = allCurrencies.Length > 0 ? allCurrencies[0] : null;
			_currencyEl = WithDict(allCurrencies, defaultCurrency) as UserInputElement;
		}
        public ActionCartItemGetOfAbsForNumInCategory(IExpressionViewModel expressionViewModel)
            : base("Get $[] off [] items in category []", expressionViewModel)
        {
            WithLabel("Get $");
            _amountEl = WithUserInput<decimal>(0, 0) as UserInputElement;
            WithLabel("off");
            _numItemEl = WithUserInput(1, 0) as UserInputElement;
			_itemsInCategoryEl = WithElement(new ItemsInCategory(expressionViewModel)) as ItemsInCategory;
            InitializeExcludings(expressionViewModel);
        }
		public ConditionLineItemTotal(IExpressionViewModel expressionViewModel)
			: base("Line item subtotal is []".Localize(), expressionViewModel)
		{
			WithLabel("Line item subtotal is ".Localize());
			ExactlyLeast = WithElement(new ExactlyLeast()) as ExactlyLeast;
			_lineItemTotalEl = WithUserInput<decimal>(0, 0) as UserInputElement;
			WithAvailableExcluding(() => new ItemsInCategory(expressionViewModel));
			WithAvailableExcluding(() => new ItemsInEntry(expressionViewModel));
			WithAvailableExcluding(() => new ItemsInSku(expressionViewModel));
		}
		public ActionCartItemGetOfRelForNum(IExpressionViewModel expressionViewModel)
			: base("Get []% off [] items".Localize(), expressionViewModel)
		{
			WithLabel("Get".Localize());
			_amountEl = WithUserInput(0, 0, 100) as UserInputElement;
			WithLabel("% off".Localize());
			_numItemEl = WithUserInput(1, 0) as UserInputElement;
			WithLabel("items".Localize());
			InitializeExcludings(expressionViewModel);
		}
		public ConditionAtNumItemsInCart(IExpressionViewModel expressionViewModel)
			: base("[] [] items are in shopping cart", expressionViewModel)
		{
			ExactlyLeast = WithElement(new ExactlyLeast()) as ExactlyLeast;
			_numItemEl = WithUserInput(1, 0) as UserInputElement;
			WithLabel("items in shopping cart");
			WithAvailableExcluding(() => new ItemsInCategory(expressionViewModel));
			WithAvailableExcluding(() => new ItemsInEntry(expressionViewModel));
			WithAvailableExcluding(() => new ItemsInSku(expressionViewModel));
		}
		public ConditionAtNumItemsOfEntryAreInCart(IExpressionViewModel expressionViewModel)
			: base("[] [] items of entry are in shopping cart", expressionViewModel)
        {
            ExactlyLeast = WithElement(new ExactlyLeast()) as ExactlyLeast;
            _numItemEl = WithUserInput(1, 0) as UserInputElement;
			_itemsInEntryEl = WithElement(new ItemsInEntry(expressionViewModel)) as ItemsInEntry;
            WithLabel("are in shopping cart");
            _itemsInEntryEl.SelectedItemChanged += SelectedEntryItemChanged;
            InitializeExcludings();
        }
		public ConditionCartSubtotalLeast(IExpressionViewModel expressionViewModel)
			: base("Cart subtotal is []", expressionViewModel)
		{
			WithLabel("Cart subtotal is ");
			ExactlyLeast = WithElement(new ExactlyLeast()) as ExactlyLeast;
			_subTotalEl = WithUserInput<decimal>(0, 0) as UserInputElement;
			WithAvailableExcluding(() => new ItemsInCategory(expressionViewModel));
			WithAvailableExcluding(() => new ItemsInEntry(expressionViewModel));
			WithAvailableExcluding(() => new ItemsInSku(expressionViewModel));
		}
		public ActionCartItemGetOfAbsForNum(IExpressionViewModel promotionViewModel)
			: base("Get $[] off [] items".Localize(), promotionViewModel)
		{
			WithLabel("Get $".Localize());
			_amountEl = WithUserInput<decimal>(0, 0) as UserInputElement;
			WithLabel("off".Localize());
			_numItemEl = WithUserInput(1, 0) as UserInputElement;
			WithLabel("items".Localize());
			InitializeExcludings(promotionViewModel);
		}
		public ActionCartItemGetOfRelForNumInCategory(IExpressionViewModel expressionViewModel)
			: base("Get [] % off [] items in category []".Localize(), expressionViewModel)
		{
			WithLabel("Get".Localize());
			_amountEl = WithUserInput(0, 0, 100) as UserInputElement;
			WithLabel(" % off".Localize());
			_numItemEl = WithUserInput(1, 0) as UserInputElement;
			_itemsInCategoryEl = WithElement(new ItemsInCategory(expressionViewModel)) as ItemsInCategory;
			InitializeExcludings(expressionViewModel);
		}
		public ActionCartItemGetOfAbsForNumInEntry(IExpressionViewModel expressionViewModel)
            : base("Get $[] off [] items of entry []", expressionViewModel)
        {
            WithLabel("Get $");
            _amountEl = WithUserInput<decimal>(1, 0) as UserInputElement;
            WithLabel("off");
            _numItemEl = WithUserInput(1) as UserInputElement;
			_itemsInEntryEl = WithElement(new ItemsInEntry(expressionViewModel)) as ItemsInEntry;
            _itemsInEntryEl.SelectedItemChanged += SelectedEntryItemChanged;
            InitializeExcludings();
        }
		public ActionCartItemGetOfRelForNumInEntry(IExpressionViewModel expressionViewModel)
			: base("Get [] % off [] items of entry []".Localize(), expressionViewModel)
		{
			WithLabel("Get".Localize());
			_amountEl = WithUserInput(0, 0, 100) as UserInputElement;
			WithLabel(" % off".Localize());
			_numItemEl = WithUserInput(1, 0) as UserInputElement;
			_itemsInEntryEl = WithElement(new ItemsInEntry(expressionViewModel)) as ItemsInEntry;
			_itemsInEntryEl.SelectedItemChanged += SelectedEntryItemChanged;
			InitializeExcludings();
		}
		public MatchStringElement(IExpressionViewModel expressionViewModel)
			: base(ElementLabel, expressionViewModel)
        {
			MatchingContains = WithElement(new MatchingContains(false, false)) as MatchingContains;
			_stringItemEl = WithUserInput(string.Empty) as UserInputElement;
        }
 public AgeElement(IExpressionViewModel expressionViewModel)
     : base(ElementLabel, expressionViewModel)
 {
     CompareConditions = WithElement(new CompareConditions(true)) as CompareConditions;
     _stringItemEl     = WithUserInput(18, 0) as UserInputElement;
 }
 public MatchContainsCaseStringElement(IExpressionViewModel expressionViewModel)
     : base(ElementLabel, expressionViewModel)
 {
     MatchingContains = WithElement(new MatchingContains(true, true)) as MatchingContains;
     _stringItemEl    = WithUserInput(string.Empty) as UserInputElement;
 }