﻿/// Механики работы с адерсом
///

var clicked = false;
var inHolderId = "";

document.onclick = function(e) {
    e = e || event
    var target = e.target || e.srcElement

    do {
        var t = $(target);
        if (t.hasClass("popup")) {
            return
        } else if (t.hasClass("popupHolder")) {
            if (t.find(".popup").css("display") != "none") {
                return;
            }
        }
        target = target.parentNode
    } while (target)
    $(".popup").hide();
}

$(document).ready(function() {
    //initAddress($("#form" + idAddressPage + " #juridicalAddress"));

    var pp = $("div.popupHolder").find("div.popup");
    pp.click(function() {
        clicked = true;
    });
    pp.find("input[type=textbox]").click(function() { clicked = true; });

    $("div.popupHolder").focusin(function() {
        //alert('in');
        inHolderId = $(this).attr("id");
    });
    pp.focusin(function() {
        //alert('in');
        inHolderId = $(this).parent().attr("id");
    });
    pp.scroll(function() {
        //alert('scroll');
        //$(".fixheader").find("td").slice(0, 1).html("scroll " + Date());
        clicked = true;
    });
    //pp.focusout(function() { alert('out'); });
    $("div.popupHolder").focusout(function() {
        //$(".fixheader").find("td").slice(0, 1).html("out1 " + Date());
        //clicked = false;
        var div = $(this);
        setTimeout(function() {
            //alert('out');
            if (clicked || inHolderId == "") {
                //$(".fixheader").find("td").slice(0, 1).html("out2 " + Date());
                clicked = false;
                return;
            }
            //alert(clicked + ", " + inHolderId);
            //setTimeout('alert(clicked + ", " + inHolderId);', 0);
            inHolderId = "";
            findId = 0;
            div.children(".operabug").children(".popup").hide(); //fadeOut(1000);
            var text = div.children("input[type=text]").val();
            // если в эту хрень ничего не введено, то ...
            if (text == null || text == "") {
                // стираем данные из хидденов
                div.parent().children("input[type=hidden]").val("");
                // ошибки тоже нахуй
                div.parent().children("label.error").remove();
            }
            else {
                // иначе..
                var h = div.parent().children("input.value");
                var t = h.val();
                // если, ничего нет в хиддене
                if (t == null || t == "") {
                    // то заносим туда инфу из бокса
                    // это означает, что что-то втоптали ручками, а ни тыцкнули крысой в попуп
                    h.val(text);
                    // надо теперь ещё это свалидировать
                    adrDoValidation(div);
                }
            }
        }, 300);
    });

    $("input.PostalIndex").qtip({
        content: 'smile',
        show: {
            delay: 10,
            when: { event: 'focus' }
        },
        hide: { when: { event: 'unfocus'} },
        position: {
            corner: {
                target: 'leftMiddle',
                tooltip: 'leftMiddle'
            },
            adjust: { x: 150, y: 0 }
        },
        style: {
            name: 'cream', // Inherit from preset style
            tip: 'leftMiddle',
            width: 300
        },
        api: {
            beforeShow: function() {
                this.updateContent('Загрузка...');
                var tt = this;
                var box = $(this.elements.target);
                var form = box.parents("form").slice(0, 1);

                $.ajax({
                    type: "POST",
                    contentType: "application/x-www-form-urlencoded",
                    url: "/FillDocuments/FindPostalIndexes",
                    dataType: "json",
                    data: form.serialize(),
                    success: function(data) {
                        if (data.status == "success") {
                            var str = "";
                            $.each(data.data, function(i, item) {
                                // два индекса не бывает вроде на одной ячейке
                                var handler = 'alert($(this).parents("td").length)';
                                str += "<div><a href='javascript:'>" + item.index + "</a>&nbsp;<label>" + item.name + "</label></div>";
                            });
                            if (str == "") str = "<i>Ни чего не найдено</i>";
                            tt.updateContent(
                                    '<div class="tooltipInner">' +
                                    str +
                                    '</div>');
                            $(tt.elements.tooltip).find("a").click(function() {
                                var a = $(this);
                                var idx = a.html();
                                var tooltip = tt;
                                $(tooltip.elements.target).val(idx);
                                tooltip.hide();
                            });
                        }
                    }
                });
            }
        }
    });
});


