/**
 * Compare
 */

var Compare = {
    /**
     * Form
     */
    form: undefined,

    /**
     * Submit form and send notice
     */
    submit: function (form) {
        this.form = form;

        if (!this.validateFields()) {
            alert("Не все обязательные поля заполнены.");
            return false;
        }

        if (typeof this.form != "undefined") {
            if (this.prepare()) {
                window.location = this.form.action;
            } else {
                alert("Не все обязательные поля заполнены.");
            }
        }

        return false;
    },

    /**
     * Prepare form for submit
     */
    prepare: function () {
        var formAction = '';

        for (var i = 0; i < this.form.length; i ++) {
            var tariffLink = this.form[i];
            var name       = tariffLink.name;
            var value      = tariffLink.value;

            if ((-1 != name.indexOf("link_")) && ("" != value)) {
                if ("" == formAction) {
                    formAction = value;
                } else {
                    formAction += "+" + value;
                }
            }
        }

        if ("" == formAction) {
            return false;
        }

        this.form.action += formAction + "/";

        return true;
    },

    /**
     * Validate form fields
     */
    validateFields: function () {
        var notEmptyCount = 0;

        for (var i = 0; i < this.form.length; i ++) {
            var operator = this.form[i];
            var name     = operator.name;
            var value    = operator.value;

            if ((-1 == name.indexOf("operator_")) || (0 == value)) {
                continue;
            }

            var tariff = document.getElementById("tariff_" + parseInt(name.substr(9, 1)));

            if (tariff && (0 != tariff.value)) {
                notEmptyCount ++;
            }
        }

        if (notEmptyCount < 2) {
            return false;
        }

        return true;
    },

    /**
     * Select operator
     */
    selectOperator: function (field, url) {
        this.form = field.form;

        var form       = this.form;
        var operator   = field;
        var fieldNum   = parseInt(operator.name.substr(9, 1));
        var tariff     = form.elements["tariff_" + fieldNum];
        var loading    = $("#tariff_" + fieldNum + "_loading");
        var operatorId = operator.value;
        var tariffLink = document.getElementById("link_" + fieldNum);

        tariff.disabled   = true;
        tariffLink.value  = '';
        tariff.length     = 1;

        $("optgroup", tariff).remove();

        if (!this.validateFields()) {
            form.submit.disabled = true;
        } else {
            form.submit.disabled = false;
        }

        CompareBlock.removeTariff("/compare/remove-tariff/", null, fieldNum);

        if (0 == operatorId) {
            return;
        }

        operator.disabled = true;
        loading.addClass("loading");

        $.post(url, { id: operatorId },
            function (data, textStatus) {
                if (textStatus == "success") {
                    operator.disabled = false;
                    loading.removeClass("loading");

                    if (data.code == 0) {
                        for (var key in data.message['tariffs']) {
                            var optGroup = $("<optgroup label='"
                                         + data.message['types'][key]
                                         + "'></optgroup>");

                            for (var tariffKey in data.message['tariffs'][key]) {
                                optGroup.append("<option value='" + tariffKey + "'>"
                                              + data.message['tariffs'][key][tariffKey]
                                              + "</option>");
                                /*
                                optGroup.append(new Option(
                                    data.message['tariffs'][key][tariffKey],
                                    tariffKey
                                ));
                                */
                            }

                            $(tariff).append(optGroup);
                        }

                        tariff.disabled = false;
                    } else {
                        alert("Ошибка ответа");
                    }
                } else {
                    alert("Ошибка отправки");
                }
            }, "json"
        );
    },

    /**
     * Select tariff
     */
    selectTariff: function (field, url) {
        this.form = field.form;

        var form       = this.form;
        var tariff     = field;
        var fieldNum   = parseInt(tariff.name.substr(7, 1));
        var operator   = form.elements["tariff_" + fieldNum];
        var loading    = $("#tariff_" + fieldNum + "_loading");
        var tariffId   = operator.value;
        var tariffLink = document.getElementById("link_" + fieldNum);

        tariffLink.value = '';

        if (!this.validateFields()) {
            form.submit.disabled = true;
        } else {
            form.submit.disabled = false;
        }

        CompareBlock.removeTariff("/compare/remove-tariff/", null, fieldNum);

        if (0 == tariffId) {
            return;
        }

        if (CompareBlock.isDuplicate(tariffId)) {
            alert('Данный тариф уже добавлен к сравнению.');
            tariff.value = 0;
            return;
        }

        tariff.disabled   = true;
        operator.disabled = true;
        loading.addClass("loading");

        $.post(url, { id: tariffId },
            function (data, textStatus) {
                if (textStatus == "success") {
                    operator.disabled = false;
                    loading.removeClass("loading");

                    if (data.code == 0) {
                        CompareBlock.addTariff("/compare/add-tariff/", tariffId, $("option:selected", tariff).text(), fieldNum);
                        tariffLink.value = data.message;
                        tariff.disabled = false;
                    } else {
                        alert("Ошибка ответа");
                    }
                } else {
                    alert("Ошибка отправки");
                }
            }, "json"
        );
    },

    /**
     * Remove tariff
     */
    removeTariff: function (form, num) {
        this.form = form;

        var operators = $("select[name^='operator_']", form);
        var tariffs   = $("select[name^='tariff_']", form);
        var links     = $("input[name^='link_']", form);

        if ((num > operators.length) || (num < 1)) {
            return false;
        }

        operators.get(num - 1).value = 0;

        tariffs.get(num - 1).length = 1;
        tariffs.get(num - 1).disabled = "disabled";

        links.get(num - 1).value = "";
    },

    /**
     * Clear form
     */
    clearForm: function (form) {
        this.form = form;

        var operators = $("select[name^='operator_']", form);
        var tariffs   = $("select[name^='tariff_']", form);
        var links     = $("input[name^='link_']", form);
        var submit    = $(":submit", form);

        operators.each(function (i) {
            this.value = 0;
        });

        tariffs.each(function (i) {
            this.length   = 1;
            this.disabled = 'disabled';
        });

        links.each(function (i) {
            this.value = '';
        });

        submit.attr("disabled", "disabled");
    }
};

