﻿var GenInvest = {
    NFunds : {}
};

GenInvest.NFunds.Search = function (category, family, ISIN, categoryData, familyData, ISINData) {
    this.Category = $('#' + category.ElementId);
    this.CategoryData = $.map(categoryData, function (arr) { return { CID: arr[0], Name: arr[1]} });

    this.Family = $('#' + family.ElementId);
    this.FamilyData = $.map(familyData, function (arr) { return { CID: arr[0], FID: arr[1], Name: arr[2]} });

    this.ISIN = $('#' + ISIN.ElementId);
    this.ISINData = $.map(ISINData, function (arr) { return { CID: arr[0], FID: arr[1], ISIN: arr[2]} });
};

GenInvest.NFunds.Search.prototype = {
    GetCategory: function (id) {
        for (var i = 0; i < this.CategoryData.length; i++)
            if (this.CategoryData[i].CID == id)
                return this.CategoryData[i];
        return null;
    },
    Update: function () {
    },
    GetCategorySource: function (term) {
        return this.TransformToView(this.GetCategoryFiltered(term), term, function (obj) { return obj.Name });
    },
    GetCategoryFiltered: function (term) {
        var categoryByIsinTerm = $.map(this.FilterByTerm(this.ISINData, this.ISIN.val(), function (obj) { return obj.ISIN }), function (obj) { return obj.CID });
        var categoryByFamilyTerm = $.map(this.FilterByTerm(this.FamilyData, this.Family.val(), function (obj) { return obj.Name }), function (obj) { return obj.CID });
        var categoryByTerm = this.FilterByTermExact(this.CategoryData, term, function (obj) { return obj.Name });
        return $.grep(categoryByTerm, function (obj) { return $.inArray(obj.CID, categoryByIsinTerm) != -1 && $.inArray(obj.CID, categoryByFamilyTerm) != -1 });
    },
    FilterByCategory: function (data) {
        var categories = $.map(this.GetCategoryFiltered(this.Category.val()), function (obj) { return obj.CID });
        return $.grep(data, function (obj) { return $.inArray(obj.CID, categories) != -1 });
    },
    FilterByFamily: function (data) {
        var families = $.map(this.GetFamilyFiltered(this.Family.val()), function (obj) { return obj.FID });
        return $.grep(data, function (obj) { return $.inArray(obj.FID, families) != -1 });
    },
    FilterByTermExact: function (data, term, selector) {
        if (!term || term == '')
            return data;
        var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term) + "$", "i");
        var result = $.grep(data, function (obj) { return matcher.test(selector(obj)) });
        if (result.length > 0)
            return result;
        return this.FilterByTerm(data, term, selector);
    },
    FilterByTerm: function (data, term, selector) {
        if (!term || term == '')
            return data;
        var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
        return $.grep(data, function (obj) { return matcher.test(selector(obj)) });
    },
    TransformToView: function (data, term, selector) {
        var prevCategory;
        var self = this;
        return $.map(data,
            function (obj) {
                var category, text = selector(obj);
                if (prevCategory != obj.CID && obj.FID != null) {
                    prevCategory = obj.CID;
                    category = self.GetCategory(obj.CID).Name;
                }
                return {
                    label: text.replace(
			                    new RegExp(
				                    "(?![^&;]+;)(?!<[^<>]*)(" +
				                    $.ui.autocomplete.escapeRegex(term) +
				                    ")(?![^<>]*>)(?![^&;]+;)", "gi"
			                    ), "<strong>$1</strong>"),
                    value: text,
                    groupTitle: category
                };
            })
    },
    GetFamilyFiltered: function (term) {
        var result = this.FilterByCategory(this.FamilyData);
        return this.FilterByTerm(result, term, function (obj) { return obj.Name });
    },
    GetFamilySource: function (term) {
        var familyByIsinTerm = $.map(this.FilterByTerm(this.ISINData, this.ISIN.val(), function (obj) { return obj.ISIN }), function (obj) { return obj.FID });
        var familyData = $.grep(this.GetFamilyFiltered(term), function (obj) { return $.inArray(obj.FID, familyByIsinTerm) != -1 });
        return this.TransformToView(familyData, term, function (obj) { return obj.Name });
    },
    GetISINSource: function (term) {
        var result = this.FilterByCategory(this.ISINData);
        result = this.FilterByFamily(result);
        result = this.FilterByTerm(result, term, function (obj) { return obj.ISIN });
        return this.TransformToView(result, term, function (obj) { return obj.ISIN });
    },
    Reset: function () {
        this.Category.val('');
        this.ISIN.val('');
        this.Family.val('');
        //this.Update();
        eval(this.SearchPostback);
    },
    OnCategoryChange: function () {
        //this.SelectedCategory = this.GetCategory(this.Category.children(":selected").val());
        this.Update();
    },
    OnFamilyChange: function () {
        //triggered when family is selected. see combobox.select
        this.Update();
    },
    OnISINChange: function () {
        //triggered when isin is selected. see combobox.select
        this.Update();
    }
};
