$(function () {
    var preloadedToken = null;
    function getToken(callback) {
        if (preloadedToken) {
            callback(preloadedToken);
        } else {
            $.getJSON("/pricing/token/", function(response) {
                preloadedToken = response.client_token;
                callback(response.client_token);
            });
        }
    }

    // Preload client token:
    if ($("#billing-address").length) {
        getToken(function(token){});
    }

    function getAmount(planId) {
        return planId.substr(1);
    }

    function showPaymentMethodForm(planId) {
        $("#plan-id").val(planId);
        $("#nonce").val("");

        if (planId == "") {
            // Don't need a payment method when switching to the free plan
            // -- can submit the form right away:
            $("#update-subscription-form").submit();
            return;
        }

        $("#payment-form-submit").prop("disabled", true);
        $("#payment-method-modal").modal("show");

        getToken(function(token) {
            braintree.dropin.create({
                authorization: token,
                container: "#dropin",
                threeDSecure: {
                    amount: getAmount(planId),
                },
                paypal: { flow: 'vault' },
                preselectVaultedPaymentMethod: false
            }, function(createErr, instance) {
                $("#payment-form-submit").off().click(function() {
                    instance.requestPaymentMethod(function (err, payload) {
                        $("#payment-method-modal").modal("hide");
                        $("#please-wait-modal").modal("show");

                        $("#nonce").val(payload.nonce);
                        $("#update-subscription-form").submit();
                    });
                });

                $("#payment-method-modal").off("hidden.bs.modal").on("hidden.bs.modal", function() {
                    instance.teardown();
                });

                instance.on("paymentMethodRequestable", function() {
                    $("#payment-form-submit").prop("disabled", false);
                });

                instance.on("noPaymentMethodRequestable", function() {
                    $("#payment-form-submit").prop("disabled", true);
                });

            });
        });
    }

    $("#change-plan-btn").click(function() {
        $("#change-billing-plan-modal").modal("hide");
        showPaymentMethodForm(this.dataset.planId);
    });

    $("#update-payment-method").click(function() {
        if ($("#no-billing-address-modal").length) {
            $("#no-billing-address-modal").modal("show");
            return;
        }

        showPaymentMethodForm($("#old-plan-id").val());
    });

    $("#billing-history").load("/accounts/profile/billing/history/");
    $("#billing-address").load("/accounts/profile/billing/address/", function() {
        $("#billing-address input").each(function(idx, obj) {
            $("#" + obj.name).val(obj.value);
        });
    });

    $("#payment-method").load("/accounts/profile/billing/payment_method/", function() {
        $("#next-billing-date").text($("#nbd").val());
    });

    $("#billing-periods input").click(updateChangePlanForm);

    $("#plan-hobbyist").click(function() {
        $(".plan").removeClass("selected");
        $("#plan-hobbyist").addClass("selected");
        updateChangePlanForm();
    });

    $("#plan-supporter").click(function() {
        $(".plan").removeClass("selected");
        $("#plan-supporter").addClass("selected");
        updateChangePlanForm();
    });

    $("#plan-business").click(function() {
        $(".plan").removeClass("selected");
        $("#plan-business").addClass("selected");
        updateChangePlanForm();
    });

    $("#plan-business-plus").click(function() {
        $(".plan").removeClass("selected");
        $("#plan-business-plus").addClass("selected");
        updateChangePlanForm();
    });

    function updateChangePlanForm() {
        var planId = $("#old-plan-id").val();

        // "Monthly" is selected: dispplay monthly prices
        if ($("#billing-monthly").is(":checked")) {
            var period = "monthly";
            $("#supporter-price").text("$5");
            $("#business-price").text("$20");
            $("#business-plus-price").text("$80");
        }

        // "Annual" is selected: dispplay annual prices
        if ($("#billing-annual").is(":checked")) {
            var period = "annual";
            $("#supporter-price").text("$4");
            $("#business-price").text("$16");
            $("#business-plus-price").text("$64");
        }

        // "Hobbyist" is selected, set planId
        if ($("#plan-hobbyist").hasClass("selected")) {
            planId = "";
        }

        // "Supporter" is selected, set planId
        if ($("#plan-supporter").hasClass("selected")) {
            planId = period == "monthly" ? "S5" : "S48";
        }

        // "Business" is selected, set planId
        if ($("#plan-business").hasClass("selected")) {
            planId = period == "monthly" ? "P20" : "Y192";
        }

        // "Business Plus" is selected, set planId
        if ($("#plan-business-plus").hasClass("selected")) {
            planId = period == "monthly" ? "P80" : "Y768";
        }

        if (planId == $("#old-plan-id").val()) {
            $("#change-plan-btn")
                .attr("disabled", "disabled")
                .text("Change Billing Plan");

        } else {
            var caption = "Change Billing Plan";
            if (planId) {
                caption += " And Pay $" + getAmount(planId) + " Now";
            }

            $("#change-plan-btn")
                .removeAttr("disabled")
                .text(caption)
                .attr("data-plan-id", planId);
        }
    }
    updateChangePlanForm();

});
