﻿function MajorRetailerListing(id, data) {
    this.id = id;
    this.data = data;
    this.cat_list = null;
    this.group_list = null;

    this.init = function() {
        var holder = $(this.id);
        holder._majorRetailerListing = this;

        var hgroup = $('selGroup');
        var hcategory = $('selCategory');
        var cbavailable = $('cbAvailable');
        var ctrl = this;
        if (hgroup && hcategory) {
            hgroup.onchange = function() { ctrl.fillCategoryFilter(); }
            hcategory.onchange = function() { ctrl.render(); }
            if (cbavailable) cbavailable.onclick = function() { ctrl.render(); }
        }
        
        this.initHierarchy();
        this.fillGroupFilter();
        
        new Autocomplete({ id: 'txtSearch', tipcss: 'txt_tip', listdelegate: function(txt) { return ctrl.findRetailer(txt); } });
    }

    this.render = function() {
        var holder = $(this.id);
        var hgroup = $('selGroup');
        var hcategory = $('selCategory');
        var cbavailable = $('cbAvailable');
        var txtsearch = $('txtSearch');
        if (holder && hgroup && hcategory && txtsearch) {
            var search = txtsearch.value.toLowerCase();
            var gid = parseInt(hgroup.options[hgroup.selectedIndex].value);
            var cid = parseInt(hcategory.options[hcategory.selectedIndex].value);
            var avl = (!cbavailable || cbavailable.checked);

            var html = new Array();

            html[html.length] = '<table>';
            html[html.length] = '<colgroup>';
            html[html.length] = '<col width="40"/>';
            html[html.length] = '<col width="130"/>';
            html[html.length] = '<col width="80"/>';
            html[html.length] = '<col/>';
            html[html.length] = '</colgroup>';
            html[html.length] = '<thead>';
            html[html.length] = '<tr>';
            html[html.length] = '<th></th>';
            html[html.length] = '<th class="hleft">Name</th>';
            html[html.length] = '<th class="hcenter"># of Locations</th>';
            html[html.length] = '<th class="hleft">Category</th>';
            html[html.length] = '</tr>';
            html[html.length] = '</thead>';
            html[html.length] = '<tbody>';

            var idx = 0;
            for (var i = 0; i < this.data.Retailers.length; i++) {
                var r = this.data.Retailers[i];

                if (!avl || r.F ) {
                    var match = false;
                
                    var cat_list = new Array();
                    for (var j = 0; j < r.H.length; j++) {
                        var catid = r.H[j];
                        var cat = eval('this.data.Categories.c' + catid);
                        if (cat) {
                            cat_list[cat_list.length] = cat.N;
                            if ((cid == 0 && gid == 0) || (cid != 0 && cid == catid) || (cid == 0 && gid == cat.G)) match = true;
                        }
                    }
                    
                    if (match) match = (search == null || search.length == 0 || r.N.toLowerCase().indexOf(search) == 0);

                    if (match) {
                        cat_list.sort();

                        html[html.length] = '<tr class="st' + (r.F == 0 ? 'd' : '') + (idx++ % 2 == 0 ? 1 : 2) + '">';
                        html[html.length] = '<td>' + idx + '</td>';
                        html[html.length] = '<td>' + r.N + '</td>';
                        html[html.length] = '<td class="hcenter">' + r.C + '</td>';

                        html[html.length] = '<td>';
                        html[html.length] = cat_list.join('<br/>');
                        html[html.length] = '</td>';

                        html[html.length] = '</tr>';
                    }
                }
            }

            html[html.length] = '</tbody>';
            html[html.length] = '</table>';

            if (idx == 0) {
                html = new Array();
                html[html.length] = '<div class="section"><span class="error">No retailers match specified critera</span><div>';
            }


            holder.innerHTML = html.join('\n');
        }
    }

    this.initHierarchy = function() {
        this.cat_list = new Array();
        this.group_list = new Array();

        var cat_hash = new Array();
        var group_hash = new Array();
        for (var i = 0; i < this.data.Retailers.length; i++) {
            var r = this.data.Retailers[i];
            if (r) {
                for (var j = 0; j < r.H.length; j++) {
                    var catid = r.H[j];
                    if (!cat_hash[catid]) {
                        cat_hash[catid] = 1;
                        var cat = eval('this.data.Categories.c' + catid);
                        if (cat) {
                            this.cat_list[this.cat_list.length] = { ID: catid, Name: cat.N, GroupID: cat.G };
                            if (!group_hash[cat.G]) {
                                group_hash[cat.G] = 1;
                                var gr = eval('this.data.Groups.c' + cat.G);
                                if (gr) {
                                    this.group_list[this.group_list.length] = { ID: cat.G, Name: gr };
                                }
                            }
                        }
                    }
                }
            }
        }

        this.cat_list.sort(function(a, b) {
            var n1 = a.Name.toLowerCase();
            var n2 = b.Name.toLowerCase();
            return (n2 < n1) - (n1 < n2);
        });

        this.group_list.sort(function(a, b) {
            var n1 = a.Name.toLowerCase();
            var n2 = b.Name.toLowerCase();
            return (n2 < n1) - (n1 < n2);
        });
    }

    this.fillGroupFilter = function() {
        var hgroup = $('selGroup');
        if (hgroup) {
            hgroup.options.length = 0;

            var o = new Option('All', 0);
            o.selected = true;
            hgroup.options.add(o);

            for (var i = 0; i < this.group_list.length; i++) {
                var g = this.group_list[i];
                var o = new Option(g.Name, g.ID);
                o.selected = false;
                hgroup.options.add(o);
            }
        }

        this.fillCategoryFilter();
    }

    this.fillCategoryFilter = function() {
        var hgroup = $('selGroup');
        var hcategory = $('selCategory');
        if (hgroup && hcategory) {
            hcategory.options.length = 0;

            var o = new Option('All', 0);
            o.selected = true;
            hcategory.options.add(o);

            var gid = parseInt(hgroup.options[hgroup.selectedIndex].value);
            for (var i = 0; i < this.cat_list.length; i++) {
                var c = this.cat_list[i];
                if (gid == 0 || c.GroupID == gid) {
                    var o = new Option(c.Name, c.ID);
                    o.selected = false;
                    hcategory.options.add(o);
                }
            }

        }
        
        this.findRetailer = function(txt) {
            var r = new Array();
            var t = txt.replace(/\W*/ig, '').toLowerCase();
            for (var i = 0; i < this.data.Retailers.length; i++) {
                var nn = this.data.Retailers[i].N.replace(/\W*/ig, '').toLowerCase();
                if (nn.indexOf(t) == 0) r[r.length] = this.data.Retailers[i].N;
            }
            return r;
        }

        this.render();
    }


    this.init();
}

function getMajorRetailerListing(id) {
    var holder = $(id);
    return (holder ? holder._majorRetailerListing : null);
}
