DevXMineralFilter = function DevXMineralFilter(name, defDesc, loadUrl, params){
    this.params = params;
    this.prefix = (typeof(params['prefix']) != 'undefined')? params['prefix'] : '';
    this.maxDesc = params['maxDesc'];
    this.name = name;
    this.loadUrl = loadUrl;
    this.defDesc = defDesc;
    this.filterArray = new Array();
    this.subFilterArray = new Array();
    this.tmpSubCheckArray = new Array();
    this.subFilterCount = 0;
    this.filterCount = 0;
    this.defFilterArray = new Array();
    this.defFilterCount = 0;
    this.defSubFilterArray = new Array();
    this.defSubFilterCount = 0;
    this.filterCancelFlag = false;
    this.header = (params['header'])? params['header'] : '';
    this.note = (params['note'])? params['note'] : '';
    this.footer = (params['footer'])? params['footer'] : '';
    this.subUrl = (params['suburl'])? params['suburl'] : '';
    this.tip = null;
    this.popupName = (params['popupName'])? params['popupName'] : 'filterPopup';
    this.selected_id = -1;
    this.selected_type = 2;
    this.clean = true;

    this.FilterMenu = new Ext.menu.FilterMenu({
        id: this.name+'Menu',
        minWidth : 149,
        allowOtherMenus : true,
        ignoreParentClicks : true,
        shadow : 'drop'
    });

    var f = this;
    this.FilterMenu.on('hide', function(menu){
        document.getElementById('errorPopup').style.display = 'none';
        var elem;
        for (var i=0; i < f.filterCount; i++){
            elem = Ext.get(f.name+'Link'+i);
            if (elem) elem.removeClass('info_current');
        }
        elem = Ext.get(f.name+'Sub');
        if (elem) elem.removeClass('info_current');
        menu_button.menuWasHidden = true;
        document.getElementById(f.popupName).style.display = 'none';
        if (!f.filterCancelFlag) f.hide();
        f.filterCancelFlag = false;
    });
    this.FilterMenu.on('show', f.addSubmenu, f);
    this.FilterMenu.on('show', function(menu){
        if (((f.MenuButton.getEl().hasClass('x-btn-over'))
                || (f.MenuButton.getEl().hasClass('x-btn-menu-active-over')))
                && (Ext.get(f.name+'OkLink')))
            Ext.get(f.name+'OkLink').addClass('selected');
    })

    var tb = new Ext.Toolbar();
    tb.render(this.name+'FilterMenu');

    var menu_button = new Ext.Toolbar.DevxButton({
            text:'',
            iconCls: '',
            eventBeforeMenu : true,
            menu: this.FilterMenu
        });
    menu_button.menuWasHidden = true;
    this.mbOvered = false;
    menu_button.on('mouseover', function(button, e){
        if (Ext.get(f.name+'OkLink')) Ext.get(f.name+'OkLink').addClass('selected');
        if ((button.menu) && (button.menu.isVisible()))
            button.getEl().addClass('x-btn-menu-active-over');
            else button.getEl().addClass('x-btn-over');
    });
    menu_button.on('mouseout', function(button, e){
        if (f.mbOvered) return;
        if (Ext.get(f.name+'OkLink')) Ext.get(f.name+'OkLink').removeClass('selected');
        button.getEl().removeClass('x-btn-menu-active-over');
        button.getEl().removeClass('x-btn-over');
    });
    menu_button.on('click', function(button, e){
        if (button.menu){
            var errorPopup = document.getElementById('errorPopup');
            errorPopup.style.display = 'none';
            var open_menu = true;
            if ((typeof(f.params['column_filter']) != 'undefined')
                && (typeof(Filters[f.params['column_filter']]) != 'undefined'))
            {
                var filter = Filters[f.params['column_filter']];
                if (!filter.MenuButton.menuWasHidden) {
                    open_menu = false;
                    errorPopup.style.position = 'absolute';
                    var el = Ext.get(f.name+'Filter');
                    var dom_el = Ext.getDom(el);
                    var x = 0;
                    while (dom_el.offsetParent){
                        x += dom_el.offsetLeft;
                        dom_el = dom_el.offsetParent;
                    }
                    //x = Math.ceil(x + el.getWidth()) - 10;
                    var y = el.getY();
                    errorPopup.style.left = x + 'px';
                    errorPopup.style.top = y + 'px';
                    errorPopup.style.display = 'inline';
                }
            }
            if (button.menuWasHidden && open_menu){
                button.menuWasHidden = false;
                button.getEl().addClass('x-btn-menu-active-over');
                if (!button.menu.isVisible()) button.showMenu();
            }else if (button.menu.isVisible() && !button.ignoreNextClick){
                button.getEl().removeClass('x-btn-menu-active-over');
                button.menu.hide();
            }
        }
    });
    this.MenuButton = menu_button;

    tb.add(menu_button);
    this.firstTimeShow = true;

    this.SubFilterMenu = new Ext.menu.FilterMenu({
        id: this.name+'SubMenu',
        minWidth : this.params['subWidth'],
        offset   : this.params['subOffset'],
        yOffset  : this.params['subYOffset'],
        allowOtherMenus : true,
        ignoreParentClicks : true,
        shadow : 'drop'
    });
    this.SubFilterMenu.getEl().addClass('all-minerals');

    this.SubFilterMenu.on('hide', function(menu){
        submenu_button.menuWasHidden = true;
        if (f.selected_type == 1) document.getElementById(f.popupName).style.display = 'none';
        if (!f.filterCancelFlag) f.okSub();
    });
    this.SubFilterMenu.on('show', f.subMoveTop, f);

    this.SubMenuTB = new Ext.Toolbar();
    //tb.render(this.name+'SubFilterMenu');
    this.smbOvered = false;
    var submenu_button = new Ext.Toolbar.DevxButton({
            text:'',
            iconCls: '',
            cls : 'open_minerals',
            menu: this.SubFilterMenu
        });
    submenu_button.menuWasHidden = true;
    submenu_button.on('mouseover', function(button, e){
        Ext.get(f.name+'SubFilterLink').addClass('selected');
        if ((button.menu) && (button.menu.isVisible())) {
            button.getEl().addClass('x-btn-menu-active-over');
        } else {
            button.getEl().addClass('x-btn-over');
        }
    });
    submenu_button.on('mouseout', function(button, e){
        if (f.smbOvered) return;
        Ext.get(f.name+'SubFilterLink').removeClass('selected');
        button.getEl().removeClass('x-btn-menu-active-over');
        button.getEl().removeClass('x-btn-over');
    });
    submenu_button.on('click', function(button, e){
        if (button.menu){
            if (button.menuWasHidden){
                button.menuWasHidden = false;
                button.getEl().addClass('x-btn-menu-active-over');
            }else if (button.menu.isVisible() && !button.ignoreNextClick){
                button.getEl().removeClass('x-btn-menu-active-over');
                button.menu.hide();
            }
        }
    });
    this.SubMenuButton = submenu_button;

    //tb.add(submenu_button);
    this.firstTimeSubShow = true;
    
    var url = this.loadUrl;
    loader.data['onerror'] = function(){};
    loader.processGET(url, function(http){
        var res = JSON.parse(http.responseText);
        f.filterCount = parseInt(res['count']);
        var k = 0;
        while (k < f.filterCount){
            if (!f.filterArray[k]){
                res[k]['id_name'] = f.params['id_name'];
                f.filterArray[k] = new DevXMineralFilterObj(res[k], res[k]['checked']);
            }else if (f.filterArray[k].st_id != res[k][f.params['id_name']]){
                f.filterArray[k].reload(res[k], res[k]['checked']);
            }
            k++;
        }
        var stageFilter = '';
        if (typeof(f.params['sub_keys']) != 'undefined') {
            stageFilter += '<a class="info_mincheck" id="'+f.name+'Sub"  href="javascript:Filters[\''+f.name+'\'].openPopup(\'Sub\')">';
            stageFilter += '<span id="'+f.name+'SpanSub">';
            for (k = 0; k < f.params['sub_count']; k++) {
                var fname = f.params['sub_keys'][k];
                if (!f.filterArray[fname]){
                    f.filterArray[fname] = new DevXMineralFilterObj(res[fname], res[fname]['checked']);
                }else if (f.filterArray[fname].st_id != res[fname]['key']){
                    f.filterArray[fname].reload(res[fname], res[fname]['checked']);
                }
                stageFilter += '<input type=checkbox name='+f.name+'[] id='+f.name+'_' + f.filterArray[fname].st_id
                        + ' value="' + f.filterArray[fname].st_id + '"' + ((f.filterArray[fname].checked)?' checked ' : '') + ' style="display:none"><img \n\
                        src="img/' + ((f.filterArray[fname].checked)?'checked.gif' : 'unchecked.gif') + '" id='+f.name+'_img_' + f.filterArray[fname].st_id+'\n\
                        onclick="document.getElementById(\''+f.name+'_' + f.filterArray[fname].st_id+'\').checked = !document.getElementById(\''+f.name+'_' + f.filterArray[fname].st_id+'\').checked;\n\
                        this.src=\'img/\'+((document.getElementById(\''+f.name+'_' + f.filterArray[fname].st_id+'\').checked)? \'checked.gif\' : \'unchecked.gif\'); return false;">';
                stageFilter += f.filterArray[fname].name;
            }
            stageFilter += '</span></a>';
        }
        stageFilter += '<table class="filter_checks">';
        k = 0;
        var old_group = -1;
        f.groups_count = [];
        f.group_checked = [];
        while(k < f.filterCount){
            if (typeof(f.filterArray[k].params.group_order) == 'undefined') {
                break;
            }
            if (typeof(f.groups_count[f.filterArray[k].params.group_order]) == 'undefined') {
                f.groups_count[f.filterArray[k].params.group_order] = 0;
                f.group_checked[f.filterArray[k].params.group_order] = true;
            }
            f.groups_count[f.filterArray[k].params.group_order]++;
            f.group_checked[f.filterArray[k].params.group_order] = f.group_checked[f.filterArray[k].params.group_order] && f.filterArray[k].checked;
            k++;
        }
        k = 0;
        while(k < f.filterCount){
            var prefix = '';
            var left_step = false;
            if (typeof(f.filterArray[k].params.group_order) != 'undefined') {
                var group = f.filterArray[k].params.group_order;
                if (group != old_group) {
                    old_group = group;
                    if (f.groups_count[group] > 1) {
                        left_step = true;
                        stageFilter += '<tr><td class="checkbox_td">';
                        stageFilter += '<input type=checkbox name='+f.name+'[] id='+f.name+'_group_'+group
                                + ' value="' + group + '"' + ((f.group_checked[group])?' checked ' : '') + ' style="display:none"><img \n\
                                src="img/' + ((f.group_checked[group])?'checked.gif' : 'unchecked.gif') + '" id='+f.name+'_img_group_' + group+'\n\
                                onclick="document.getElementById(\''+f.name+'_group_' + group+'\').checked = !document.getElementById(\''+f.name+'_group_' + group+'\').checked;\n\
                                this.src=\'img/\'+((document.getElementById(\''+f.name+'_group_' + group+'\').checked)? \'checked.gif\' : \'unchecked.gif\');\n\
                                Filters[\''+f.name+'\'].clickGroup('+group+');">';
                        stageFilter += '</td><td id="'+f.name+'FilterGgroupTd'+group+'" colspan=2>';
                        stageFilter += '<span class="minattr'+Math.floor(f.filterArray[k].params.group_name.length / 3)+'">'
                            + f.filterArray[k].params.group_name + ': </span>';
                        stageFilter += '</td></tr>';
                    } else {
                        prefix = f.filterArray[k].params.group_name+':&nbsp;';
                    }
                } else {
                    left_step = true;
                }
            }
            stageFilter += '<tr>';
            if (left_step) {
                stageFilter += '<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>';
            }
            stageFilter += '<td class="checkbox_td">';
            stageFilter += '<input type=checkbox name='+f.name+'[] id='+f.name+'_' + f.filterArray[k].st_id
                    + ' value="' + f.filterArray[k].st_id + '"' + ((f.filterArray[k].checked)?' checked ' : '') + ' style="display:none"><img \n\
                    src="img/' + ((f.filterArray[k].checked)?'checked.gif' : 'unchecked.gif') + '" id='+f.name+'_img_' + f.filterArray[k].st_id+'\n\
                    onclick="document.getElementById(\''+f.name+'_' + f.filterArray[k].st_id+'\').checked = !document.getElementById(\''+f.name+'_' + f.filterArray[k].st_id+'\').checked;\n\
                    this.src=\'img/\'+((document.getElementById(\''+f.name+'_' + f.filterArray[k].st_id+'\').checked)? \'checked.gif\' : \'unchecked.gif\');\n\
                    Filters[\''+f.name+'\'].clickElement('+k+');">';
            stageFilter += '</td><td id="'+f.name+'FilterTd'+k+'" '+((left_step)? '' : ' colspan=2 ')+'>';
            if (f.filterArray[k].url){
                stageFilter += '<a class="info" id="'+f.name+'Link'+k+'"  href="javascript:Filters[\''+f.name+'\'].openPopup('+k+')">';
                stageFilter += '<span class="minattr'+Math.floor(f.filterArray[k].short_name.length / 3)+'">' + prefix + f.filterArray[k].short_name + '</span> <img src="img/sep.gif"> ' + f.filterArray[k].name;
                stageFilter += '</a>';
            }else{
                stageFilter += '<span class="minattr'+Math.floor(f.filterArray[k].short_name.length / 3)+'">' 
                    + prefix + f.filterArray[k].short_name + '</span>'
                    + ((f.params['show_long_name'])? ' <img src="img/sep.gif"> ' + f.filterArray[k].name : '');
            }
            stageFilter += '</td></tr>';
            k++;
        }
        f.setDefault();
        stageFilter += '</table>'
        var filterDiv = '<div id="'+f.name+'FilterDiv">';
        filterDiv = filterDiv + '<div class="save-cancel">\n\
            <a href="javascript:Filters[\''+f.name+'\'].ok()" id="'+f.name+'OkLink"\n\
            onmouseover="Filters[\''+f.name+'\'].mbOvered = true;Filters[\''+f.name+'\'].MenuButton.fireEvent(\'mouseover\', Filters[\''+f.name+'\'].MenuButton);"\n\
            onmouseout="Filters[\''+f.name+'\'].mbOvered = false;Filters[\''+f.name+'\'].MenuButton.fireEvent(\'mouseout\', Filters[\''+f.name+'\'].MenuButton);"\n\
            >save</a><a href="javascript:Filters[\''+f.name+'\'].cancel()" class="sv_save">cancel</a>\n\
            </div>\n\
            '+f.header+((f.header != '')?'<br><br>' : '')+'\n\
            <div id="'+f.name+'FilterFilters">'+stageFilter+'</div>\n\
            '+((f.note != '')?'<hr>' : '')+f.note+'\n\
            <div id="'+f.name+'SubFilterMenu" class="filter_open" style=""></div>\n\
            <div style="padding-bottom:10px;padding-top:'+f.params['padding-top']+'px;"\n\
            ><a class="all_min_link" id="'+f.name+'SubFilterLink" href="javascript:void(0);" onclick="Filters[\''+f.name+'\'].clickAllMin(); Filters[\''+f.name+'\'].SubMenuButton.fireEvent(\'mouseover\', Filters[\''+f.name+'\'].SubMenuButton);"\n\
            onmouseover="Filters[\''+f.name+'\'].smbOvered = true;Filters[\''+f.name+'\'].SubMenuButton.fireEvent(\'mouseover\', Filters[\''+f.name+'\'].SubMenuButton);"\n\
            onmouseout="Filters[\''+f.name+'\'].smbOvered = false;Filters[\''+f.name+'\'].SubMenuButton.fireEvent(\'mouseout\', Filters[\''+f.name+'\'].SubMenuButton);"\n\
            >'+f.params['subtext']+'</a></div>\n\
            </div>';

        var baseItem = new Ext.menu.TextItem({text : filterDiv});
        f.FilterMenu.add(baseItem);
        f.filterCancelFlag = true;
        f.MenuButton.showMenu();
        f.FilterMenu.hide();
        f.createDesc();
        filterLoaded['pri'+f.name] = true;
        var reloadGrid = true;
        for(var n in filterLoaded) if (!filterLoaded[n]) reloadGrid = false;
        if (reloadGrid) showGrid(f.params.curr_tab, document.getElementById('view_menu_'+f.params.curr_tab));
    }, false, false);
    
    url = this.subUrl;
    var f1 = this;
    loader.data['onerror'] = function(){};
    loader.processGET(url, function(http){
        var res = JSON.parse(http.responseText);
        f1.subFilterCount = parseInt(res['count']);
        var k = 0;
        while (k < f1.subFilterCount){
            if (!f1.subFilterArray[k]){
                res[k]['id_name'] = f1.params['id_name'];
                f1.subFilterArray[k] = new DevXMineralFilterObj(res[k], res[k]['checked']);
                f1.tmpSubCheckArray[k] = 0;
            }else if (f1.subFilterArray[k].st_id != res[k][f1.params['id_name']]){
                f1.subFilterArray[k].reload(res[k], res[k]['checked']);
                f1.tmpSubCheckArray[k] = 0;
            }
            k++;
        }
        f1.setDefault();
        var stageFilter = '<table class="filter_checks">';
        k = 0;
        
        var rows;
        if (f1.params['show3columns']) {
            rows = Math.ceil(f1.subFilterCount / 3);
            var b = (1 == f1.subFilterCount % 3);
        } else {
            rows = f1.subFilterCount;
        }
        for (var i = 0; i < rows; i++) {
            stageFilter += '<tr>';
            stageFilter += f1.buildFilterTD(i);
            if (f1.params['show3columns']) {
                stageFilter += (b && i+1 == rows ? '<td></td>' : f1.buildFilterTD(i + rows));
                stageFilter += (b ? f1.buildFilterTD(i - 1 + 2* rows ) : f1.buildFilterTD(i + 2 * rows));
            }
            stageFilter += '</tr>';
        }
        stageFilter += '</table>'
        stageFilter += '<span style="font-size:10px;height:25px;display:block;position:absolute;z-index:1000000;width:'+(f1.params['show3columns']? '457' : '139')+'px;">'+f1.footer+'</span>';
        var filterDiv = '<div id="'+f1.name+'FilterDiv">';
        filterDiv = filterDiv + '<div id="'+f1.name+'SubFilterFilters" class="'+(f1.params['show3columns']? 'all-minerals-top-long' : 'all-minerals-top')+'">'+stageFilter+'</div><div id=minerals_bottom class="'+(f1.params['show3columns']? 'all-minerals-bottom-long' : 'all-minerals-bottom')+'"></div></div>';
        var baseSubItem = new Ext.menu.TextItem({text : filterDiv});
        f1.SubFilterMenu.add(baseSubItem);
        f1.createDesc();
        filterLoaded['all'+f.name] = true;
        var reloadGrid = true;
        for(var n in filterLoaded) if (!filterLoaded[n]) reloadGrid = false;
        if (reloadGrid) showGrid(f1.params.curr_tab, document.getElementById('view_menu_'+f1.params.curr_tab));
    }, false, false);
    
}

