? .svn
? 448624.patch
? uc_discounts.admin_.inc__1.diff
? uc_discounts.install_0.diff
? uc_discounts.module_0.diff
? translations/.svn
Index: uc_discounts.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts_alt/uc_discounts/uc_discounts.admin.inc,v
retrieving revision 1.9
diff -u -p -r1.9 uc_discounts.admin.inc
--- uc_discounts.admin.inc	26 May 2009 01:45:13 -0000	1.9
+++ uc_discounts.admin.inc	4 Aug 2009 20:16:26 -0000
@@ -103,24 +103,89 @@ function uc_discounts_form($form_state, 
 		"#size" => 75,
 	);
 
-	$form["qualifying_type"] = array(
+	$form["can_be_combined_with_other_discounts"] = array(
+		"#type" => "checkbox",
+		"#title" => t("Can be combined with other discounts"),
+		"#description" => t("Whether or not this discount will be applied if other discounts are."),
+		"#default_value" => isset($form_state["values"]["can_be_combined_with_other_discounts"]) 
+			? $form_state["values"]["can_be_combined_with_other_discounts"] : CAN_BE_COMBINED_WITH_OTHER_DISCOUNTS_DEFAULT,
+	);
+
+	//Add custom weight range [-50, 50]
+	$options = array();
+	for ($i = -50; $i <= 50; $i++)
+		$options[$i] = $i;
+	$form["weight"] = array(
+		"#type" => "select",
+		"#title" => t("Weight"),
+		"#description" => t("Lighter discounts are applied to an order first. This value is unimportant if there are no discounts on discount line items."),
+		"#options" => $options,
+		"#default_value" => isset($form_state["values"]["weight"]) ? $form_state["values"]["weight"] : 0,
+	);
+
+	$has_expiration = isset($form_state["values"]["has_expiration"]) ? $form_state["values"]["has_expiration"] : HAS_EXPIRATION_DEFAULT;
+	$display_string = ($has_expiration) ? "" : " style='display:none'";
+
+	$expiration_container_id = "expiration-container-" . $seed;
+	$expiration_prefix = sprintf("<div id='%s' onclick='if ( jQuery(\"#%s input[type=\\\"checkbox\\\"]\").attr(\"checked\") )"
+		. "{ jQuery(\"#%s .expiration-container\").slideDown(); }"
+		. "else { jQuery(\"#%s .expiration-container\").slideUp(); }'>", 
+		$expiration_container_id, $expiration_container_id, $expiration_container_id, $expiration_container_id, $expiration_container_id, $expiration_container_id);
+
+	$form["expiration_header"] = array(
+		"#type" => "hidden",
+		"#prefix" => $expiration_prefix,
+	);
+
+	$form["has_expiration"] = array(
+		"#type" => "checkbox",
+		"#title" => t("Discount expires"),
+		"#description" => t("Whether or not this discount rule will expire on a given date."),
+		"#default_value" => $has_expiration,
+	);
+
+	$expiration = isset($form_state["values"]["expiration"]) 
+		? $form_state["values"]["expiration"] : time();
+	$form["expiration"] = array(
+		"#type" => "date_popup",
+		"#date_type" => "DATE_UNIX",
+		"#title" => t("Discount expiration")
+			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
+		"#description" => t("Date and time when the discount expires."),
+		"#default_value" => date("Y-m-d H:i:s", $expiration),
+		"#prefix" => sprintf("<div class='expiration-container'%s>", $display_string),
+		"#suffix" => "</div>",
+	);
+
+	$form["expiration_footer"] = array(
+		"#type" => "hidden",
+		"#suffix" => "</div>",
+	);
+
+	$form["qualifications"] = array(
+		"#type" => "fieldset",
+		"#title" => t("Conditions of Qualification"),
+		"#collapsible" => TRUE,
+		"#description" => t("Carts qualify for a discount based upon these conditions."),
+	);
+
+	$form["qualifications"]["qualifying_type"] = array(
 		"#type" => "select",
-		"#title" => t("Qualifying type"),
-		"#description" => t("The amount used to determine if a cart qualifies for this discount."),
+		"#title" => t("Qualification type"),
+		"#description" => t("The type of qualification used to determine if a cart qualifies for this discount."),
 		"#options" => qualifying_type_options(),
 		"#default_value" => $form_state["values"]["qualifying_type"],
 	);
 
-	$form["qualifying_amount"] = array(
+	$form["qualifications"]["qualifying_amount"] = array(
 		"#type" => "textfield",
-		"#title" => t("Qualifying amount"),
-		"#description" => t("The amount required to qualify for the discount.	E.g. 50 (for $50), 5 (for 5 items).  Remember for a discount like 'buy 4 get 1 free' the qualifying amount is '5'."),
+		"#title" => t("Qualification amount"),
+		"#description" => t("The amount of qualification type required. E.g. 50 (for $50), 5 (for 5 items). Remember for a discount like 'buy 4 get 1 free' the qualifying amount is '5'."),
 		"#default_value" => $form_state["values"]["qualifying_amount"],
 		"#size" => 15,
 		"#required" => TRUE,
 	);
 
-
 	$has_qualifying_amount_max = isset($form_state["values"]["has_qualifying_amount_max"]) ? $form_state["values"]["has_qualifying_amount_max"] : HAS_QUALIFYING_AMOUNT_MAX_DEFAULT;
 	$display_string = ($has_qualifying_amount_max) ? "" : " style='display:none'";
 
@@ -132,12 +197,12 @@ function uc_discounts_form($form_state, 
 		$qualifying_amount_max_container_id, $qualifying_amount_max_container_id, 
 		$qualifying_amount_max_container_id, $qualifying_amount_max_container_id);
 
-	$form["qualifying_amount_max_header"] = array(
+	$form["discount_set"]["qualifying_amount_max_header"] = array(
 		"#type" => "hidden",
 		"#prefix" => $qualifying_amount_max_prefix,
 	);
 
-	$form["has_qualifying_amount_max"] = array(
+	$form["discount_set"]["has_qualifying_amount_max"] = array(
 		"#type" => "checkbox",
 		"#title" => t("Has max qualifying amount."),
 		"#description" => t("Whether or not discount contains maximum qualifying amount."),
@@ -148,7 +213,7 @@ function uc_discounts_form($form_state, 
 	$qualifying_amount_max = $form_state["values"]["role_ids"];
 
 	//Create qualifying_amount_max form element
-	$form["qualifying_amount_max"] = array(
+	$form["discount_set"]["qualifying_amount_max"] = array(
 		"#type" => "textfield",
 		"#title" => t("Maximum qualifying amount"),
 		"#description" => t("Maximum amount to NOT exceed to qualify for the discount.  E.g. 50 (for $50), 5 (for 5 items)."),
@@ -159,13 +224,19 @@ function uc_discounts_form($form_state, 
 		"#suffix" => "</div>",
 	);
 
-	$form["qualifying_amount_max_footer"] = array(
+	$form["discount_set"]["qualifying_amount_max_footer"] = array(
 		"#type" => "hidden",
 		"#suffix" => "</div>",
 	);
 
+	$form["discount_set"] = array(
+		"#type" => "fieldset",
+		"#title" => t("Discount Application"),
+		"#description" => t("Details of the discount to apply"),
+		"#collapsible" => TRUE,
+	);
 
-	$form["discount_type"] = array(
+	$form["discount_set"]["discount_type"] = array(
 		"#type" => "select",
 		"#title" => t("Discount type"),
 		"#description" => t("Type of discount to apply."),
@@ -173,7 +244,7 @@ function uc_discounts_form($form_state, 
 		"#default_value" => $form_state["values"]["discount_type"],
 	);
 
-	$form["discount_amount"] = array(
+	$form["discount_set"]["discount_amount"] = array(
 		"#type" => "textfield",
 		"#title" => t("Discount amount"),
 		"#description" => t("The amount of discount.	E.g. 50 (for $50), 5 (for 5 items), or 0.05 (for 5%)"),
@@ -191,14 +262,14 @@ function uc_discounts_form($form_state, 
 		. "else { jQuery(\"#%s .codes-container\").slideUp(); }'>", 
 		$codes_container_id, $codes_container_id, $codes_container_id, $codes_container_id, $codes_container_id, $codes_container_id);
 
-	$form["codes_header"] = array(
+	$form["qualifications"]["codes_header"] = array(
 		"#type" => "hidden",
 		"#prefix" => $codes_prefix,
 	);
 
-	$form["requires_code"] = array(
+	$form["qualifications"]["requires_code"] = array(
 		"#type" => "checkbox",
-		"#title" => t("Require(s) code to activate discount."),
+		"#title" => t("Require code to activate discount."),
 		"#default_value" => $requires_code,
 	);
 
@@ -214,7 +285,7 @@ function uc_discounts_form($form_state, 
 		$codes_string = create_codes_string($codes);
 	}
 
-	$form["codes"] = array(
+	$form["qualifications"]["codes"] = array(
 		"#type" => "textarea",
 		"#title" => t("Discount codes")
 			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
@@ -225,7 +296,7 @@ function uc_discounts_form($form_state, 
 		"#suffix" => "</div></div>",
 	);
 
-	$form["codes_footer"] = array(
+	$form["qualifications"]["codes_footer"] = array(
 		"#type" => "hidden",
 		"#suffix" => "</div>",
 	);
@@ -234,19 +305,22 @@ function uc_discounts_form($form_state, 
 	$products_display_string = ($filter_type == FILTER_TYPE_PRODUCTS) ? "" : " style='display:none'";
 	$terms_display_string = ($filter_type == FILTER_TYPE_TERMS) ? "" : " style='display:none'";
 	$skus_display_string = ($filter_type == FILTER_TYPE_SKUS) ? "" : " style='display:none'";
+	$classes_display_string = ($filter_type == FILTER_TYPE_CLASS) ? "" : " style='display:none'";
 
 	$filter_type_container_id = "filter-type-container-" . $seed;
 	$filter_type_prefix = sprintf(
 		"<div id='%s' onclick='value = jQuery(\"#%s select\").val();"
-		. "if (value == %d) { jQuery(\"#%s .products-container\").slideDown(); jQuery(\"#%s .terms-container\").slideUp(); jQuery(\"#%s .skus-container\").slideUp(); }"
-		. "if (value == %d) { jQuery(\"#%s .products-container\").slideUp(); jQuery(\"#%s .terms-container\").slideDown(); jQuery(\"#%s .skus-container\").slideUp(); }"
-		. "if (value == %d) { jQuery(\"#%s .products-container\").slideUp(); jQuery(\"#%s .terms-container\").slideUp(); jQuery(\"#%s .skus-container\").slideDown(); }'>",
+		."if (value == %d) { jQuery(\"#%s .products-container\").slideDown(); jQuery(\"#%s .terms-container\").slideUp(); jQuery(\"#%s .skus-container\").slideUp(); jQuery(\"#%s .classes-container\").slideUp(); }"
+		."if (value == %d) { jQuery(\"#%s .products-container\").slideUp(); jQuery(\"#%s .terms-container\").slideDown(); jQuery(\"#%s .skus-container\").slideUp(); jQuery(\"#%s .classes-container\").slideUp(); }"
+		."if (value == %d) { jQuery(\"#%s .products-container\").slideUp(); jQuery(\"#%s .terms-container\").slideUp(); jQuery(\"#%s .skus-container\").slideDown(); jQuery(\"#%s .classes-container\").slideUp(); }"
+		."if (value == %d) { jQuery(\"#%s .products-container\").slideUp(); jQuery(\"#%s .terms-container\").slideUp(); jQuery(\"#%s .skus-container\").slideUp(); jQuery(\"#%s .classes-container\").slideDown(); }'>",
 		$filter_type_container_id, $filter_type_container_id, 
-		FILTER_TYPE_PRODUCTS, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id, 
-		FILTER_TYPE_TERMS,  $filter_type_container_id, $filter_type_container_id, $filter_type_container_id, 
-		FILTER_TYPE_SKUS,  $filter_type_container_id, $filter_type_container_id, $filter_type_container_id);
+		FILTER_TYPE_PRODUCTS, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id,
+		FILTER_TYPE_TERMS,  $filter_type_container_id, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id,
+		FILTER_TYPE_SKUS,  $filter_type_container_id, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id,
+		FILTER_TYPE_CLASS, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id, $filter_type_container_id);
 
-	$form["filter_type_header"] = array(
+	$form["discount_set"]["filter_type_header"] = array(
 		"#type" => "hidden",
 		"#prefix" => $filter_type_prefix,
 	);
@@ -256,10 +330,11 @@ function uc_discounts_form($form_state, 
 	$options[FILTER_TYPE_PRODUCTS] = t("Filter By Products");
 	$options[FILTER_TYPE_TERMS] = t("Filter By Terms");
 	$options[FILTER_TYPE_SKUS] = t("Filter By SKUs");
-	$form["filter_type"] = array(
+	$options[FILTER_TYPE_CLASS] = t("Filter by Class");
+	$form["discount_set"]["filter_type"] = array(
 		"#type" => "select",
 		"#title" => t("Filter Type"),
-		"#description" => t("Determine whether to filter by products, terms or SKUs."),
+		"#description" => t("Determine whether to filter by products, terms, SKUs, or class. Discount is applied to only these products."),
 		"#options" => $options,
 		"#default_value" => $filter_type,
 		"#required" => TRUE,
@@ -279,7 +354,7 @@ function uc_discounts_form($form_state, 
 	$options[ALL_PRODUCTS] = t("<All Products>");
 	while ( $row = db_fetch_object($result) )
 		$options[$row->nid] = $row->title . " (" . $row->model . ")";
-	$form["product_ids"] = array(
+	$form["discount_set"]["product_ids"] = array(
 		"#type" => "select",
 		"#title" => t("Products")
 			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
@@ -304,7 +379,7 @@ function uc_discounts_form($form_state, 
 	$options[ALL_TERMS] = t("<All Terms>");
 	while ( $row = db_fetch_object($result) )
 		$options[$row->tid] = $row->name;
-	$form["term_ids"] = array(
+	$form["discount_set"]["term_ids"] = array(
 		"#type" => "select",
 		"#title" => t("Terms")
 			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
@@ -329,7 +404,7 @@ function uc_discounts_form($form_state, 
 	$options[ALL_SKUS] = t("<All SKUs>");
 	while ( $row = db_fetch_object($result) )
 		$options[$row->model] = $row->model . " (" . $row->title . ")";
-	$form["skus"] = array(
+	$form["discount_set"]["skus"] = array(
 		"#type" => "select",
 		"#title" => t("SKUs")
 			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
@@ -341,7 +416,32 @@ function uc_discounts_form($form_state, 
 		"#suffix" => "</div>",
 	);
 
-	$form["filter_type_footer"] = array(
+	//Get current discount product classes
+	$classes = null;
+	if ( isset($form_state["values"]["classes"]) )
+		$classes = $form_state["values"]["classes"];
+	elseif ($is_edit)
+		$classes = get_classes_for_discount($discount_id, FALSE);
+
+	//Create Classes form element
+	$options = array();
+	$result = db_query("SELECT pc.pcid, pc.name FROM {uc_product_classes} pc ORDER BY pc.pcid");
+	$options[ALL_CLASSES] = t("<All Product Classes>");
+	while ( $row = db_fetch_object($result) )
+		$options[$row->pcid] = $row->pcid . " (" . $row->name . ")";
+	$form["discount_set"]["classes"] = array(
+		"#type" => "select",
+		"#title" => t("Classes")
+			.sprintf("<span title='".t("This field is required.")."' class='form-required'>*</span>"),
+		"#description" => t("Select all product classes that this discount applies to or &lt;All Classes&gt; to apply to all classes.  Selections are <b>not</b> recursive."),
+		"#options" => $options,
+		"#default_value" => $classes,
+		"#multiple" => TRUE,
+		"#prefix" => sprintf("<div class='classes-container'%s", $classes_display_string),
+		"#suffix" => "</div>",
+	);
+
+	$form["discount_set"]["filter_type_footer"] = array(
 		"#type" => "hidden",
 		"#suffix" => "</div>",
 	);
@@ -355,14 +455,14 @@ function uc_discounts_form($form_state, 
 		. "else { jQuery(\"#%s .roles-container\").slideUp(); }'>", 
 		$roles_container_id, $roles_container_id, $roles_container_id, $roles_container_id, $roles_container_id, $roles_container_id);
 
-	$form["roles_header"] = array(
+	$form["qualifications"]["roles_header"] = array(
 		"#type" => "hidden",
 		"#prefix" => $roles_prefix,
 	);
 
-	$form["has_role_filter"] = array(
+	$form["qualifications"]["has_role_filter"] = array(
 		"#type" => "checkbox",
-		"#title" => t("Filter based on roles."),
+		"#title" => t("Qualification by Role(s)."),
 		"#default_value" => $has_role_filter,
 	);
 
@@ -380,11 +480,11 @@ function uc_discounts_form($form_state, 
 	$options[ALL_ROLES] = t("<All Roles>");
 	while ( $row = db_fetch_object($result) )
 		$options[$row->rid] = $row->name;
-	$form["role_ids"] = array(
+	$form["qualifications"]["role_ids"] = array(
 		"#type" => "select",
 		"#title" => t("Roles")
 			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
-		"#description" => t("Select all roles this discount applies to or &lt;All Roles&gt; to apply to all roles."),
+		"#description" => t("Select all roles that this discount applies to or &lt;All Roles&gt; to apply to all roles."),
 		"#options" => $options,
 		"#default_value" => $role_ids,
 		"#multiple" => TRUE,
@@ -392,19 +492,35 @@ function uc_discounts_form($form_state, 
 		"#suffix" => "</div>",
 	);
 
-	$form["roles_footer"] = array(
-		"#type" => "hidden",
-		"#suffix" => "</div>",
+	$form["qualifications"]["roles_footer"] = array(
+		"#type" => "markup",
+		"#value" => "</div>",
 	);
 
-	$form["requires_single_product_to_qualify"] = array(
+	$form["qualifications"]["requires_single_product_to_qualify"] = array(
 		"#type" => "checkbox",
 		"#title" => t("Require single product to qualify."),
 		"#description" => t("Requires a single product to meet the qualifying requirements to receive discount.	Otherwise qualifying requirements may be met by the combination of selected products."),
 		"#default_value" => isset($form_state["values"]["requires_single_product_to_qualify"]) ? $form_state["values"]["requires_single_product_to_qualify"] : REQUIRES_SINGLE_PRODUCT_TO_QUALIFY_DEFAULT,
 	);
 
-	$form["max_times_applied"] = array(
+	//Create SKUs form element
+	$options = array();
+	$result = db_query("SELECT p.model, n.title FROM {uc_products} p, {node} n WHERE p.nid=n.nid ORDER BY p.model");
+	$options[NO_SKUS] = t("Select a single SKU...");
+	while ( $row = db_fetch_object($result) )
+		$options[$row->model] = $row->model . " (" . $row->title . ")";
+
+		$form["qualifications"]["required_product"] = array(
+		"#type" => "select",
+		"#title" => t("Required product"),
+		"#description" => t("Select a single product that the cart must contain."),
+		"#options" => $options,
+		"#default_value" => $form_state["values"]["required_product"],
+	);
+
+
+	$form["discount_set"]["max_times_applied"] = array(
 		"#type" => "textfield",
 		"#title" => t("Maximum times applied"),
 		"#description" => t("Number of times this discount can be applied to a single cart (0 for unlimited).  Does not apply to 'Percent off' discounts."),
@@ -414,15 +530,7 @@ function uc_discounts_form($form_state, 
 		"#required" => TRUE,
 	);
 
-	$form["can_be_combined_with_other_discounts"] = array(
-		"#type" => "checkbox",
-		"#title" => t("Can be combined with other discounts"),
-		"#description" => t("Whether or not this discount will be applied if other discounts are."),
-		"#default_value" => isset($form_state["values"]["can_be_combined_with_other_discounts"]) 
-			? $form_state["values"]["can_be_combined_with_other_discounts"] : CAN_BE_COMBINED_WITH_OTHER_DISCOUNTS_DEFAULT,
-	);
-
-	$form["max_uses"] = array(
+	$form["discount_set"]["max_uses"] = array(
 		"#type" => "textfield",
 		"#title" => t("Max uses"),
 		"#description" => t("Number of times this discount can be applied (0 for unlimited)."),
@@ -432,7 +540,7 @@ function uc_discounts_form($form_state, 
 		"#required" => TRUE,
 	);
 
-	$form["max_uses_per_user"] = array(
+	$form["discount_set"]["max_uses_per_user"] = array(
 		"#type" => "textfield",
 		"#title" => t("Max uses per user"),
 		"#description" => t("Number of times this discount can be applied to a particular user (0 for unlimited)."),
@@ -442,7 +550,7 @@ function uc_discounts_form($form_state, 
 		"#required" => TRUE,
 	);
 
-	$form["max_uses_per_code"] = array(
+	$form["discount_set"]["max_uses_per_code"] = array(
 		"#type" => "textfield",
 		"#title" => t("Max uses per code"),
 		"#description" => t("Number of times this discount can be applied to a particular code (0 for unlimited).  Note: if 'Max uses' (if set) still applies as overall maximum number of uses for this discount."),
@@ -452,45 +560,6 @@ function uc_discounts_form($form_state, 
 		"#required" => TRUE,
 	);
 
-	$has_expiration = isset($form_state["values"]["has_expiration"]) ? $form_state["values"]["has_expiration"] : HAS_EXPIRATION_DEFAULT;
-	$display_string = ($has_expiration) ? "" : " style='display:none'";
-
-	$expiration_container_id = "expiration-container-" . $seed;
-	$expiration_prefix = sprintf("<div id='%s' onclick='if ( jQuery(\"#%s input[type=\\\"checkbox\\\"]\").attr(\"checked\") )"
-		. "{ jQuery(\"#%s .expiration-container\").slideDown(); }"
-		. "else { jQuery(\"#%s .expiration-container\").slideUp(); }'>", 
-		$expiration_container_id, $expiration_container_id, $expiration_container_id, $expiration_container_id, $expiration_container_id, $expiration_container_id);
-
-	$form["expiration_header"] = array(
-		"#type" => "hidden",
-		"#prefix" => $expiration_prefix,
-	);
-
-	$form["has_expiration"] = array(
-		"#type" => "checkbox",
-		"#title" => t("Discount expires"),
-		"#description" => t("Whether or not this discount will be applied if other discounts are."),
-		"#default_value" => $has_expiration,
-	);
-
-	$expiration = isset($form_state["values"]["expiration"]) 
-		? $form_state["values"]["expiration"] : time();
-	$form["expiration"] = array(
-		"#type" => "date_popup",
-		"#date_type" => "DATE_UNIX",
-		"#title" => t("Discount expiration")
-			. sprintf("<span title='" . t("This field is required.") . "' class='form-required'>*</span>"),
-		"#description" => t("Date and time when the discount expires."),
-		"#default_value" => date("Y-m-d H:i:s", $expiration),
-		"#prefix" => sprintf("<div class='expiration-container'%s>", $display_string),
-		"#suffix" => "</div>",
-	);
-
-	$form["expiration_footer"] = array(
-		"#type" => "hidden",
-		"#suffix" => "</div>",
-	);
-
 	$is_published = isset($form_state["values"]["is_published"]) 
 		? $form_state["values"]["is_published"] : IS_PUBLISHED_DEFAULT;
 	$form["is_published"] = array(
@@ -500,17 +569,6 @@ function uc_discounts_form($form_state, 
 		"#default_value" => $is_published,
 	);
 
-	//Add custom weight range [-50, 50]
-	$options = array();
-	for ($i = -50; $i <= 50; $i++)
-		$options[$i] = $i;
-	$form["weight"] = array(
-		"#type" => "select",
-		"#title" => t("Weight"),
-		"#description" => t("Lighter discounts are applied to an order first. This value is unimportant if there are no discounts on discount line items."),
-		"#options" => $options,
-		"#default_value" => isset($form_state["values"]["weight"]) ? $form_state["values"]["weight"] : 0,
-	);
 
 	$form["submit"] = array( "#type" => "submit", "#value" => t("Submit") );
 
@@ -531,6 +589,12 @@ function uc_discounts_form_validate($for
 	    $has_errors = TRUE;
 	}
 
+	//Check for required_product if requires_single checked
+	if ($values["requires_single_product_to_qualify"] && empty($values["required_product"]))
+	{
+		form_set_error( "required_product", t("Please select a single SKU for 'Require single product to qualify'.") );
+		$has_errors = TRUE;
+	}
 
 	//Check qualifying_amount_max (if necessary)
 	if ($values["has_qualifying_amount_max"])
@@ -586,6 +650,14 @@ function uc_discounts_form_validate($for
 			$has_errors = TRUE;
 		}
 	}
+	elseif ($values["filter_type"] == FILTER_TYPE_CLASS)
+	{
+		if ( empty($values["classes"]) )
+		{
+			form_set_error( "classes", t("Product classes are required because of 'Filter Type' value") );
+			$has_errors = TRUE;
+		}
+	}
 	else
 	{
 		form_set_error( "filter_type", t("Invalid filter type value") );
@@ -640,6 +712,13 @@ function uc_discounts_form_submit($form,
 		if ( in_array(ALL_SKUS, $skus) )
 			$skus = array(ALL_SKUS);
 
+		$classes = ($form_state["values"]["filter_type"] == FILTER_TYPE_CLASS)
+			? $form_state["values"]["classes"] : array();
+
+		//If classes contain "all classes", insert only all Classes row (class=<ALL_CLASSES>)
+		if ( in_array(ALL_CLASSES, $classes) )
+			$classes = array(ALL_CLASSES);
+
 		$role_ids = ($form_state["values"]["has_role_filter"]) 
 			? $form_state["values"]["role_ids"] : array();
 
@@ -675,6 +754,7 @@ function uc_discounts_form_submit($form,
 				$form_state["values"]["filter_type"],
 				$form_state["values"]["has_role_filter"],
 				$form_state["values"]["requires_single_product_to_qualify"],
+				$form_state["values"]["required_product"],
 				$form_state["values"]["max_times_applied"],
 				$form_state["values"]["can_be_combined_with_other_discounts"],
 				$form_state["values"]["max_uses"],
@@ -706,6 +786,7 @@ function uc_discounts_form_submit($form,
 				$form_state["values"]["filter_type"],
 				$form_state["values"]["has_role_filter"],
 				$form_state["values"]["requires_single_product_to_qualify"],
+				$form_state["values"]["required_product"],
 				$form_state["values"]["max_times_applied"],
 				$form_state["values"]["can_be_combined_with_other_discounts"],
 				$form_state["values"]["max_uses"],
@@ -728,6 +809,9 @@ function uc_discounts_form_submit($form,
 			//Delete existing database SKUs
 			uc_discounts_skus_delete($discount_id);
 
+			//Delete existing database classes
+			uc_discounts_classes_delete($discount_id);
+
 			//Delete existing database roles
 			uc_discounts_roles_delete($discount_id);
 		}
@@ -773,6 +857,16 @@ function uc_discounts_form_submit($form,
 				uc_discounts_skus_insert($discount_id, $sku);
 			}
 		}
+		//Insert Classes (if necessary)
+		elseif ($form_state["values"]["filter_type"] == FILTER_TYPE_CLASS)
+		{
+			foreach ($classes as $class)
+			{
+firep($class,"class");
+				//Empty Class is ALL_CLASSES
+				uc_discounts_classes_insert($discount_id, $class);
+			}
+		}
 
 		//Insert roles
 		if ($form_state["values"]["has_role_filter"])
@@ -813,6 +907,7 @@ function uc_discounts_copy($original_dis
 		$discount->filter_type,
 		$discount->has_role_filter,
 		$discount->requires_single_product_to_qualify,
+		$discount->required_product,
 		$discount->max_times_applied,
 		$discount->can_be_combined_with_other_discounts,
 		$discount->max_uses,
@@ -843,6 +938,11 @@ function uc_discounts_copy($original_dis
 	foreach ($skus as $sku)
 		uc_discounts_skus_insert($discount_id, $sku);
 
+	//Copy discount's Classes
+	$classes = get_classes_for_discount($original_discount_id);
+	foreach ($classes as $class)
+		uc_discounts_classes_insert($discount_id, $class);
+
 	//Copy discount's roles
 	$role_ids = get_role_ids_for_discount($original_discount_id);
 	foreach ($role_ids as $role_id)
Index: uc_discounts.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts_alt/uc_discounts/uc_discounts.install,v
retrieving revision 1.8
diff -u -p -r1.8 uc_discounts.install
--- uc_discounts.install	27 May 2009 03:57:34 -0000	1.8
+++ uc_discounts.install	4 Aug 2009 20:16:26 -0000
@@ -96,6 +96,12 @@ function uc_discounts_schema()
 				"default" => 1,
 				"description" => t("Requires qualifying amount to come from a single product."),
 			),
+			"required_product" => array(
+				"type" => "varchar",
+				"length" => 255,
+				"not null" => TRUE,
+				"default" => "",
+			),
 			"max_times_applied" => array(
 				"type" => "int",
 				"not null" => TRUE,
@@ -277,6 +283,34 @@ function uc_discounts_skus_schema()
 	return $schema;
 }
 
+function uc_discounts_classes_schema()
+{
+	$schema = array();
+
+	$schema["uc_discounts_classes"] = array(
+		"fields" => array(
+			"discount_class_id" => array(
+				"type" => "serial",
+				"no null" => TRUE,
+			),
+			"discount_id" => array(
+				"type" => "int",
+				"not null" => TRUE,
+				"description" => t("The {uc_discounts}.discount_id of the discount."),
+			),
+			"class" => array(
+				"type" => "varchar",
+				"length" => 32,
+				"not null" => TRUE,
+				"description" => t("The {node_type}.type of the product being discounted."),
+			),
+		),
+		"primary key" => array("discount_class_id"),
+	);
+
+	return $schema;
+}
+
 function uc_discounts_roles_schema()
 {
 	$schema = array();
@@ -399,9 +433,15 @@ function uc_discounts_install()
 	drupal_install_schema("uc_discounts_roles");
 	drupal_install_schema("uc_discounts_uses");
 	drupal_install_schema("uc_discounts_order_codes");
+	drupal_install_schema("uc_discounts_classes");
 	
 	//Weight must be less than uc_payment's
 	db_query("UPDATE {system} SET weight=-10 WHERE name='uc_discounts'");
+
+	//Print out a nice message directing administrators towards the configuration screen.
+	drupal_set_message(st("UC Discounts (Alternative) settings are available under !link",
+		array("!link" => l("Administer > Store administration > Configuration", "admin/store/settings/uc_discounts"))
+	));
 }
 
 /**
@@ -409,6 +449,7 @@ function uc_discounts_install()
  */
 function uc_discounts_uninstall()
 {
+	drupal_uninstall_schema("uc_discounts_classes");
 	drupal_uninstall_schema("uc_discounts_order_codes");
 	drupal_uninstall_schema("uc_discounts_uses");
 	drupal_uninstall_schema("uc_discounts_products");
@@ -499,3 +540,32 @@ function uc_discounts_update_4()
 	db_create_table($queries, "uc_discounts_skus", $schema["uc_discounts_skus"]);
 	return $queries;
 }
+
+//Add required_product column to uc_discounts table
+function uc_discounts_update_5()
+{
+	$queries = array();
+
+	switch ($GLOBALS["db_type"])
+	{
+		case "mysql":
+		case "mysqli":
+			$queries[] = update_sql("ALTER TABLE {uc_discounts} ADD required_product varchar(255) NOT NULL default '' AFTER requires_single_product_to_qualify");
+			break;
+		case "pgsql":
+			db_add_column( $queries, "uc_discounts", "required_product", "varchar(255)",
+			array("not null" => TRUE, "default" => "") );
+			break;
+	}
+
+	return $queries;
+
+}
+
+//Add uc_discounts_classes table
+function uc_discounts_update_6()
+{
+	$schema = uc_discounts_classes_schema();
+	db_create_table($queries, "uc_discounts_classes", $schema["uc_discounts_classes"]);
+	return $queries;
+}
Index: uc_discounts.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts_alt/uc_discounts/uc_discounts.module,v
retrieving revision 1.26
diff -u -p -r1.26 uc_discounts.module
--- uc_discounts.module	26 May 2009 01:45:13 -0000	1.26
+++ uc_discounts.module	4 Aug 2009 20:16:26 -0000
@@ -19,10 +19,12 @@ define("DISCOUNT_TYPE_FIXED_AMOUNT_OFF_P
 define("FILTER_TYPE_PRODUCTS", 1);
 define("FILTER_TYPE_TERMS", 2);
 define("FILTER_TYPE_SKUS", 3);
+define("FILTER_TYPE_CLASS", 4);
 
 define("ALL_PRODUCTS", "-1");
 define("ALL_TERMS", "-1");
 define("ALL_SKUS", "");
+define("ALL_CLASSES", "");
 define("ALL_ROLES", "-1");
 
 define("REQUIRES_SINGLE_PRODUCT_TO_QUALIFY_DEFAULT", FALSE);
@@ -278,6 +280,10 @@ function uc_discounts_order($op, &$arg1,
 
 /**
  * Implementation of Ubercart's hook_line_item().
+ *
+ * Displays all discounts as a single line item
+ *
+ * @see hook_line_item()
  */
 function uc_discounts_line_item()
 {
@@ -294,6 +300,8 @@ function uc_discounts_line_item()
 
 /**
  * Implementation of hook_cart_pane().
+ * 
+ * @see hook_cart_pane()
  */
 function uc_discounts_cart_pane($items)
 {
@@ -355,6 +363,8 @@ function uc_discounts_cart_pane($items)
 
 /**
  * Implementation of hook_checkout_pane().
+ * 
+ * @see hook_checkout_pane()
  */
 function uc_discounts_checkout_pane()
 {
@@ -583,7 +593,7 @@ function get_uc_discounts_column_names()
 	return array("name", "short_description", "description", "qualifying_type", 
 		"qualifying_amount", "has_qualifying_amount_max", "qualifying_amount_max", "discount_type", 
 		"discount_amount", "requires_code", "filter_type", "has_role_filter", 
-		"requires_single_product_to_qualify", "max_times_applied", "can_be_combined_with_other_discounts", "max_uses", 
+		"requires_single_product_to_qualify", "required_product", "max_times_applied", "can_be_combined_with_other_discounts", "max_uses", 
 		"max_uses_per_user", "max_uses_per_code", "has_expiration", "expiration", 
 		"is_published", "weight");
 }
@@ -610,7 +620,7 @@ function get_uc_discounts_column_printf_
 	return array("'%s'", "'%s'", "'%s'", "%d", 
 		"%f", "%d", "%f", "%d", 
 		"%f", "%d", "%d", "%d", 
-		"%d", "%d", "%d", "%d", 
+		"%d", "'%s'", "%d", "%d", "%d", 
 		"%d", "%d", "%d", "%d", 
 		"%d", "%d");
 }
@@ -635,7 +645,7 @@ function get_uc_discounts_column_update_
 function uc_discounts_insert($name, $short_description, $description, $qualifying_type, 
 	$qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, 
 	$discount_amount, $requires_code, $filter_type, $has_role_filter, 
-	$requires_single_product_to_qualify, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
+	$requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
 	$max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, 
 	$is_published, $weight, $insert_timestamp = NULL)
 {
@@ -649,7 +659,7 @@ function uc_discounts_insert($name, $sho
 		$name, $short_description, $description, $qualifying_type, 
 		$qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, 
 		$discount_amount, $requires_code, $filter_type, $has_role_filter, 
-		$requires_single_product_to_qualify, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
+		$requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
 		$max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, 
 		$is_published, $weight, $insert_timestamp);
 	$discount_id = db_last_insert_id("uc_discounts", "discount_id");
@@ -664,7 +674,7 @@ function uc_discounts_update($discount_i
 	$name, $short_description, $description, $qualifying_type, 
 	$qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, 
 	$discount_amount, $requires_code, $filter_type, $has_role_filter, 
-	$requires_single_product_to_qualify, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
+	$requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
 	$max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, 
 	$is_published, $weight)
 {
@@ -687,7 +697,7 @@ function uc_discounts_update($discount_i
 		$name, $short_description, $description, $qualifying_type, 
 		$qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, 
 		$discount_amount, $requires_code, $filter_type, $has_role_filter, 
-		$requires_single_product_to_qualify, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
+		$requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, 
 		$max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, 
 		$is_published, $weight, $discount_id);
 }
@@ -744,6 +754,11 @@ function uc_discounts_codes_delete($disc
 /**
  * Returns product_ids for discount object.
  * Note: this function correctly returns all products for term-based discounts.
+ *
+ * @param $discount object
+ * @param $exclude_all_products bool
+ *
+ * @return array of product ids (nids)
  */
 function get_product_ids_for_discount_object($discount, $exclude_all_products = FALSE)
 {
@@ -775,6 +790,16 @@ function get_product_ids_for_discount_ob
 			while ( $row = db_fetch_array($result) )
 				$product_ids[] = $row["nid"];
 			return $product_ids;
+
+		case FILTER_TYPE_CLASS:
+			$query = "SELECT DISTINCT n.nid FROM {node} n
+				INNER JOIN {uc_discounts_classes} dcl ON n.type=dcl.class
+				WHERE dcl.discount_id=%d";
+			uc_discounts_log($query);
+			$result = db_query($query, $discount->discount_id);
+			while ( $row = db_fetch_array($result) )
+				$product_ids[] = $row["nid"];
+			return $product_ids;
 	}
 	return array();
 }
@@ -783,6 +808,11 @@ function get_product_ids_for_discount_ob
  * Returns product_ids for discount.
  * Note: this function does not check filter_type so a discount with filter_type other than 
  *	  FILTER_TYPE_PRODUCTS will return no values.
+ *
+ * @param $discount_id
+ * @param $exclude_all_products
+ * 
+ * @return array of product ids (nids)
  */
 function get_product_ids_for_discount($discount_id, $exclude_all_products = FALSE)
 {
@@ -866,6 +896,27 @@ function get_skus_for_discount($discount
 }
 
 /**
+ * Returns Product Class names for discount.
+ */
+function get_classes_for_discount($discount_id, $exclude_all_classes = FALSE)
+{
+	$classes = array();
+
+	//Get Classes from database
+	if ($exclude_all_classes)
+	{
+		$result = db_query("SELECT class FROM {uc_discounts_classes} WHERE discount_id=%d AND class<>%d",
+			$discount_id, ALL_CLASSES);
+	}
+	else
+		$result = db_query("SELECT class FROM {uc_discounts_classes} WHERE discount_id=%d", $discount_id);
+
+	while ( $row = db_fetch_array($result) )
+		$classes[] = $row["class"];
+	return $classes;
+}
+
+/**
  * Returns role_ids for discount.
  */
 function get_role_ids_for_discount($discount_id, $exclude_all_roles = FALSE)
@@ -929,6 +980,27 @@ function uc_discounts_skus_delete($disco
 }
 
 /**
+ * Inserts a uc_discounts_classes row and returns its discount_class_id.
+ */
+function uc_discounts_classes_insert($discount_id, $class)
+{
+	$query = "INSERT INTO {uc_discounts_classes}(discount_id, class) VALUES(%d, '%s')";
+	uc_discounts_log("query=".$query);
+	db_query($query, $discount_id, $class);
+	return db_last_insert_id("uc_discounts_classes", "discount_class_id");
+}
+
+/**
+ * Deletes all uc_discounts_classes rows for a discount.
+ */
+function uc_discounts_classes_delete($discount_id)
+{
+	$query = "DELETE FROM {uc_discounts_classes} WHERE discount_id=%d";
+	uc_discounts_log("query=".$query);
+	db_query($query, $discount_id);
+}
+
+/**
  * Inserts a uc_discounts_roles row and returns its discount_role_id.
  */
 function uc_discounts_roles_insert($discount_id, $role_id)
@@ -956,14 +1028,16 @@ function uc_discounts_roles_delete($disc
  * @param $order Order to get discounts for
  * @param $errors Reference to array to add error messages to
  * @param $messages Reference to array to add success messages to
+ *
+ * @return array of discount objects
  */
 function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$messages = NULL)
 {
-	$order_product_id_subtotal_map = array();
-	$order_product_id_quantity_map = array();
-	$order_product_ids = array();
-	$order_product_ids_set = array();
-	$order_product_id_product_array_map = array();
+	$order_product_id_subtotal_map = array();        // Product NIDS in cart => subtotal of individual item
+	$order_product_id_quantity_map = array();        // Product NIDS in cart => quantity of individual item
+	$order_product_ids = array();                    // Product NIDS in cart
+	$order_product_ids_set = array();                // Product NIDS in cart=> bool
+	$order_product_id_product_array_map = array();   // Product objects in cart
 	$order_subtotal = 0;
 
 	//Create IN string of product node IDs in order
@@ -989,6 +1063,7 @@ function get_discounts_for_order($order,
 		}
 	}
 
+	// Populate product NID array with NIDs from the order
 	$order_product_ids = array_keys($order_product_ids_set);
 
 	$temp_product_ids = $order_product_ids;
@@ -1020,11 +1095,24 @@ function get_discounts_for_order($order,
 		//Get SKUs for order's products
 		$result = db_query( "SELECT DISTINCT model FROM {uc_products} WHERE nid IN(%s)", join(",", $order_product_ids) );
 		while ( $row = db_fetch_array($result) )
-			$temp_skus[] = "'" . db_escape_string($row["model"]) . "'";;
+			$temp_skus[] = "'" . db_escape_string($row["model"]) . "'";
 	}
 	$skus_clause = sprintf( "d.filter_type<>%d OR ds.sku IN(%s)", 
 		FILTER_TYPE_SKUS, join(",", $temp_skus) );
 
+	//Create IN string of classes in order
+	$temp_classes = array();
+	$temp_classes[] = "'" . db_escape_string(ALL_CLASSES) . "'";
+	if ( is_array($order->products) && !empty($order->products) )
+	{
+		//Get classes for order's products
+		$result = db_query( "SELECT DISTINCT type FROM {node} WHERE nid IN(%s)", join(",", $order_product_ids) );
+		while ( $row = db_fetch_array($result) )
+			$temp_classes[] = "'" . db_escape_string($row["type"]) . "'";
+	}
+	$classes_clause = sprintf( "d.filter_type<>%d OR dcl.class IN(%s)",
+			FILTER_TYPE_CLASS, join(",", $temp_classes) );
+
 	//Create codes clause
 	$escaped_codes_string = NULL;
 	if ( !empty($order->uc_discounts_codes) )
@@ -1056,6 +1144,7 @@ function get_discounts_for_order($order,
 			LEFT JOIN {uc_discounts_skus} ds ON d.discount_id=ds.discount_id
 			LEFT JOIN {uc_discounts_roles} dr ON d.discount_id=dr.discount_id
 			LEFT JOIN {uc_discounts_codes} dc ON d.discount_id=dc.discount_id
+			LEFT JOIN {uc_discounts_classes} dcl ON d.discount_id=dcl.discount_id
 			WHERE dc.code IN(%s)
 			AND (d.has_role_filter=0%s)
 			AND (%s)
@@ -1063,7 +1152,7 @@ function get_discounts_for_order($order,
 			AND (%s)
 			AND (d.has_expiration<>0 AND d.expiration<=%d)
 			ORDER BY weight", $escaped_codes_string, $roles_clause, $product_ids_clause, 
-				$term_ids_clause, $skus_clause, time() );
+				$term_ids_clause, $skus_clause, $classes_clause, time() );
 		uc_discounts_log("query=" . $query);
 		$result = db_query($query);
 		while ( $discount = db_fetch_object($result) )
@@ -1077,18 +1166,20 @@ function get_discounts_for_order($order,
 		LEFT JOIN {uc_discounts_products} dp ON d.discount_id=dp.discount_id
 		LEFT JOIN {uc_discounts_terms} dt ON d.discount_id=dt.discount_id
 		LEFT JOIN {uc_discounts_skus} ds ON d.discount_id=ds.discount_id
+		LEFT JOIN {uc_discounts_classes} dcl ON d.discount_id=dcl.discount_id
 		WHERE (d.requires_code=0%s)
 		AND (d.has_role_filter=0%s)
 		AND (%s)
 		AND (%s)
 		AND (d.has_expiration=0 OR d.expiration>%d)
 		ORDER BY weight", $codes_clause, $roles_clause, $product_ids_clause, 
-			$term_ids_clause, $skus_clause, time() );
+			$term_ids_clause, $skus_clause, $classes_clause, time() );
 	uc_discounts_log("query=" . $query);
 	$result = db_query($query);
 
 	$total_discount_amount = 0;
 	$discounts = array();
+	// Appears to check if order qualifies for each discount then applies discount.  Functionality should be separated, no?
 	while ( $discount = db_fetch_object($result) )
 	{
 		//Get code for discount (if one exists)
@@ -1105,7 +1196,7 @@ function get_discounts_for_order($order,
 		//The query handled valid codes and expiration, this block must:
 		//	check max uses (if applicable)
 		//	check if discount is being combined and can be combined
-		//	check if order qualifies (type, requires_single_product_to_qualify, can_be_combined_with_other_discounts)
+		//	check if order qualifies (type, requires_single_product_to_qualify, required_product, can_be_combined_with_other_discounts)
 		//	determine number of times to apply discount
 
 		//If this discount has a max uses amount, check max uses
@@ -1146,7 +1237,7 @@ function get_discounts_for_order($order,
 			$discount->user_uses_count = $row["user_uses_count"];
 		}
 
-		//If code exists and this discount has a max uses per code amount, check max uses per user
+		//If code exists and this discount has a max uses per code amount, check max uses per code
 		if ( !is_null($discount->code) && ($discount->max_uses_per_code > 0) )
 		{
 			$row = db_fetch_array( db_query("SELECT COUNT(*) as code_uses_count FROM {uc_discounts_uses} WHERE discount_id=%d AND code='%s'", 
@@ -1179,6 +1270,7 @@ function get_discounts_for_order($order,
 				continue;
 			}
 
+			// Check if the first discount can't be combined
 			if (!$discounts[0]->can_be_combined_with_other_discounts) 
 			{
 				//If first discount was a coded discount, add error message (only print warning if both 
@@ -1192,15 +1284,13 @@ function get_discounts_for_order($order,
 			}
 		}
 
-
-		//Check if order qualifies for this discount (check type and requires_single_product_to_qualify)
+		//Check if order qualifies for this discount (check type, requires_single_product_to_qualify, required_product)
 
 		//Get product IDs for discount
 		$discount_product_ids = get_product_ids_for_discount_object($discount);
 		if ( in_array(ALL_PRODUCTS, $discount_product_ids) )
 			$discount_product_ids = $order_product_ids;
 
-
 		//Determine total qualifying amount of order (store in order_qualifying_amount)
 		//and qualifying subtotal of order (store in order_qualifying_subtotal)
 
@@ -1210,36 +1300,37 @@ function get_discounts_for_order($order,
 		//If discount requires a single product
 		if ($discount->requires_single_product_to_qualify)
 		{
-			switch ($discount->qualifying_type)
+			// Check if required_product is set or trust that form validation did the right thing?  Check anyway...
+			if ($discount->required_product)
 			{
-				case QUALIFYING_TYPE_MINIMUM_PRICE:
-					//Determine the maximum product subtotal
-					foreach ($discount_product_ids as $product_id)
+
+				// Get nid of required_product
+				$required_product_result = db_query("SELECT DISTINCT nid from {uc_products} WHERE model=('%s')",$discount->required_product);
+				$required_product_id = db_result($required_product_result);
+
+				// Check if required_product nid is in cart
+				if (in_array($required_product_id,$order_product_ids))
+				{
+					switch ($discount->qualifying_type)
 					{
-						if ( isset($order_product_id_subtotal_map[$product_id]) )
-						{
-							$order_qualifying_amount = 
-								max($order_qualifying_amount, $order_product_id_subtotal_map[$product_id]);
-						}
-					}
+						// Buy $50 of X product
+						case QUALIFYING_TYPE_MINIMUM_PRICE:
+							//Determine the maximum product subtotal
+							$order_qualifying_amount = max($order_qualifying_amount, $order_product_id_subtotal_map[$required_product_id]);
 
-					//Subtract already discounted amount
-					$order_qualifying_amount -= $total_discount_amount;
+							//Subtract already discounted amount
+							$order_qualifying_amount -= $total_discount_amount;
 //TO DO: keep track of each item's subtotal and decrement upon applying discount
-					break;
+							break;
 
-				case QUALIFYING_TYPE_MINIMUM_QUANTITY:
-					//Determine the maximum product quantity
-					foreach ($discount_product_ids as $product_id)
-					{
-						if ( isset($order_product_id_quantity_map[$product_id]) )
-						{
-							$order_qualifying_amount = 
-								max($order_qualifying_amount, $order_product_id_quantity_map[$product_id]);
-						}
-					}
+						// Buy 5 of X product...
+						case QUALIFYING_TYPE_MINIMUM_QUANTITY:
+							//Determine the maximum product quantity
+							$order_qualifying_amount = max($order_qualifying_amount, $order_product_id_quantity_map[$required_product_id]);
 //TO DO: keep track of each item's quantity and decrement upon applying discount
-					break;
+							break;
+					}
+				}
 			}
 		}
 		//Otherwise sum product subtotals or quantities
@@ -1327,7 +1418,7 @@ function get_discounts_for_order($order,
 		//Get product IDs in order that are in discount
 		$order_and_discount_product_ids = array_intersect($discount_product_ids, $order_product_ids);
 
-		//Create array of product objects related to this discount
+		//Create array of product objects in cart to which this discount gets applied.
 		$order_and_discount_products = array();
 		foreach ($order_and_discount_product_ids as $product_id)
 		{
@@ -1459,16 +1550,19 @@ function get_discounts_for_order($order,
 				$discount_product_ids = get_product_ids_for_discount_object($discount, TRUE);
 
 				// Do we have any products
-				if (count($discount_product_ids) > 0) {
-				  $discounted_products_amount = 0;
-				  foreach ($order_and_discount_products as $product)
-				  {
-					$discounted_products_amount += $product->price * $product->qty;
-				  }
-				  $discount->amount = $discounted_products_amount * $discount->discount_amount;
+				if (count($discount_product_ids) > 0)
+				{
+					$discounted_products_amount = 0;
+					foreach ($order_and_discount_products as $product)
+					{
+						$discounted_products_amount += $product->price * $product->qty;
+					}
+					$discount->amount = $discounted_products_amount * $discount->discount_amount;
 				// Discount the subtotal so far
-				} else {
-				  $discount->amount = max($order_subtotal - $total_discount_amount, 0) * $discount->discount_amount;
+				}
+				else
+				{
+					$discount->amount = max($order_subtotal - $total_discount_amount, 0) * $discount->discount_amount;
 				}
 //End patch from lutegrass
 				break;
@@ -1519,7 +1613,7 @@ function get_discounts_for_order($order,
 
 		//Add this discount to list of discounts applied to order
 		$discounts[] = $discount;
-	}
+	} // end of db fetch while loop
 	return $discounts;
 }
 
@@ -1573,6 +1667,13 @@ function get_codeless_discounts_for_prod
 	while ( $row = db_fetch_array($result) )
 		$skus[] = "'" . db_escape_string($row["model"]) . "'";
 
+	//Get classes for product
+	$classes = array();
+	$classes[] = "'" . db_escape_string(ALL_CLASSES) . "'";
+	$result = db_query("SELECT DISTINCT type FROM {node} WHERE nid=%d", $product->nid);
+	while ( $row = db_fetch_array($result) )
+		$classes[] = "'" . db_escape_string($row["type"]) . "'";
+
 	//Create roles clause
 	global $user;
 	$auth_rid = ($user->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
@@ -1590,19 +1691,23 @@ function get_codeless_discounts_for_prod
 	$skus_clause = sprintf( "d.filter_type<>%d OR ds.sku IN(%s)", 
 		FILTER_TYPE_SKUS, join(",", $skus) );
 
+	$classes_clause = sprintf( "d.filter_type<>%d OR dcl.class IN(%s)",
+		FILTER_TYPE_CLASS, join(",", $classes) );
+
 	$sort_order_string = (is_ascending_sort) ? "ASC" : "DESC";
 
 	$query = sprintf("SELECT d.* FROM {uc_discounts} d
 		LEFT JOIN {uc_discounts_products} dp ON d.discount_id=dp.discount_id
 		LEFT JOIN {uc_discounts_terms} dt ON d.discount_id=dt.discount_id
 		LEFT JOIN {uc_discounts_skus} ds ON d.discount_id=ds.discount_id
+		LEFT JOIN {uc_discounts_classes} dcl ON d.discount_id=dcl.discount_id
 		WHERE d.requires_code=0
 		AND (d.has_role_filter=0%s)
 		AND (%s)
 		AND (%s)
 		AND (%s)
 		AND (d.has_expiration=0 OR d.expiration>%d)
-		ORDER BY d.%s %s", $roles_clause, $product_ids_clause, $term_ids_clause, $skus_clause, time(), 
+		ORDER BY d.%s %s", $roles_clause, $product_ids_clause, $term_ids_clause, $skus_clause, $classes_clause, time(), 
 			$sort_column, $sort_order_string);
 	uc_discounts_log("query=" . $query);
 	$result = db_query($query);
@@ -1774,3 +1879,5 @@ function uc_discounts_log($s)
 {
 //	error_log($s);
 }
+
+
