﻿///<reference path="jquery-1.3.2-vsdoc2.js">
///<reference path="productsFilter.js">


Array.prototype.contains = function(element) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == element) {
            return true;
        }
    }
    return false;
}

Array.prototype.indexOf = function(obj) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == obj) {
            return i;
        }
    }
}

function getArrayIntersect(obj, obj2) {
    var ResObj = new Object();
    for (var c in obj) {
        if (c in obj2) {
            ResObj[c] = true;
        }
    }
    return ResObj;
}

function getObjArrayIntersect(obj, arr2) {
    var ResObj = new Object();
    for (i = 0; i < arr2.length; i++) {
        var c = arr2[i];
        if (c in obj) {
            ResObj[c] = true;
        }
    }
    return ResObj;
}

function convertArray2Object(obj, arr2) {
    for (i = 0; i < arr2.length; i++) {
        var c = arr2[i];
        obj[c] = true;
    }
}

function getArrayUnique(obj, arr2) {
    for (var i = 0; i < arr2.length; i++) {
        obj[arr2[i]] = true;
    }
    return obj;
}

// FilterObj class
function FilterObj(id, grId) {
    this.ID = id;
    this.GroupID = grId;
}

var GFiltersGroups = {};
var FiltersIds = [];

$(document).ready(function() {    
    fillFilterIDs();
});


function fillFilterIDs() {
    FiltersIds = [];
    $.each($(".pfl_r"), function() {
    //if ($(this).css("display") != "none") 
        {
            var IdStr = $(this).attr("ID");
            FiltersIds.push(new FilterObj(IdStr.slice(3, IdStr.length), $(this).attr("groupID"))); // 3 - it's a "add" prefix length
        }
    });
}
 

// добавить/удалить фильтр
function AddFilter(filterId, groupId, rem) {

    if (GFiltersGroups[groupId] == null)
        GFiltersGroups[groupId] = new Array();

    if (rem) {
        if (!GFiltersGroups[groupId].indexOf) alert('indexOf');
        GFiltersGroups[groupId].splice(GFiltersGroups[groupId].indexOf(filterId), 1);
        $("#act" + filterId).hide();
        $("#add" + filterId).show();
    }
    else {
        if (!GFiltersGroups[groupId].contains(filterId))
            GFiltersGroups[groupId].push(filterId);
        $("#add" + filterId).hide();
        $("#act" + filterId).show();
        $("#actFilterTab_frame").show();
    }

    Gpn = 1;

    if (ifNeedSaveToHistory) {
        FilterIdF = filterId;
        GroupIdF = groupId;
        RemF = rem ? "true" : "false";
        CountF += 1;
        SetHistotyPoint();
    }
    AffectAllFilters();

    SerializeToCookie();
    
}


function DrawFilterControl() {

    var tables = ["actFilterTab", "addFiltersTab"];

    $.each(tables, function() {
        var TabName = this;
        var CurrTab = $("#" + TabName);
        CurrTab.find(".isGroup").each(function() {
            var grID = $(this).attr("ID");
            var cGroup = this;
            grID = grID.slice(5, grID.length); // 5 - it's a "addGr" prefix length

            var v = false;
            CurrTab.find("tr[groupID='" + grID + "']").each(function() {
                if ($(this).css("display") != "none") { v = true; return; }
            });
            v ? $(cGroup).show() : $(cGroup).hide();
        });

        var header = CurrTab.find("#FiltersHeader");
        var v = false;
        CurrTab.find(".isGroup").each(function() {
            if ($(this).css("display") != "none") { v = true; return; }
        });

        v ? header.show() : header.hide();

        if (TabName == "actFilterTab") {
            $("#actFilterTab_bottom, #actFilterTab_frame").toggle(v);
        }
        else {
            var b = $("#actFilterTab_bottom").is(":visible");
            $("#addFiltersTab_top").toggle(b && v);
            $("#addFilterTab_bottom").toggle(v);
        }
    });
}



function GetFilteredProdIdsV1(justCount) {
    var resProdIdsArr = {};
    var grCount = 0;

    if (HasFilters() > 0) {
        for (var gi in GFiltersGroups) { //проходит сравнение со всеми группами выбраных фильтров.
            if (isNaN(parseInt(gi))) continue;

            var cGr = GFiltersGroups[gi];
            var TcFilterProds = {};
            if (cGr.length > 0) {       //каждая группа
                grCount++;
                TcFilterProdsIsEmpty = true; // флаг для мультигрупп
                $(cGr).each(function() {
                    var cFilterProds = init_filters[this]; // находим фильтр с его товарами
                    if (typeof (cFilterProds) != 'undefined') {
                        if (!multiple_groups_IDs.contains(gi))  // обычный способ
                            getArrayUnique(TcFilterProds, cFilterProds); // union
                        else {
                            if (TcFilterProdsIsEmpty) {
                                convertArray2Object(TcFilterProds, cFilterProds);
                                TcFilterProdsIsEmpty = false;
                            }
                            else
                                TcFilterProds = getObjArrayIntersect(TcFilterProds, cFilterProds); // intersect goods of all filters in group
                        }
                    }
                    else
                        TcFilterProds = {};
                });

                if (grCount == 1)
                    resProdIdsArr = TcFilterProds;
                else
                    resProdIdsArr = getArrayIntersect(resProdIdsArr, TcFilterProds);  // groups intersect
            }
        }

        if (!justCount) ModifyAllProdsDataByFilters(resProdIdsArr);
    }

    return resProdIdsArr;
}

