/// <reference path="shop.js" />
/// prointernet Grid Shop Checkout
/// Version: 2.0.8006.30174

function GridShopCheckout(shop) {
    this.shop = shop;
    this.layer = $("#checkoutLayer");
    this.state = "init";

    this.stateChanged = function (state) {
        if (state == "checkout") {
            this.show();
        } else {
            this.hide();
        }
    }

}

GridShopCheckout.prototype.show = function () {
    var base = this;

    if (!base.validateLayer()) {
        return;
    }

    if (base.layer.length == 0 || base.layer.find(".items").length == 0) {
        base.layer.remove();
        base.layer = $('<div id="checkoutLayer" style="display:none"></div>').appendTo($("body"));

        var layerForm = $('<form id="checkoutForm" action="/data/DoCheckout" enctype="multipart/form-data"></form>').appendTo(base.layer);

        layerForm.append($("<h1>Ihre Merkliste</h1>"));
        layerForm.append($("<div class='items'></div>"));
        layerForm.append($("<div class='form'></div>"));

        var btnCheckout = $("<button class='btn docheckout'><span>Anfrage absenden</span></a>").appendTo(layerForm);
        btnCheckout.click(function (e) {
            e.preventDefault();
            base.submit();
        });

        var btnClose = $("<a class='close'><span>Close</span></a>").prependTo(base.layer);
        btnClose.click(function (e) {
            base.shop.setState("");
        });

        $("body").click(function (e) {
            if ($("body").hasClass("shoplayer")) {
                if (!$(e.target).isInPath("#checkoutLayer,#basketLayer")) {
                    base.shop.setState("");
                }
            }
        });
    }

    var itemContainer = base.layer.find(".items");
    itemContainer.empty();

    var formContainer = base.layer.find(".form");
    formContainer.empty();

    base.shop.query("GetCheckout", {}, function (result) {

        // Items
        $.each(result.items, function (idx, data) {
            var item = $(data.html);

            item.attr("data-url", data.basketItem.url)
            var itemId = item.getDataId();

            item.find(".addtobasket").remove();

            var itemControls = item.find(".controls");
            if (itemControls.length == 0) {
                itemControls = $("<div class='controls'></div>").appendTo(item);
            }

            // Remove
            var btnRemove = itemControls.find("a.remove");
            if (btnRemove.length == 0) {
                btnRemove = $("<a class='remove'><span>Entfernen</span></a>").appendTo(itemControls);
            }
            btnRemove.unbind("click").click(function () {
                base.shop.basket.remove($(this).getDataId(), function () {
                    item.remove();
                    base.validateLayer();
                });
            });

            // Count
            if (base.shop.config.checkoutCountBox) {
                var inputCount = itemControls.find("input.count");
                if (inputCount.length == 0) {
                    inputCount = $("<input name='@dataId_count' type='number' class='count' value='@count' min='0' />"
                        .replace("@dataId", itemId)
                        .replace("@count", data.basketItem.count)
                    ).appendTo(itemControls);

                    inputCount.on("keyup change", function () {
                        var inp = $(this);
                        clearTimeout(base.changeCountTimeOut);
                        base.changeCountTimeOut = setTimeout(function () {
                            if (inp.val() > 0) {
                                base.shop.basket.update(inp.getDataId(), { count: inp.val() });
                            } else {
                                btnRemove.trigger("click");
                            }
                        }, 800);
                    });
                }
            }

            itemContainer.append(item);
        });

        // Form
        var form = $(result.html);
        formContainer.append(form);
    });

    base.layer.css({ top: $(window).scrollTop() + "px" });

    base.layer.show();
    base.alignLayer();

    $("body").addClass("shoplayer");
}

GridShopCheckout.prototype.hide = function () {
    this.layer.hide();
    $("body").removeClass("shoplayer");
}

GridShopCheckout.prototype.validateLayer = function () {
    if (this.shop.basket.data.count == 0) {
        this.hide();
        return false;
    }
    return true;
}

GridShopCheckout.prototype.submit = function () {
    var base = this;

    var form = base.layer.find("#checkoutForm");

    form.validate({
        ignore: ":hidden"
    });

    if (form.valid()) {
        var formData = form.serializeArray();

        base.shop.query("DoCheckout", formData, function (result) {

            if (result.success) {
                // Success
                form.html(result.html);
                base.alignLayer();

                // Warenkorb zurücksetzen
                base.shop.load();
            } else {
                // Error
                alert(result.errorMessage);

                if (result.errorCode = "expired") {
                    location.reload();
                }
            }
        });
    }
}

GridShopCheckout.prototype.alignLayer = function () {
    var base = this;
    var offsetTop = $(window).height() * 0.1;
    $("html, body").animate({
        scrollTop: (base.layer.offset().top - offsetTop)
    }, 0);
}