/* global __ kohaTable table_settings mmtas */
$(document).ready(function () {
    window.modaction_legend_innerhtml = $("#modaction_legend").text();
    window.action_submit_value = $("#action_submit").val();

    $("#select_template").find("input:submit").hide();
    $("#select_template").change(function () {
        $("#select_template").submit();
    });
    $("span.match_regex_prefix").hide();
    $("span.match_regex_suffix").hide();

    $("#action").on("change", function () {
        onActionChange(this);
    });

    $("#add_action").submit(function () {
        var action = $("#action").val();
        if (
            action == "move_field" ||
            action == "copy_field" ||
            action == "copy_and_replace_field"
        ) {
            if (
                $("#from_subfield").val().length !=
                $("#to_subfield").val().length
            ) {
                if (
                    $("#to_field").val() >= 10 &&
                    $("#to_subfield").val().length > 0 &&
                    $("#from_field").val() >= 10 &&
                    $("#from_subfield").val().length > 0
                ) {
                    alert(
                        __("Both subfield values should be filled or empty.")
                    );
                    return false;
                }
            }
            if ($("#to_field").val().length <= 0) {
                alert(__("The destination should be filled."));
                return false;
            }
            if (
                ($("#to_field").val() < 10 &&
                    $("#to_subfield").val().length > 0) ||
                ($("#from_field").val() < 10 &&
                    $("#from_subfield").val().length > 0)
            ) {
                alert(
                    __(
                        "If the field is a control field, the subfield should be empty"
                    )
                );
                return false;
            }
        }
        if (action == "update_field") {
            if ($("#from_subfield").val().length <= 0) {
                alert(__("The source subfield should be filled for update."));
                return false;
            }
        }
        if ($("#from_field").val().length <= 0) {
            alert(__("The source field should be filled."));
            return false;
        }
        if (
            $("#conditional").val() == "if" ||
            $("#conditional").val() == "unless"
        ) {
            if ($("#conditional_field").val() == "") {
                alert(__("The conditional field should be filled."));
                return false;
            }
            if ($("#conditional_comparison").val() == "") {
                alert(
                    __("The conditional comparison operator should be filled.")
                );
                return false;
            }
            if (
                $("#conditional_value").val() == "" &&
                ($("#conditional_comparison").val() == "equals" ||
                    $("#conditional_comparison").val() == "not_equals")
            ) {
                if (
                    document.getElementById("conditional_regex").checked == true
                ) {
                    alert(
                        __(
                            "The conditional regular expression should be filled."
                        )
                    );
                    return false;
                } else {
                    alert(__("The conditional value should be filled."));
                    return false;
                }
            }
        }
    });

    $("#conditional_field,#from_field").change(function () {
        updateAllEvery();
    });

    $("#cancel_edit").on("click", function (e) {
        e.preventDefault();
        cancelEditAction();
    });

    $(".new_action").on("click", function (e) {
        e.preventDefault();
        cancelEditAction();
        $("#no_defined_actions").hide();
        $("#add_action").show();
        $("#action").focus();
    });

    $(".duplicate_template").on("click", function (e) {
        e.preventDefault();
        var template_id = $(this).data("template_id");
        $("#duplicate_a_template").val(template_id);
        $("#duplicate_current_template").val(1);
    });

    $("#createTemplate").on("shown.bs.modal", function (e) {
        e.preventDefault();
        $("#template_name").focus();
    });

    $("#duplicate_a_template").on("change", function (e) {
        e.preventDefault();
        if (this.value === "") {
            $("#duplicate_current_template").val("");
        } else {
            $("#duplicate_current_template").val(1);
        }
    });

    $(".edit_action").on("click", function () {
        var mmta_id = $(this).data("mmta_id");
        var mmta = $.grep(mmtas, function (elt) {
            return elt["mmta_id"] == mmta_id;
        });
        editAction(mmta[0]);
        updateAllEvery();
    });

    $("#templatest").kohaTable({}, table_settings);

    $(".confirm-delete-action").on("click", function () {
        return confirm(
            __("Are you sure you wish to delete this template action?")
        );
    });

    $(".confirm-delete-template").on("click", function () {
        return confirm(__("Are you sure you wish to delete this template?"));
    });

    $("#to_field_regex").on("change", function () {
        onToFieldRegexChange(this);
    });

    $("#conditional_regex").on("change", function () {
        onConditionalRegexChange(this);
    });

    $("#conditional").on("change", function () {
        onConditionalChange(this);
    });

    $("#conditional_comparison").on("change", function () {
        onConditionalComparisonChange(this);
    });
});

function updateAllEvery() {
    if ($("#conditional_field").is(":visible")) {
        if (
            $("#conditional_field").val() == $("#from_field").val() &&
            $("#from_field").val().length > 0
        ) {
            $("#field_number option[value='0']").html(__("Every"));
        } else {
            $("#field_number option[value='0']").html(__("All"));
        }
    }
}

function onActionChange(selectObj) {
    // get the index of the selected option
    var idx = selectObj.selectedIndex;

    // get the value of the selected option
    var action = selectObj.options[idx].value;

    switch (action) {
        case "delete_field":
            show("field_number_block");
            hide("with_value_block");
            hide("to_field_block");
            break;

        case "add_field":
            hide("field_number_block");
            show("with_value_block");
            hide("to_field_block");
            break;

        case "update_field":
            hide("field_number_block");
            show("with_value_block");
            hide("to_field_block");
            break;

        case "move_field":
            show("field_number_block");
            hide("with_value_block");
            show("to_field_block");
            break;

        case "copy_field":
            show("field_number_block");
            hide("with_value_block");
            show("to_field_block");
            break;

        case "copy_and_replace_field":
            show("field_number_block");
            hide("with_value_block");
            show("to_field_block");
            break;
    }
}