function ModifyAllProdsDataByFilters(nProdIds) {

    var tmpArr = [];

    $.each(AllProductsData, function() { // проходим по всем продуктам
        var cProd = this;

        if (nProdIds[cProd.ID] == true)
            tmpArr.push(cProd);
    });
    AllProductsData = tmpArr;
}

function HasFilters() {
    var n = 0;
    for (var gi in GFiltersGroups) {
        if (!isNaN(parseInt(gi)) && GFiltersGroups[gi].length > 0)
        { n = 1;return n;}
    }
    return n; 
}

function CountFuture(cbFunc) {

    $("#addFiltersTab").show();

    var CurrCount = GetRealFilteredProdIDs(GetFilteredProdIdsV1(true));
    //var CurrCount = GetFilteredProdIdsV1(true);

    $.each(FiltersIds, function() {

        var isPlus = false;

        if ((GFiltersGroups[this.GroupID] == null) || (typeof (GFiltersGroups[this.GroupID]) == 'undefined')) {
            GFiltersGroups[this.GroupID] = [];
        }

        if (!GFiltersGroups[this.GroupID].contains(this.ID)) {
            isPlus = GFiltersGroups[this.GroupID].length > 0 && !multiple_groups_IDs.contains(this.GroupID);

            GFiltersGroups[this.GroupID].push(this.ID);

            var Calculated = GetRealFilteredProdIDs(GetFilteredProdIdsV1(true));
            //var Calculated = GetFilteredProdIdsV1(true);

            var cRow = $("#addFiltersTab tr[id='add" + this.ID + "']");

            (Calculated == 0) || (isPlus && ((Calculated - CurrCount) == 0)) ? cRow.hide() : cRow.show();
            cRow.find("td").find("span").text(" (" + (isPlus ? "+" : "") + (isPlus ? (Calculated - CurrCount) : Calculated) + ")");

            GFiltersGroups[this.GroupID].splice(GFiltersGroups[this.GroupID].length - 1, 1);
        }
    });

    DrawFilterControl();

    if (cbFunc)
        cbFunc.apply();
}

function GetRealFilteredProdIDs(calcArr) {
    var count = 0;
    /*$.each(AllProductsData, function() {
    var cProd = this;
        if (calcArr[cProd.ID]==1)
            count++;
    });*/

    for (var c in calcArr) {
        count++;
    }
    
    return count;
}

function ClearFilters() {
    GFiltersGroups = [];
    $(".pfl_r").show();
    $(".pfl_ra").hide();
    Gpn = 1;
    setCookie("Sel_filters", "");
    AffectAllFilters();
}

function SerializeToCookie() {
    var resStr = "";
    for (var gi in GFiltersGroups) {
        if (isNaN(parseInt(gi))) continue;
        if (GFiltersGroups[gi].length > 0)
            resStr += "<" + gi + ":" + GFiltersGroups[gi].toString() + ">";
    }
    setCookie("Sel_filters", resStr);
    setCookie("Sel_filtersProdClass", SearchClassID);
}

function readFiltersFromCookie() {
    var cClass = getCookie("Sel_filtersProdClass");
    if (cClass != SearchClassID || SearchClassID == 0) {
        setCookie("Sel_filters", "");
    }

    var fStr = getCookie("Sel_filters");
    var rx = new RegExp("<(.*?)>", "g");
    var matches = fStr.match(rx);
    if (matches) {
        $.each(matches, function() {
            var c = this.substr(1, (this.length - 2)); // remove "<, >"
            var splittedStr = c.split(":");
            var GrID = splittedStr[0];
            var cFiltersIDs = splittedStr[1].split(",");
            GFiltersGroups[GrID] = cFiltersIDs;
            $.each(cFiltersIDs, function() {
                var tf = this;
                $("#act" + tf).show();
                $("#add" + tf).hide();
            });
        });
        
        GetFilteredProdIdsV1();
        DrawPageLister();
        AllProductsData = AllCachedData.Products;
    }
}