DevXMineralFilter.prototype.clickGroup = function(group) {
    var checked = document.getElementById(this.name + '_group_' + group).checked;
    var k = 0;
    while(k < this.filterCount){
        if (typeof(this.filterArray[k].params.group_order) == 'undefined') {
            return;
        }
        if (this.filterArray[k].params.group_order == group) {
            document.getElementById(this.name+'_' + this.filterArray[k].st_id).checked = checked;
            document.getElementById(this.name+'_img_' + this.filterArray[k].st_id).src='img/'+((checked)? 'checked.gif' : 'unchecked.gif');
        }
        k++;
    }
}

DevXMineralFilter.prototype.clickElement = function(element) {
    if (typeof(this.filterArray[element].params.group_order) == 'undefined') return;
    var checked = document.getElementById(this.name + '_' + this.filterArray[element].st_id).checked;
    var group = this.filterArray[element].params.group_order;
    if (this.groups_count[group] < 2) return;
    if (!checked) {
        document.getElementById(this.name+'_group_' + group).checked = false;
        document.getElementById(this.name+'_img_group_' + group).src='img/unchecked.gif';
    } else {
        var k = 0;
        var group_checked = true;
        while(k < this.filterCount){
            if (typeof(this.filterArray[k].params.group_order) == 'undefined') {
                return;
            }
            if (this.filterArray[k].params.group_order == group) {
                group_checked = group_checked && document.getElementById(this.name+'_' + this.filterArray[k].st_id).checked;
            }
            k++;
        }
        document.getElementById(this.name+'_group_' + group).checked = group_checked;
        document.getElementById(this.name+'_img_group_' + group).src='img/'+((group_checked)? 'checked.gif' : 'unchecked.gif');
    }
}