function onConditionalChange(selectObj) {
    // get the index of the selected option
    var idx = selectObj.selectedIndex;

    // get the value of the selected option
    var action = selectObj.options[idx].value;

    switch (action) {
        case "":
            hide("conditional_block");
            break;

        case "if":
        case "unless":
            show("conditional_block");
            break;
    }
}

function onConditionalComparisonChange(selectObj) {
    // get the index of the selected option
    var idx = selectObj.selectedIndex;

    // get the value of the selected option
    var action = selectObj.options[idx].value;

    switch (action) {
        case "equals":
        case "not_equals":
            show("conditional_comparison_block");
            break;

        default:
            hide("conditional_comparison_block");
            break;
    }
}

function onToFieldRegexChange(checkboxObj) {
    if (checkboxObj.checked) {
        show("to_field_regex_value_block");
    } else {
        hide("to_field_regex_value_block");
    }
}

function onConditionalRegexChange(checkboxObj) {
    if (checkboxObj.checked) {
        $("span.match_regex_prefix").show();
        $("span.match_regex_suffix").show();
    } else {
        $("span.match_regex_prefix").hide();
        $("span.match_regex_suffix").hide();
    }
}

function show(eltId) {
    let elt = document.getElementById(eltId);
    elt.style.display = "inline";
}

function hide(eltId) {
    clearFormElements(eltId);
    let elt = document.getElementById(eltId);
    elt.style.display = "none";
}

function clearFormElements(divId) {
    let myBlock = document.getElementById(divId);

    var inputElements = myBlock.getElementsByTagName("input");
    for (var i = 0; i < inputElements.length; i++) {
        switch (inputElements[i].type) {
            case "text":
                inputElements[i].value = "";
                break;
            case "checkbox":
                inputElements[i].checked = false;
                break;
        }
    }

    var selectElements = myBlock.getElementsByTagName("select");
    for (var k = 0; k < selectElements.length; k++) {
        selectElements[k].selectedIndex = 0;
    }
}

function editAction(mmta) {
    $("#add_action").show();
    document.getElementById("mmta_id").value = mmta["mmta_id"];

    setSelectByValue("action", mmta["action"]);
    $("#action").change();

    setSelectByValue("field_number", mmta["field_number"]);

    document.getElementById("from_field").value = mmta["from_field"];
    document.getElementById("from_subfield").value = mmta["from_subfield"];
    document.getElementById("field_value").value = mmta["field_value"];
    document.getElementById("to_field").value = mmta["to_field"];
    document.getElementById("to_subfield").value = mmta["to_subfield"];
    if (
        mmta["regex_search"] == "" &&
        mmta["to_regex_replace"] == "" &&
        mmta["to_regex_modifiers"] == ""
    ) {
        $("#to_field_regex").prop("checked", false).change();
    } else {
        $("#to_field_regex").prop("checked", true).change();
        $("#to_regex_search").val(mmta["to_regex_search"]);
        $("#to_regex_replace").val(mmta["to_regex_replace"]);
        $("#to_regex_modifiers").val(mmta["to_regex_modifiers"]);
    }

    setSelectByValue("conditional", mmta["conditional"]);
    $("#conditional").change();

    document.getElementById("conditional_field").value =
        mmta["conditional_field"];
    document.getElementById("conditional_subfield").value =
        mmta["conditional_subfield"];

    setSelectByValue("conditional_comparison", mmta["conditional_comparison"]);
    $("#conditional_comparison").change();

    document.getElementById("conditional_value").value =
        mmta["conditional_value"];

    document.getElementById("conditional_regex").checked = parseInt(
        mmta["conditional_regex"]
    );
    $("#conditional_regex").change();

    document.getElementById("description").value = mmta["description"];

    window.modaction_legend_innerhtml =
        document.getElementById("modaction_legend").innerHTML;
    document.getElementById("modaction_legend").innerHTML = __(
        "Edit action %s"
    ).format(mmta["ordering"]);

    window.action_submit_value = document.getElementById("action_submit").value;
    document.getElementById("action_submit").value = __("Update action");
}

function cancelEditAction() {
    document.getElementById("mmta_id").value = "";

    setSelectByValue("action", "delete_field");
    $("#action").change();

    document.getElementById("from_field").value = "";
    document.getElementById("from_subfield").value = "";
    document.getElementById("field_value").value = "";
    document.getElementById("to_field").value = "";
    document.getElementById("to_subfield").value = "";
    $("#to_regex_search").val("");
    $("#to_regex_replace").val("");
    $("#to_regex_modifiers").val("");
    $("#description").val("");

    $("#to_field_regex").prop("checked", false).change();

    setSelectByValue("conditional", "");
    $("#conditional").change();

    document.getElementById("conditional_field").value = "";
    document.getElementById("conditional_subfield").value = "";

    setSelectByValue("conditional_comparison", "");
    $("#conditional_comparison").change();

    document.getElementById("conditional_value").value = "";

    document.getElementById("conditional_regex").checked = false;

    document.getElementById("modaction_legend").innerHTML =
        window.modaction_legend_innerhtml;
    document.getElementById("action_submit").value = window.action_submit_value;

    if ($("#template_actions").length < 1) {
        $("#no_defined_actions").show();
    }

    $("#add_action").hide();
}

function setSelectByValue(selectId, value) {
    let s = document.getElementById(selectId);

    for (let i = 0; i < s.options.length; i++) {
        if (s.options[i].value == value) {
            s.selectedIndex = i;
        }
    }
}