/**
 * CompareBlock
 */

var CompareBlock = {
    /**
     * Form
     */
    form: undefined,

    /**
     * Submit
     */
    submit: function (url, form) {
        this.form = form;

        if (typeof this.form == "undefined") {
            alert('Ошибка.');
            return false;
        }

        if (!this.validateForm()) {
            alert('Тарифы для сравнения не выбраны.');
            return false;
        }

        this.prepareForm(url);

        return false;
    },

    /**
     * Validate form
     */
    validateForm: function () {
        var tariffs = $("input[name^='tariff_']", this.form);
        var empty   = $("input[value='0']", this.form);

        if (tariffs.length == empty.length) {
            return false;
        }

        return true;
    },

    /**
     * Prepare form
     */
    prepareForm: function (url) {
        var form    = this.form;
        var tariffs = $("input[name^='tariff_']", form);
        var ids     = '';

        tariffs.each(function (i) {
            if ('' != ids) {
                ids += ',';
            }

            ids += this.value;
        });

        $.post(url, { id: ids },
            function (data, textStatus) {
                if (textStatus == "success") {
                    if (data.code == 0) {
                        form.action += data.message + "/";
                        window.location = form.action;
                    } else {
                        alert("Ошибка ответа");
                    }
                } else {
                    alert("Ошибка отправки");
                }
            }, "json"
        );
    },

    /**
     * Check tariffs for a duplicate
     */
    isDuplicate: function (tariffId) {
        var form   = $("#compare_block_form");
        var tariff = $("input[name^='tariff_'][value='" + tariffId + "']", form);

        if (tariff.length) {
            return true;
        }

        return false;
    },

    /**
     * Clear list
     */
    clearList: function (url) {
        var form    = $("#compare_block_form");
        var tariffs = $("input[name^='tariff_']", form);
        var empty   = $("input[value='0']", form);
        var list    = $("#compare_block_form_list");
        var items   = $("li", list);
        var compareForm = document.getElementById('compare_form');

        if (0 == tariffs.length) {
            alert("Ошибка.");
            return false;
        }

        if (tariffs.length == empty.length) {
            return false;
        }

        $("#compare_block_form_link").show().removeClass("hidden");
        form.get(0).submit.disabled = true;

        tariffs.each(function (i) {
            this.value = 0;
        });

        items.each(function (i) {
            $(this).html("&nbsp;").hide();
        });

        $("#compare_add").show().removeClass("hidden");
        $("#compare_remove").hide();

        if (compareForm) {
            Compare.clearForm(compareForm);
        }

        $.post(url, { },
            function (data, textStatus) {
                if (textStatus == "success") {
                    if (data.code != 0) {
                        alert("Ошибка ответа");
                    }
                } else {
                    alert("Ошибка отправки");
                }
            }, "json"
        );

        return false;
    },

    /**
     * Add tariff
     */
    addTariff: function (url, tariffId, tariffName, fieldNum) {
        var form    = $("#compare_block_form");
        var tariffs = $("input[name^='tariff_']", form);
        var empty   = $("input[value='0']", form);
        var list    = $("#compare_block_form_list");
        var items   = $("li", list);

        if (0 == tariffs.length) {
            alert("Ошибка.");
            return false;
        }

        if (fieldNum && ((fieldNum > tariffs.length) || (fieldNum < 1))) {
            return false;
        }

        if (!fieldNum && (0 == empty.length)) {
            alert('Одновременно можно сравнивать не более 4-х тарифов.');
            return false;
        }

        if (fieldNum) {
            var oldTariff = tariffs.get(fieldNum - 1);

            if (0 == oldTariff.value) {
                empty.length --;
            }

            oldTariff.value = tariffId;
        } else {
            if (this.isDuplicate(tariffId)) {
                alert('Данный тариф уже добавлен к сравнению.');
                return;
            }

            empty.get(0).value = tariffId;
            empty.length --;
        }

        tariffs.each(function (i) {
            var listItem = items.eq(i);

            if (tariffId == this.value) {
                var removeLink = "<a href='#' class='compare_remove' "
                               + "onclick='return CompareBlock.removeTariff(\"/compare/remove-tariff/\", "
                               + tariffId + ", null);' title='Удалить тариф из сравнения'>"
                               + "&nbsp;"
                               + "</a>";
                listItem.html(removeLink + "<div>" + tariffName + "</div>");
                listItem.show().removeClass("hidden");
            }
        });

        $("#compare_block_form_link").hide();
        list.removeClass("hidden");

        if ((tariffs.length - empty.length) >= 2) {
            form.get(0).submit.disabled = false;
        }

        $("#compare_add").hide();
        $("#compare_remove").show().removeClass("hidden");

        $.post(url, { id: tariffId },
            function (data, textStatus) {
                if (textStatus == "success") {
                    if (data.code != 0) {
                        alert("Ошибка ответа");
                    }
                } else {
                    alert("Ошибка отправки");
                }
            }, "json"
        );

        return false;
    },

    /**
     * Remove tariff
     */
    removeTariff: function (url, tariffId, fieldNum) {
        var form    = $("#compare_block_form");
        var tariffs = $("input[name^='tariff_']", form);
        var empty   = $("input[value='0']", form);
        var list    = $("#compare_block_form_list");
        var items   = $("li", list);
        var compareForm = document.getElementById('compare_form');

        if (0 == tariffs.length) {
            alert("Ошибка.");
            return false;
        }

        if (fieldNum && ((fieldNum > tariffs.length) || (fieldNum < 1))) {
            return false;
        }

        if (fieldNum) {
            var remove = $("input", form).eq(fieldNum - 1);
        } else {
            var remove = $("input[value='" + tariffId + "']", form);
        }

        if (0 == remove.length) {
            return false;
        }

        if (fieldNum) {
            var removeNum = fieldNum;
            tariffId = remove.val();
        } else {
            var removeNum = parseInt(remove.attr("name").substr(7, 1));
        }

        if (0 == removeNum) {
            return false;
        }

        remove.val(0);
        items.eq(removeNum - 1).html("&nbsp;").hide();
        empty.length ++;

        if (tariffs.length == empty.length) {
            $("#compare_block_form_link").show().removeClass("hidden");
        }

        if ((tariffs.length - empty.length) < 2) {
            form.get(0).submit.disabled = true;

            if (!fieldNum && compareForm) {
                compareForm.submit.disabled = true;
            }
        }

        $("#compare_add").show().removeClass("hidden");
        $("#compare_remove").hide();

        if (!fieldNum && compareForm) {
            Compare.removeTariff(compareForm, removeNum);
        }

        $.post(url, { id: tariffId },
            function (data, textStatus) {
                if (textStatus == "success") {
                    if (data.code != 0) {
                        alert("Ошибка ответа");
                    }
                } else {
                    alert("Ошибка отправки");
                }
            }, "json"
        );

        return false;
    }
};