// процедура инициализации адреса.
// её задача взять данные из хиденнов и проинициализировать комбы
function initAddress(table) {
    if (table.length < 1) return;

    var form = table.parents("form").slice(0,1);

    $.ajax({
        async: false,
        type: "POST",
        contentType: "application/x-www-form-urlencoded",
        url: "/FillDocuments/GetAddressKladrData?type=10",
        dataType: "json",
        data: form.serialize(),
        success: function(data) {
            if (data.status == "success") {
            
                var ddl = table.find("#RegionDDL");
                adrFillCombo(data.level2, ddl);
                ddl.val(data.level2Item);
                
                ddl = table.find("#CityDDL");
                adrFillCombo(data.level3, ddl);
                ddl.val(data.level3Item);
                
                ddl = table.find("#PlaceDDL");
                adrFillCombo(data.level4, ddl);
                ddl.val(data.level4Item);
                
                ddl = table.find("#StreetDDL");
                adrFillCombo(data.level5, ddl);
                ddl.val(data.level5Item);
            }
        },
        error: function(request) {
            alert("Во время передачи данных произошла ошибка: " + request.status + " " + request.statusText);
            window.location = this.url;
        }
    });


}

// заполяет комбу переданными данными
function adrFillCombo(data, combo) {
    if (combo.length < 1) return;
    combo.empty();
    combo.append('<option value="|">отсутствует</option>');
    if (data == null) return;
    $.each(data, function(i, item) {
        combo.append('<option value="' + item.val + '">' + item.name + '</option>');
    });
}

// обработчик смены значения в комбе
function adrOnChange(combo, type) {
    var ddl = $(combo);
    adrSetValue(ddl);
    adrUpdateCombos(ddl, type);
}

// задать выбранное значение
function adrSetValue(ddl) {
    var parent = ddl.parent();
    var strs = ddl.val().split("|");
    if (strs.length > 1) {
        parent.children("input.value").val(strs[0]);
        parent.children("input.kind").val(strs[1]);
    }
}

// обновить значения подчинённых комб
function adrUpdateCombos(ddl, type) {

    ddl.after('<img class="ajaxLoader" src="/Content/images/ajax-loader.gif" alt="Загружается..." />');
    var indicator = ddl.parent().children(".ajaxLoader");

    var form = ddl.parents("form").slice(0, 1);

    $.ajax({
        async: false,
        type: "POST",
        contentType: "application/x-www-form-urlencoded",
        url: "/FillDocuments/GetAddressKladrData?type=10",
        dataType: "json",
        data: form.serialize(),
        success: function(data) {
            if (data.status == "success") {

                if (type < 2) {
                    var ddl = form.find("#RegionDDL");
                    adrFillCombo(data.level2, ddl);
                    adrSetValue(ddl);
                }

                if (type < 3) {
                    ddl = form.find("#CityDDL");
                    adrFillCombo(data.level3, ddl);
                    adrSetValue(ddl);
                }

                if (type < 4) {
                    ddl = form.find("#PlaceDDL");
                    adrFillCombo(data.level4, ddl);
                    adrSetValue(ddl);
                }

                if (type < 5) {
                    ddl = form.find("#StreetDDL");
                    adrFillCombo(data.level5, ddl);
                    adrSetValue(ddl);
                }
            }
        },
        error: function(request) {
            alert("Во время передачи данных произошла ошибка: " + request.status + " " + request.statusText);
            window.location = this.url;
        }
    });

    indicator.remove();
}

var findId = 0;

function adrOnFocus(box, type) {
    adrProcessKey(box, type);
}

function adrOnKeyup(box, type) {
    adrClearFields(box, type);
    adrProcessKey(box, type);
}