DevXMineralFilter.prototype.buildFilterTD = function(ind) {
    var f1 = this;
    if (!f1.subFilterArray[ind]) return '<td></td>';
    
    var s = '';
    s += '<td class="checkbox_td">';
    s += '<input type=checkbox name='+f1.name+'[] id='+f1.name+'_' + f1.subFilterArray[ind].st_id +
         ' value="' + f1.subFilterArray[ind].st_id + '"' + ((f1.subFilterArray[ind].checked)?' checked ' : '') + ' style="display:none"><img \n\ ' +
         ' src="img/' + ((f1.subFilterArray[ind].checked)?'checked.gif' : 'unchecked.gif') + '" id='+f1.name+'_img_' + f1.subFilterArray[ind].st_id+'\n\ ' +
         ' onclick="document.getElementById(\''+f1.name+'_' + f1.subFilterArray[ind].st_id+'\').checked = !document.getElementById(\''+f1.name+'_' + f1.subFilterArray[ind].st_id+'\').checked;\n\ ' +
         ' this.src=\'img/\'+((document.getElementById(\''+f1.name+'_' + f1.subFilterArray[ind].st_id+'\').checked)? \'checked.gif\' : \'unchecked.gif\');">';
    s += '</td><td id="'+f1.name+'SubFilterTd'+ind+'">';
    if (f1.subFilterArray[ind].short_name == 'REM'){
        s += '<a class="info" id="'+f1.name+'Sub" href="javascript:Filters[\''+f1.name+'\'].openREMPopup('+ind+')">';
        s += '<span class="minattr'+Math.floor(f1.subFilterArray[ind].short_name.length / 3)+'">' + f1.subFilterArray[ind].short_name + '</span> <img src="img/sep.gif"> ' + f1.subFilterArray[ind].name;
        s += '</a>';
    }else {
        s += '<span class="minattr'+Math.floor(f1.subFilterArray[ind].short_name.length / 3)+'">'
            + f1.subFilterArray[ind].short_name + '</span>'
            + ((f1.params['show_long_name'])? ' <img src="img/sep.gif"> ' + f1.subFilterArray[ind].name : '');
    }
    s += '</td>';
    
    return s;
}    

