﻿(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) {
            $("#lblPrice").html(result.d.price);
            $("#lblItemNr").html(result.d.itemNr);
            $("#lblQuantityDiscounts").html(result.d.qtyPricing);
        });
    }

    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
        });
    }
})();
