﻿var Catalog = {
    internal: {
        FilterTable: "filters",
        Hwnd: null,
        CancelFiltersID: null, //Идентификатор кнопки отмена всех выбранных фильтров
        GetInputElements: function (objParentId) {
            var obj = Utils.GetObjectFromId(objParentId);
            var inputs = new Array();
            return inputs.concat(obj.getElementsByTagName("input"), obj.getElementsByTagName("select"));
        },
        GetFilterValueId: function (sender) {
            var fval = sender.attributes["fid"];
            if (fval == undefined)
                return "";
            else
                return this.GetFilterId(sender.parentNode) + fval.value;
        },
        GetFilterId: function (sender) {
            var node = sender;
            if (node == null || node.id == "filters")
                return "";
            else if (node.attributes["fid"] == undefined)
                return this.GetFilterId(node.parentNode);
            else
                return node.attributes["fid"].value;
        },
        GetFilterGroupBody: function (sender) {
            var node = sender;
            while (node != null && node.id.indexOf("f_") == -1)
                node = node.parentNode;
            return node;
        },
        GetFilterGroupHead: function (sender) {
            var node = sender;
            if (node.id.indexOf("f_") > -1) {
                do {
                    node = node.previousSibling;
                } while (node != null && node.tagName != "TR");
                return node == null ? null : node.getElementsByTagName("TD")[0];
            }
            else
                return this.GetFilterGroupHead(this.GetFilterGroupBody(sender));
        }
    },
    //Установить фокус на элементе. Необходимо при пейджинге
    SetFocus: function (element) {
        element = Utils.GetObjectFromId(element);
        window.scrollTo(0, element.offsetTop);
    },
    SetCancelFilterID: function (id) { this.internal.CancelFiltersID = id; },
    OnLoad: function () {
        if (document.getElementById) {
            this.internal.Hwnd = this.OnKeyPress.bind(this); //При добавлении Listener'ов в FF 3.5, в MSAJAX происходит ошибка
            //Utils.AttachEvent("keydown",document,this.internal.Hwnd);
            /*if(document.addEventListener) document.addEventListener("keydown",this.internal.Hwnd,false);
            else if(document.attachEvent) document.attachEvent("onkeydown",this.internal.Hwnd);
            else */
            document.onkeydown = this.internal.Hwnd;
        }
    },
    OnKeyPress: function (e) {
        var code;
        if (!e) var e = window.event;
        if (e.keyCode) code = e.keyCode;
        else code = e.whitch;
        if (code == 27 && this.internal.CancelFiltersID != null && document.getElementById(this.internal.CancelFiltersID) != null) {
            eval(document.getElementById(this.internal.CancelFiltersID).href);
            return false;
        }
    },
    CollectFilters: function (strField, bValues) {
        objField = document.getElementById(strField);
        objField.value = "";
        var inputs = this.internal.GetInputElements(this.internal.FilterTable);
        for (var loop = 0; loop < inputs[0].length; loop++) {
            var input = inputs[0][loop];
            if (input.type == "checkbox" && input.checked)
                objField.value += (bValues ? input.value : this.internal.GetFilterValueId(input.parentNode)) + ";";
            else if (input.type == "radio" && input.checked && input.value != "")
                objField.value += input.value + ";";
        }
    },
    CollectRangeFilters: function () {
        var inputs = this.internal.GetInputElements(this.internal.FilterTable);
        for (var loop = 0; loop < inputs[0].length; loop++) {
            var input = inputs[0][loop];
            if (input.type == "hidden" && input.id.indexOf("hfFilterID") > -1) {
                var objText = input.nextSibling, objText1 = null, objText2 = null;
                var value = "";
                while (objText != null) {
                    /*if(objText.type=="text")
                    value+=value.length==0?objText.value:"*"+objText.value;*/
                    if (objText.type == "text")
                        if (objText1 == null) objText1 = objText;
                        else objText2 = objText;
                    objText = objText.nextSibling;
                }
                if (objText1 != null && objText2 != null && (objText1.value != "" || objText2.value != ""))
                    input.value = input.attributes["key"].value + objText1.value + "r" + objText2.value;
                else
                    input.value = "";
                //if(value.length==0) inputs[0][loop].value="";
                //else inputs[0][loop].value=inputs[0][loop].attributes["key"].value+value;
            }
        }
    },
    ClearFilters: function () {
        var inputs = this.internal.GetInputElements(this.internal.FilterTable);
        for (var loop = 0; loop < inputs.length; loop++)
            for (var innerLoop = 0; innerLoop < inputs[loop].length; innerLoop++) {
                var oldValue;
                var input = inputs[loop][innerLoop];
                switch (input.type) {
                    case "checkbox":
                        oldValue = input.checked;
                        input.checked = false;
                        break;
                    case "radio":
                        oldValue = input.value != "" && input.checked;
                        input.checked = input.value == "";
                        break;
                    case "text":
                    case "select":
                        oldValue = input.value;
                        input.value = "";
                        break;
                    default:
                        if (input.tagName == "SELECT") {
                            oldValue = input.value;
                            input.value = "";
                        }
                }
                if (oldValue) Catalog.FilterChanged(input);
            }
    },
    FilterChanged: function (objTarget) {
        var objBody = this.internal.GetFilterGroupBody(objTarget);
        var objHead = this.internal.GetFilterGroupHead(objBody);
        var inputs = this.internal.GetInputElements(objBody);
        for (var loop = 0; loop < inputs.length; loop++)
            for (var innerLoop = 0; innerLoop < inputs[loop].length; innerLoop++) {
                var input = inputs[loop][innerLoop];
                switch (input.type) {
                    case "checkbox":
                        if (input.checked) {
                            objHead.style.fontWeight = "bold";
                            return;
                        }
                        break;
                    case "radio":
                        if (input.checked && input.value != "") {
                            objHead.style.fontWeight = "bold";
                            return;
                        }
                        break;
                    case "select":
                    case "text":
                        if (input.value != "") {
                            objHead.style.fontWeight = "bold";
                            return;
                        }
                        break;
                    default:
                        if (input.tagName == "SELECT" && input.value != "") {
                            objHead.style.fontWeight = "bold";
                            return;
                        }
                }
            }
        objHead.style.fontWeight = "normal";
    },
    ToggleFilters: function (isOpen, baseClass) {
        var rows = document.getElementById(this.internal.FilterTable).getElementsByTagName("TR");
        for (i = 0; i < rows.length; i++)
            if (rows[i].id.indexOf("f_") > -1)
                rows[i].style.display = isOpen ? "" : "none";
            else if (rows[i].firstChild.onclick != null)
                rows[i].firstChild.className = baseClass + (isOpen ? " expanded" : " collapsed");
    },
    //Раскрыть блок фильтров
    ToggleFilterNode: function (sender) {
        var blocksRoot = $(sender == null ? ("#" + this.internal.FilterTable) : sender.parentNode);
        var on = sender == null || sender.style.display == "";

        $("ul", blocksRoot)[on ? "removeClass" : "addClass"]("fList");
        $("div.fogExpand", blocksRoot).each(function() {
            sender && (sender.style.display = on ? "none" : "");
            $(this)[on ? "hide" : "show"]();
        });
    }
};
Catalog.internal.Hwnd=Catalog.OnLoad.bind(Catalog);
Utils.AttachEvent('load',window,Catalog.internal.Hwnd);