DevXMineralFilterObj = function(params, checked){
    if (!params) {
        return;
    }
    this.params = params;
    this.name = params['full_name'];
    this.checked = checked;
    this.short_name = params['name'];
    this.st_id = params[this.params['id_name']];
    this.url = params['chart_url'];
    this.url2 = (params['chart_url2'])? params['chart_url2'] : '';
}

DevXMineralFilterObj.prototype.reload = function(params, checked){
    this.name = params['full_name'];
    this.checked = checked;
    this.short_name = params['name'];
    this.st_id = params[this.params['id_name']];
    this.url = params['chart_url'];
    this.url2 = (params['chart_url2'])? params['chart_url2'] : '';
}

DevXMineralFilterObj.prototype.clone = function(){
    var cloneObj = new DevXMineralFilterObj();
    var obj = this;
    for (var k in obj) {
        cloneObj[k] = obj[k];
    }
    return cloneObj;
}

DevXMineralFilter.prototype.clear = function(){
    var params = 'tmp=1';
    this.clean = true;
    checkResetAll();
    var k = 0;
    while(k < this.filterCount){
        this.filterArray[k].checked = false;
        params += '&filter['+k+']='+this.filterArray[k].checked;
        if (document.getElementById(this.name+'_'+this.filterArray[k].st_id)){
            document.getElementById(this.name+'_'+this.filterArray[k].st_id).checked = false;
            document.getElementById(this.name+'_img_'+this.filterArray[k].st_id).src = 'img/unchecked.gif';
        }
        if (typeof(this.filterArray[k].params.group_order) != 'undefined' && document.getElementById(this.name+'_group_' + this.filterArray[k].params.group_order)) {
            document.getElementById(this.name+'_group_' + this.filterArray[k].params.group_order).checked = false;
            document.getElementById(this.name+'_img_group_' + this.filterArray[k].params.group_order).src= 'img/unchecked.gif';
        }
        k++;
    }
    if (typeof(this.params['sub_keys']) != 'undefined') {
        for (k = 0; k < this.params['sub_count']; k++) {
            var fname = this.params['sub_keys'][k];
            this.filterArray[fname].checked = false;
            params += '&filter['+fname+']='+this.filterArray[fname].checked;
            if (document.getElementById(this.name+'_'+this.filterArray[fname].st_id)){
                document.getElementById(this.name+'_'+this.filterArray[fname].st_id).checked = false;
                document.getElementById(this.name+'_img_'+this.filterArray[fname].st_id).src = 'img/unchecked.gif';
            }
        }
    }
    var url='index.php?act=filters&hdl=save&filter='+this.prefix+'pri'+this.params['save_name'];
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
    k = 0;
    params = 'tmp=1';
    while(k < this.subFilterCount){
        this.subFilterArray[k].checked = false;
        this.tmpSubCheckArray[k] = 2;
        params += '&filter['+k+']='+this.subFilterArray[k].checked;
        if (document.getElementById(this.name+'_'+this.subFilterArray[k].st_id)){
            document.getElementById(this.name+'_'+this.subFilterArray[k].st_id).checked = false;
            document.getElementById(this.name+'_img_'+this.subFilterArray[k].st_id).src = 'img/unchecked.gif';
        }
        k++;
    }
    url='index.php?act=filters&hdl=save&filter='+this.prefix+'all'+this.params['save_name'];
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
    this.filterCancelFlag = true;
    this.FilterMenu.hide();
    this.SubFilterMenu.hide();
    this.filterCancelFlag = false;
    if (this.tip) this.tip.destroy();
    if (document.getElementById(this.name+'FilterDesc').innerHTML != this.defDesc){
        Ext.get('updButton').addClass('btn_result');
        Ext.get('updButton').removeClass('btn_result_dis');
        updClicked = false;
    }
    document.getElementById(this.name+'FilterDesc').innerHTML = this.defDesc;
    document.getElementById(this.name+'FilterDesc').style.cursor = 'pointer';
}