function adrProcessKey(box, type) {
    clicked = false;
    findId = Math.random();
    var tb = $(box);
    var text = tb.val();
    var ddl = tb.parent().children(".operabug").children(".popup");
    tb.parent().parent().find("label.error").remove();

    if ($.browser.msie) {
        if ($.browser.msie && $.browser.version == 6) {
            ddl.width(tb.width()+4);
        }
        else {
            ddl.width(tb.width()+2);
        };
    }
    else {
        if ($.browser.opera) {
            ddl.width(tb.width()+2);
        }
        else {
            ddl.width(tb.width());
        };
    };

    
   // ddl.width(tb.width());
    
    
    
    var kind = tb.parent().parent().children(".kind");
    var name = tb.parent().parent().children(".value");
    var code = tb.parent().parent().children(".code");
    kind.val("");
    name.val("");
    code.val("");
    
    //if (type > 4 && text.length < 3) return;

    var form = tb.parents("form").slice(0, 1);
    var tempFindId = findId;
    ddl.empty();
    ddl.append("<i>Поиск...</i>");
    ddl.show();

    $.ajax({
        type: "POST",
        contentType: "application/x-www-form-urlencoded",
        url: "/FillDocuments/FindAddressKladrData?type=" + type,
        dataType: "json",
        data: form.serialize(),
        success: function(data) {
            if (tempFindId == findId) {
                if (data.status == "success") {
                    if (data.data != null) {
                        ddl.empty();
                        $.each(data.data, function(i, item) {
                            ddl.append("<div class='adrSearchRes' onclick='adrOnSearchResClick(this)'><label>" + item.caption + "</label>" +
                                "<input type='hidden' name='code' value='" + item.code + "' />" +
                                "<input type='hidden' name='name' value='" + item.name + "' />" +
                                "<input type='hidden' name='kind' value='" + item.kind + "' /></div>");
                        });
                        ddl.show();
                    }
                    if (ddl.children().length < 1) {
                        ddl.append("<label><i><b>Ничего не найдено</b></i></label>");
                    }
                }
            }
        },
        error: function(request) {
            alert("Во время передачи данных произошла ошибка: " + request.status + " " + request.statusText);
            window.location = this.url;
        }
    });

}

function adrOnBlur(box, type) {
    var tb = $(box);
    var ddl = tb.parent().children(".operabug").children(".popup");
    //ddl.hide();
}

function adrOnSearchResClick(elem) {
    var div = $(elem);
    var lbl = div.children("label");
    var name = div.children("input[name=name]").val();
    var kind = div.children("input[name=kind]").val();
    var code = div.children("input[name=code]").val();
    var cpt = lbl.text();
    // добавляем родителя чтоб поправить .operabug #559
    var ctrl = div.parent().parent().parent().parent();
    ctrl.children(".kind").val(kind);
    ctrl.children(".value").val(name);
    ctrl.children(".code").val(code);
    ctrl.children("div.popupHolder").children("input[type=text]").val(cpt);

    div.parent().hide();
    
    var lvl = 0;
    if (ctrl.children(".value").attr("name") == "Region") { lvl = 2; }
    else if (ctrl.children(".value").attr("name") == "City") { lvl = 3; }
    else if (ctrl.children(".value").attr("name") == "Place") { lvl = 4; }
    else if (ctrl.children(".value").attr("name") == "Street") { lvl = 5; }
    if (lvl > 0)
        adrClearFields(elem, lvl);
}

function onDisableKladrValidationChanged(box) {
//    var chk = $(box);
//    var parent = chk.parent().parent().parent();
//    var divs = parent.find("div.popupHolder").parent();
//    if (chk.val() == true) {
//        // скопировать значения из боксов в названия
//        adrSetNameFromBox(divs);
//    }
//    else {
//        adrClearUntestKladrValues(divs);
//    }
    return true;
}

function onAdrSubjectChange(combo) {
    adrClearFields(combo, 1);
}

function adrSetNameFromBox(divs) {
    // divs - <div class="ctrl">
    divs.each(function(idx) {
        var div = $(this);
        var text = div.find("input[type=text]");
        div.find("input.kind").val("");
        div.find("input.value").val(text);
        div.find("input.code").val("");
    });
}

