﻿(function () {
	var $varInvDDs;
	var indexes = {}
	var useVariantInventory = false;

	$(function () {
		useVariantInventory = ($("#hfUseVariantInventory").val() === "True");

		var $dd = $(".variantDropDown, .variantSelection");

		if (useVariantInventory) {
			$varInvDDs = $dd.not("[id*=NonInventoryVariantGroup]");

			var lastVal;
			$varInvDDs.each(function (i) {
				indexes[this.id] = i;

				if (useVariantInventory && i > 0 && lastVal === "-999") {
					if ($(this).is("select")) {
						$(this).attr("disabled", "disabled");

					}
					else {
						$(this).find("input").attr("disabled", "disabled").first().attr("checked", "checked");
					}
				}

				if ($(this).is("select")) {
					lastVal = $(this).val();
				}
				else {
					if ($(this).find("input:checked").length > 0) {
						lastVal = $(this).find("input:checked").val();
					}
					else {
						lastVal = "-999";
					}
				}
			});
		}

		$dd.change(function () {
			onVariantChange($(this));
		});

		$(".variantSelection input").change(function () {
			onVariantChange($(this));
		});

		if ($varInvDDs && $varInvDDs.first().val() !== "-999") {
			$varInvDDs.first().change();
		}
	});

	function onVariantChange($element) {
		updatePrice();

		if (useVariantInventory) {
			updateVariants($element);
		}
	}

	function getSelections() {
		var options = [];

		// dropdowns
		$(".variantDropDown").each(function () {
			options.push($(this).val());
		});

		// radio buttons
		$(".variantSelection input:radio:checked").each(function () {
			options.push($(this).val());
		});

		// checkboxes
		$(".variantSelection input:checkbox:checked").each(function () {
			options.push($(this).parent().attr("id"));
		});

		return options;
	}

	function getQuantity() {
		var quantity = $("#txtQuantity").val();

		if (!quantity) {
			var combinedQty = 0;

			if ($("#hfQtyDiscountAcrossVariants").val() === "True") {
				$(".ProductDetailsVariantMatrixQuantityBox input").each(function () {
					var qty = parseInt($(this).val());
					if (!isNaN(qty)) {
						combinedQty = combinedQty + qty;
					}
				});
			}

			quantity = combinedQty;
		}

		if (quantity <= 0) {
			quantity = 1;
		}

		return quantity;
	}

	function updatePrice() {
		var itemID = $("#hfItemID").val();
		var quantity = getQuantity();

		var options = getSelections();

		var params = "{'itemID': " + itemID + ", 'quantity': " + quantity + ", 'variantIDs': [" + options.join(", ") + "]}";

		ajaxCall("GetPrice", params, function (result) {
			$(".PriceToUpdate").html(result.d.price);
			$("#lblItemNr").html(result.d.itemNr);
			$("#lblQuantityDiscounts").html(result.d.qtyPricing);
			$("#lblProductStatus").html(result.d.status);
			$("#lblProductTimeFrame").html(result.d.timeFrame);
		});
	}

	function updateVariants($element) {
		var options = [];

		var elementID = $element.get(0).id;

		if (indexes[elementID] === null) {
			return;
		}

		var nextIndex = indexes[elementID] + 1;

		var $sel = $varInvDDs.slice(0, nextIndex);

		$sel.each(function () {
			if ($(this).is("select")) {
				options.push($(this).val());
			}
			else {
				options.push($(this).find("input:checked").val());
			}
		});

		var groupID = $("#variantGroupID" + (nextIndex + 1)).val();

		var $next = $($varInvDDs.get(nextIndex));

		if ($next.length == 0) {
			return;
		}

		if ($element.val() === "-999" || (!$element.is("select") && $element.find("input:checked").length == 0)) {
			setDefaults($element);
			return;
		}

		var qty = getQuantity();

		var itemID = $("input[id$='hfItemID']").val();

		if (itemID == null || isNaN(itemID))
			itemID = 0;

		if ($next.is("select")) {
			$next.removeAttr("disabled");
		}

		var params = "{'variantIDs': [" + options.join(", ") + "], 'groupID':" + groupID + ", qty:" + qty + ", itemID:" + itemID + "}";

		ajaxCall("GetApplicableVariants", params, function (result) {
			var variants = $.parseJSON(result.d);

			var $selected;

			if ($next.is("select")) {
				$selected = $next;

				$next.children("option[value!='-999']").remove();
				$.each(variants, function (key, value) {
					$next.append($("<option>", { value: key }).text(value));
				});
			}
			else {
				$selected = $next.find("input:checked");

				$next.find("input").each(function () {
					$(this).removeAttr("checked");
					if (this.value !== "-999" && !variants[this.value]) {
						$(this).attr("disabled", "disabled");
					}
					else {
						$(this).removeAttr("disabled");
					}
				});
			}

			setDefaults($next);

			if ($selected.val() !== "-999") {
				$selected.change();
			}
		});
	}

	function setDefaults($startElement) {
		var selectedVal;

		if ($startElement.is("select")) {
			selectedVal = $startElement.val();
		}
		else {
			var $checked = $startElement.find("input:checked");

			if ($checked.length > 0) {
				selectedVal = $checked.val();
			}
			else {
				selectedVal = "-999";
			}
		}

		if (selectedVal === "-999") {
			var $nextElements = $varInvDDs.slice(indexes[$startElement.get(0).id] + 1);
			$nextElements.each(function () {
				if ($(this).is("select")) {
					$(this).val("-999").attr("disabled", "disabled");
				}
				else {
					$(this).find("input").each(function () {
						$(this).removeAttr("checked");
						if (this.value === "-999") {
							$(this).attr("checked", "checked");
						}
						else {
							$(this).attr("disabled", "disabled");
						}
					});
				}
			});
		}
	}

	function ajaxCall(method, parameters, success) {
		$.ajax({
			type: "POST",
			contentType: "application/json; charset=utf-8",
			url: "/Store/ProductDetails.aspx/" + method,
			dataType: "json",
			data: parameters,
			success: success
		});
	}
})();