DevXMineralFilter.prototype.ok = function(){
    this.filterCancelFlag = false;
    this.FilterMenu.hide();
}

DevXMineralFilter.prototype.createDesc = function(){
    this.clean = false;
    var shortDesc = new Array();
    var tipDesc = new Array();
    var k = 0; var i = 0;
    while(k < this.filterCount){
        if (this.filterArray[k].checked){
            if (i < this.maxDesc) shortDesc[i] = this.filterArray[k].short_name;
            tipDesc[i] = this.filterArray[k].short_name
                + (this.params['show_long_name']? ' - ' + this.filterArray[k].name : '');
            i++;
        }
        k++;
    }
    k = 0;
    while(k < this.subFilterCount){
        if (this.subFilterArray[k].checked){
            if (i < this.maxDesc) shortDesc[i] = this.subFilterArray[k].short_name;
            tipDesc[i] = this.subFilterArray[k].short_name
                + (this.params['show_long_name']?' - ' + this.subFilterArray[k].name : '');
            i++;
        }
        k++;
    }
    var desc = implode(', ', shortDesc);
    if (desc == ''){
        if (this.tip) this.tip.destroy();
        desc = this.defDesc;
        this.clean = true;
    }
    else if (i > this.maxDesc) desc += '<img src="img/more.gif" style="position: absolute; top: 7px; right: 6px;">';
    var tip = implodeWithBreak(',&nbsp;', this.params['tipRowCount'], '<br>', tipDesc);
    document.getElementById(this.name+'FilterDesc').innerHTML = desc;
    document.getElementById(this.name+'FilterDesc').style.cursor = (this.clean)? 'pointer' : '';
    if (this.tip)
        this.tip.destroy();
    if (tip != ''){
        this.tip = new Ext.FilterTip({
            target : this.name+'FilterDesc',
            dismissDelay : 0,
            showEl : Ext.get(this.name+'FilterDesc'),
            showOffset : [10, -4],
            defaultAlign : 'tl-bl?',
            html : tip
        });
        Ext.QuickTips.init();
    }
    checkResetAll();
}