function adrClearUntestKladrValues(divs) {

}

function adrDoValidation(div) {
    var p = div.parent();
    var hName = p.children("input.value");
    var hKind = p.children("input.kind");
    var hCode = p.children("input.code");
    var tBox = div.children("input[type=text]");
    var indicator = tBox.parent().children("img");
    if (indicator.length == 0) {
        tBox.after('<img src="/Content/images/ajax-loader.gif" alt="Проверяем..." />');
        indicator = tBox.parent().children("img");
    }
       
    var cp = currentPage;
    
    // имя нам надо для контроля, чтобы мы были уверены, что пока оно тама валидировалося
    // никто нового не вхуячил
    var name = hName.val();
    
    var type = 0;
    if (hName.attr("name") == "Region") {
        type = 2;
    }
    else if (hName.attr("name") == "City") {
        type = 3;
    }
    else if (hName.attr("name") == "Place") {
        type = 4;
    }
    else if (hName.attr("name") == "Street") {
        type = 5;
    }

    if (type < 2) return;

    var form = div.parents("form").slice(0, 1);

    $.ajax({
        type: "POST",
        contentType: "application/x-www-form-urlencoded",
        url: "/FillDocuments/ValidateAddressItemByKladr?type=" + type,
        dataType: "json",
        data: form.serialize(),
        success: function(data) {
            // не поменяли?
            if (hName.val() == name) {
                // вроде нет
                if (data.status == "success") {
                    // проверяем результат запроса
                    if (data.result == "found") {
                        // ура, нашли
                        hName.val(data.name);
                        hKind.val(data.kind);
                        hCode.val(data.code);
                        tBox.val(data.box);
                        p.find("label.error").remove();
                    }
                    else {
                        // что-то другое
                        var tb = div.find("input[type=text]");
                        SetValidationError(tb.parent().attr("id"), data.message, cp);
                    }
                }
            }

            indicator.remove();
        },
        error: function(request) {
            alert("Во время передачи данных произошла ошибка: " + request.status + " " + request.statusText);
            window.location = this.url;
        }
    });

}

/// Процедура обработки тычка на ссылку, про "я не могу найти адрес"
function onDisableKladrValidationLinkClick(link) {
    var l = $(link);
    var block = l.parent().parent().children(".dkvCkeckBlock");
    if (block.css("display") == "none") {
        $("#addressKladrFailDialog").dialog({
            position: "center",
            modal: true,
            width: 400,
            buttons: {
                "Да": function() {
                    block.css("display", "");
                    $(this).dialog("close");
                },
                "Нет - повторить поиск по базе": function() {
                    $(this).dialog("close");
                }
            },
            close: function(event, ui) {
                $(this).dialog("destroy");
            }

        });
    }
    else {
        block.css("display", "none");
    }
}

function adrDisableKladrValidationSetBlockVisibility(checkbox) {
    var chb = $(checkbox);
    var block = chb.parent().parent().parent().children(".dkvCkeckBlock");
    var check = chb.attr("checked");
    //alert(check);
    block.css("display", check ? "" : "none");
}

// очистить поля адреса ниже указанного типа
function adrClearFields(someElementOnTheForm, underLevel) {
    var form = $(someElementOnTheForm).parents("form").slice(0, 1);
    if (2 > underLevel) {
        var div = form.find("#RegionBox").parent().parent();
        adrClearField(div);
    }
    if (3 > underLevel) {
        var div = form.find("#CityBox").parent().parent();
        adrClearField(div);
    }
    if (4 > underLevel) {
        var div = form.find("#PlaceBox").parent().parent();
        adrClearField(div);
    }
    if (5 > underLevel) {
        var div = form.find("#StreetBox").parent().parent();
        adrClearField(div);
    }
    
    // вытираем так же данные из РО
    form.find("#Registrar").val("");
    form.find("#TaxInspectionCode").val("");
}

// очистить поля в диве
function adrClearField(div) {
    div.find("input.box").val("");
    div.children("input.kind").val("");
    div.children("input.value").val("");
    div.children("input.code").val("");
    div.find(".error").remove();
}