DevXMineralFilter.prototype.hide = function(){
    this.SubFilterMenu.hide();
    var k = 0;
    var params = 'tmp=1';
    var have_minerals = false;
    var sub_keys_changed = false;
    while(k < this.filterCount){
        if (this.filterArray[k].checked != document.getElementById(this.name+'_'+this.filterArray[k].st_id).checked){
            Ext.get('updButton').addClass('btn_result');
            Ext.get('updButton').removeClass('btn_result_dis');
            updClicked = false;
        }
        this.filterArray[k].checked = document.getElementById(this.name+'_'+this.filterArray[k].st_id).checked;
        have_minerals = have_minerals || this.filterArray[k].checked;
        params += '&filter['+k+']='+this.filterArray[k].checked;
        k++;
    }
    if (typeof(this.params['sub_keys']) != 'undefined') {
        for (k = 0; k < this.params['sub_count']; k++) {
            var fname = this.params['sub_keys'][k];
            if (this.filterArray[fname].checked != document.getElementById(this.name+'_'+this.filterArray[fname].st_id).checked){
                sub_keys_changed = true;
            }
            this.filterArray[fname].checked = document.getElementById(this.name+'_'+this.filterArray[fname].st_id).checked;
            params += '&filter['+fname+']='+this.filterArray[fname].checked;
        }
    }
    var url='index.php?act=filters&hdl=save&filter='+this.prefix+'pri'+this.params['save_name'];
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
    k = 0;
    params = 'tmp=1';
    while(k < this.subFilterCount){
        if (this.subFilterArray[k].checked != (this.tmpSubCheckArray[k] == 1)){
            Ext.get('updButton').addClass('btn_result');
            Ext.get('updButton').removeClass('btn_result_dis');
            updClicked = false;
        }
        this.subFilterArray[k].checked = this.tmpSubCheckArray[k] == 1;
        have_minerals = have_minerals || this.subFilterArray[k].checked;
        params += '&filter['+k+']='+this.subFilterArray[k].checked;
        k++;
    }
    url='index.php?act=filters&hdl=save&filter='+this.prefix+'all'+this.params['save_name'];
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);

    if (sub_keys_changed && have_minerals) {
        Ext.get('updButton').addClass('btn_result');
        Ext.get('updButton').removeClass('btn_result_dis');
        updClicked = false;
    }

    this.createDesc();
}

DevXMineralFilter.prototype.clickAllMin = function(){
    var button = this.SubMenuButton;
    if (button.menu){
        if (button.menuWasHidden){
            button.menuWasHidden = false;
            button.getEl().addClass('x-btn-menu-active-over');
            button.menu.show(button.getEl());
        }else if (button.menu.isVisible() && !button.ignoreNextClick){
            button.getEl().removeClass('x-btn-menu-active-over');
            button.menu.hide();
        }
    }
}

DevXMineralFilter.prototype.cancel = function(){
    this.filterCancelFlag = true;
    this.setCheckBoxes();
    this.FilterMenu.hide();
    this.SubFilterMenu.hide();
}

DevXMineralFilter.prototype.setCheckBoxes = function() {
    var k = 0;
    var group_checked = [];
    while(k < this.filterCount){
        document.getElementById(this.name+'_'+this.filterArray[k].st_id).checked = this.filterArray[k].checked;
        document.getElementById(this.name+'_img_'+this.filterArray[k].st_id).src = 'img/'+
            ((document.getElementById(this.name+'_'+this.filterArray[k].st_id).checked)?'checked.gif' : 'unchecked.gif');
        if (typeof(this.filterArray[k].params.group_order) != 'undefined') {
            var group = this.filterArray[k].params.group_order;
            if (typeof(group_checked[group]) == 'undefined') {
                group_checked[group] = true;
            }
            group_checked[group] = group_checked[group] && this.filterArray[k].checked;
        }
        k++;
    }
    for (k in group_checked) {
        if (!intval(k)) {
            continue;
        }
        if (document.getElementById(this.name+'_group_' + k)) {
            document.getElementById(this.name+'_group_' + k).checked = group_checked[k];
            document.getElementById(this.name+'_img_group_' + k).src='img/'+((group_checked[k])? 'checked.gif' : 'unchecked.gif');
        }
    }
    if (typeof(this.params['sub_keys']) != 'undefined') {
        for (k = 0; k < this.params['sub_count']; k++) {
            var fname = this.params['sub_keys'][k];
            document.getElementById(this.name+'_'+this.filterArray[fname].st_id).checked = this.filterArray[fname].checked;
            document.getElementById(this.name+'_img_'+this.filterArray[fname].st_id).src = 'img/'+
                ((document.getElementById(this.name+'_'+this.filterArray[fname].st_id).checked)?'checked.gif' : 'unchecked.gif');
        }
    }
    k = 0;
    while(k < this.subFilterCount){
        this.tmpSubCheckArray[k] = 2;
        if (document.getElementById(this.name+'_'+this.subFilterArray[k].st_id)) {
            document.getElementById(this.name+'_'+this.subFilterArray[k].st_id).checked = this.subFilterArray[k].checked;
            document.getElementById(this.name+'_img_'+this.subFilterArray[k].st_id).src = 'img/'+ ((document.getElementById(this.name+'_'+this.subFilterArray[k].st_id).checked)?'checked.gif' : 'unchecked.gif');
        }
        k++;
    }
}

DevXMineralFilter.prototype.addSubmenu = function(menu){
    this.SubMenuTB.render(this.name+'SubFilterMenu');
    this.SubMenuTB.add(this.SubMenuButton);
}

DevXMineralFilter.prototype.subMoveTop = function(menu){
    menu.getEl().setZIndex(parseInt(this.FilterMenu.getEl().getStyle("z-index"), 10) + 3);
}

DevXMineralFilter.prototype.okSub = function(){
    var k = 0;
    while(k < this.subFilterCount){
        if (document.getElementById(this.name+'_'+this.subFilterArray[k].st_id)) {
            this.tmpSubCheckArray[k] = (document.getElementById(this.name+'_'+this.subFilterArray[k].st_id).checked)? 1 : 0;
        }
        k++;
    }
    this.SubFilterMenu.hide();
}

DevXMineralFilter.prototype.openREMPopup = function(id){
    this.selected_id = id;
    this.selected_type = 1;
    Ext.menu.MenuMgr.hideAll();
    //remove all info_current classes
    var elem = null;
    for (var i=0; i < this.filterCount; i++){
        elem = Ext.get(this.name+'Link'+i);
        if (elem) elem.removeClass('info_current');
    }
    elem = Ext.get(this.name+'Sub');
    if (elem) elem.addClass('info_current');
    var remArr = ['<span class="minattr0">La</span> <img src="img/sep.gif"> lanthanum',
                    '<span class="minattr0">Ce</span> <img src="img/sep.gif"> cerium',
                    '<span class="minattr0">Pr</span> <img src="img/sep.gif"> praseodymium',
                    '<span class="minattr0">Nd</span> <img src="img/sep.gif"> neodymium',
                    '<span class="minattr0">Pm</span> <img src="img/sep.gif"> promethium',
                    '<span class="minattr0">Sm</span> <img src="img/sep.gif"> samarium',
                    '<span class="minattr0">Eu</span> <img src="img/sep.gif"> europium',
                    '<span class="minattr0">Gd</span> <img src="img/sep.gif"> gadolinium',
                    '<span class="minattr0">Tb</span> <img src="img/sep.gif"> terbium',
                    '<span class="minattr0">Dy</span> <img src="img/sep.gif"> dysprosium',
                    '<span class="minattr0">Ho</span> <img src="img/sep.gif"> holmium',
                    '<span class="minattr0">Er</span> <img src="img/sep.gif"> erbium',
                    '<span class="minattr0">Tm</span> <img src="img/sep.gif"> thulium',
                    '<span class="minattr0">Yb</span> <img src="img/sep.gif"> ytterbium',
                    '<span class="minattr0">Lu</span> <img src="img/sep.gif"> lutetium',
                    '<span class="minattr0">Sc</span> <img src="img/sep.gif"> scandium',
                    '<span class="minattr0">Y</span> <img src="img/sep.gif"> yttrium'];
    var k = 0; var i = 0;
    var add = Math.ceil(remArr.length / 2);
    var rem = '<table style="margin-bottom:10px;" class="filter_checks">';
    while (k < remArr.length){
        if (i == 0) rem += '<tr>';
        rem += '<td>'+remArr[k]+'</td>';
        k += add;
        i ++;
        if (i == 2){
            rem += '</tr>';
            k = (k % add) + 1;
            i = 0;
        }
    }
    if (i != 0){
        while (i < 2){
            rem += '<td></td>';
            i++;
        }
        rem += '</tr>';
    }
    rem += '</table><hr>';
    
    var popupDiv = document.getElementById(this.popupName);
    var popupDivContent = document.getElementById(this.popupName+'Content');
    var popupDivFooter = document.getElementById(this.popupName+'Footer');
    var el = Ext.get(this.name+'SubFilterTd'+id);
    var content = ''; var footer = '';
    content = 'Rare Earth Metals are:<br><br>'+rem;
    footer = '<a href="#">General information</a>\n\
                <br><a href="#">Top producers</a>';
    popupDivContent.innerHTML = content;
    popupDivFooter.innerHTML = footer;
    popupDiv.style.position = 'absolute';
    var dom_el = Ext.getDom(el);
    var f = dom_el;
    var x = 0;
    while (f.offsetParent){
        x += f.offsetLeft;
        f = f.offsetParent;
    }
    x = Math.ceil(x + el.getWidth()) - 60;
    var y = el.getY() - 145;
    popupDiv.style.left = x + 'px';
    popupDiv.style.top = y + 'px';
    popupDiv.style.display = 'inline';
    Ext.get(this.popupName).removeClass('longPopup');
}

DevXMineralFilter.prototype.closePopup = function(){
    Ext.menu.MenuMgr.hideAll();
    //remove all info_current classes
    var elem = null;
    for (var i=0; i < this.filterCount; i++){
        elem = Ext.get(this.name+'Link'+i);
        if (elem) elem.removeClass('info_current');
    }
    elem = Ext.get(this.name+'Sub');
    if (elem) elem.removeClass('info_current');
    document.getElementById(this.popupName).style.display = 'none';
    this.selected_id = -1;
}

DevXMineralFilter.prototype.openPopup = function(id){
    if (this.selected_id == id){
        this.closePopup();
        return;
    }
    this.selected_id = id;
    this.selected_type = 2;
    Ext.menu.MenuMgr.hideAll();
    //remove all info_current classes
    var elem = null;
    for (var i=0; i < this.filterCount; i++){
        elem = Ext.get(this.name+'Link'+i);
        if (elem) elem.removeClass('info_current');
        if ((i == id) && (elem)) elem.addClass('info_current');
    }
    elem = Ext.get(this.name+'Sub');
    if (elem) elem.removeClass('info_current');
    var popupDiv = document.getElementById(this.popupName);
    var popupDivContent = document.getElementById(this.popupName+'Content');
    var popupDivFooter = document.getElementById(this.popupName+'Footer');
    var el;
    if (id == 'Sub') {
        el = Ext.get(this.name+'SpanSub');
    } else {
        el = Ext.get(this.name+'FilterTd'+id);
    }
    var content = ''; var footer = '';
    if (id == 'Sub') {
        if (this.name == 'exchange') {
            content = '<div class="min_pdiv"><p class="min_p">Show primary listings only</p> \n\
                \n\
                Select this option to see only companies for which the selected exchange(s) is the primary exchange (usually the primary exchange is in the same country as headquarters & corporate domicile).  If this box is not checked, the results show all companies traded on the selected exchange(s), whether or not they have more liquid listings elsewhere..\n\
                <br>\n\
                <p class="min_p2">Explanation</p>\n\
                \n\
                Many companies with primary stocks listings in their home countries also have listings overseas. For example, many Canadian stocks traded primarily on the TSX or TSX.V also have OTC listings in the US or AIM listings in the UK. This can make it difficult to search for companies for which a given exchange (especially the AIM, Pink Sheets or Frankfurt) is the primary listing.\n\
            ';
        } else {
            content = '<div class="min_pdiv"><p class="min_p">Main Mineral</p> \n\
                \n\
                Select this option to see only companies for which the selected mineral comprises the largest fraction of the company\'s in-situ resources value.\n\
                <br>\n\
                <p class="min_p2">Minerals with Estimates:</p>\n\
                \n\
                Select this option to see only companies that provide official resource estimates of the selected minerals.\n\
                <br><div class="min_psep"> \n\
                If neither is selected, default returns companies with selected minerals in any quantity with or without estimates.</div></div>\n\
            ';
        }
    }else {
        if (this.filterArray[id].url != 'none'){
            content = '<a href="http://kitco.com">';
            if (this.filterArray[id].url2)
                content+='<div style="width:360px">';
                content+='<div class="graph" style="background-image:url('+this.filterArray[id].url+')"><img src="'+this.filterArray[id].url+'"></div>';
            if (this.filterArray[id].url2)
                content += '<div class="graph" style="background-image:url('+this.filterArray[id].url2+')"><img src="'+this.filterArray[id].url2+'"></div>';
            content += '</a><br style="clear:both">clicking on chart takes you to kitco.com';
        }

        if (this.filterArray[id].url2){
            Ext.get(this.popupName).addClass('longPopup');
            var pgm = 'Platinum Group Metals:<br>\n\
                        Ir - Iridium, Os - osmium,<br>\n\
                        Pd - paladium, Pt - platinum,<br>\n\
                        Rh - rhodium, and Ru - ruthenium';
            footer = '<div style="width:360px;margin-top:5px;"><hr><table style="width:360px;"><tr><td>'+pgm+'</td><td style="width:175px"><a href="#">General information</a>\n\
                        <a href="#">Top producers</a><br style="clear:both">\n\
                        <a href="#" class="why">why two charts here</a>\n\
                        </td></tr></table></div></div>';
        }else{
            Ext.get(this.popupName).removeClass('longPopup');
            footer = '<hr><a href="#">General information</a>\n\
                        <br><a href="#">Top producers</a>';
        }
    }
    popupDivContent.innerHTML = content;
    popupDivFooter.innerHTML = footer;
    popupDiv.style.position = 'absolute';
    var dom_el = Ext.getDom(el);
    var f = dom_el;
    var x = 0;
    while (f.offsetParent){
        x += f.offsetLeft;
        f = f.offsetParent;
    }
    if (id == 'Sub') {
        x = Math.ceil(x + el.getWidth()) + 5;
    } else {
        x = Math.ceil(x + el.getWidth()) - 10;
    }
    var y = el.getY();
    popupDiv.style.left = x + 'px';
    popupDiv.style.top = y + 'px';
    popupDiv.style.display = 'inline';
}

DevXMineralFilter.prototype.getValues = function(){
    var filter_name = this.name;
    if (typeof(this.params['filter_name']) != 'undefined') {
        filter_name = this.params['filter_name'];
    }
    var k = 0; var i = 0;
    var idArr = new Array();
    while(k < this.filterCount){
        if (this.filterArray[k].checked){
            idArr[i] = filter_name+'[]='+this.filterArray[k].st_id;
            i++;
        }
        k++;
    }
    var filter_sub = '';
    if (typeof(this.params['sub_keys']) != 'undefined') {
        filter_sub = '&filters[]='+filter_name+'_sub';
        for (k = 0; k < this.params['sub_count']; k++) {
            var fname = this.params['sub_keys'][k];
            if (this.filterArray[fname].checked){
                idArr[i] = filter_name+'_sub[]='+this.filterArray[fname].st_id;
                i++;
            }
        }
    }
    k = 0;
    while(k < this.subFilterCount){
        if (this.subFilterArray[k].checked){
            idArr[i] = filter_name+'[]='+this.subFilterArray[k].st_id;
            i++;
        }
        k++;
    }
    if (i > 0){
        return implode('&', idArr)+'&filters[]='+filter_name+filter_sub;
    }
    return '';
}

DevXMineralFilter.prototype.setDefault = function(){
    this.defFilterArray = new Array();
    this.defFilterCount = this.filterCount;
    for(var k = 0; k < this.filterCount; k++){
        this.defFilterArray[k] = this.filterArray[k].clone();
    }
    if (typeof(this.params['sub_keys']) != 'undefined') {
        for (k = 0; k < this.params['sub_count']; k++) {
            var fname = this.params['sub_keys'][k];
            if (typeof(this.filterArray[fname]) != 'undefined') {
                this.defFilterArray[fname] = this.filterArray[fname].clone();
            }
        }
    }
    this.defSubFilterArray = new Array();
    this.defSubFilterCount = this.subFilterCount;
    for(var k = 0; k < this.subFilterCount; k++){
        this.defSubFilterArray[k] = this.subFilterArray[k].clone();
    }
}


DevXMineralFilter.prototype.resetToDefault = function(){
    this.filterArray = new Array();
    this.filterCount = this.defFilterCount;
    for(var k = 0; k < this.filterCount; k++){
        this.filterArray[k] = this.defFilterArray[k].clone();
    }
    if (typeof(this.params['sub_keys']) != 'undefined') {
        for (k = 0; k < this.params['sub_count']; k++) {
            var fname = this.params['sub_keys'][k];
            this.filterArray[fname] = this.defFilterArray[fname].clone();
        }
    }
    this.subFilterArray = new Array();
    this.subFilterCount = this.defSubFilterCount;
    for(var k = 0; k < this.defSubFilterCount; k++){
        this.subFilterArray[k] = this.defSubFilterArray[k].clone();
    }
    this.setCheckBoxes();
    this.createDesc();
}
