DevXNewFilter = function DevXNewFilter(name, defDesc, loadUrl, params){
    this.params = params;
    this.prefix = (typeof(params['prefix']) != 'undefined')? params['prefix'] : '';
    this.name = name;
    this.loadUrl = loadUrl;
    this.defDesc = defDesc;
    this.filterArray = new Array();
    this.filterCount = 0;
    this.defFilterArray = new Array();
    this.defFilterCount = 0;
    this.filterCancelFlag = false;
    this.header = (params['header'])? params['header'] : '';
    this.note = (params['note'])? params['note'] : '';
    this.footer = (params['footer'])? params['footer'] : '';
    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';
        menu_button.menuWasHidden = true;
        if (!f.filterCancelFlag) f.hide();
        f.filterCancelFlag = false;
    });
    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;

    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]){
                f.filterArray[k] = new DevXNewFilterObj(res[k]['name'], res[k]['full_name'], res[k]['checked'], res[k]['st_id']);
            }else if (f.filterArray[k].st_id != res[k]['st_id']){
                f.filterArray[k].reload(res[k]['name'], res[k]['full_name'], res[k]['checked'], res[k]['st_id']);
            }
            k++;
        }
        f.setDefault();
        var stageFilter = '<table class="filter_checks">';
        k = 0;
        while(k < f.filterCount){
            stageFilter += '<tr><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\');">';
            stageFilter += '</td><td>';
            stageFilter += f.filterArray[k].name;
            stageFilter += '</td></tr>';
            k++;
        }
        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 id="'+f.name+'SaveLink" href="javascript:Filters[\''+f.name+'\'].cancel()" class="sv_save">cancel</a>\n\
            </div>\n\
            '+f.header+((f.header != '')?'' : '')+'\n\
            <div id="'+f.name+'FilterFilters">'+stageFilter+'</div>\n\
            '+((f.note != '')?'<div class="x-menu_hr"></div>' : '')+'<span class="note">'+
            ((f.note != '')? f.note : f.footer)+'</span>\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[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);
}

DevXNewFilterObj = function(short_name, name, checked, st_id){
    this.name = name;
    this.checked = checked;
    this.short_name = short_name;
    this.st_id = st_id;
}

DevXNewFilterObj.prototype.reload = function(short_name, name, checked, st_id){
    this.name = name;
    this.checked = checked;
    this.short_name = short_name;
    this.st_id = st_id;
}

DevXNewFilterObj.prototype.clone = function(){
    var cloneObj = new DevXNewFilterObj();
    var obj = this;
    for (var k in obj) {
        cloneObj[k] = obj[k];
    }
    return cloneObj;
}

DevXNewFilter.prototype.clear = function(){
    var k = 0;
    this.clean = true;
    checkResetAll();
    var params = 'tmp=1';
    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';
        }
        k++;
    }
    this.filterCancelFlag = true;
    this.FilterMenu.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').style.cursor = 'pointer';
    document.getElementById(this.name+'FilterDesc').innerHTML = this.defDesc;
    var url='index.php?act=filters&hdl=save&filter='+this.prefix+this.name;
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
}

DevXNewFilter.prototype.ok = function(){
    this.filterCancelFlag = false;
    this.FilterMenu.hide();
}

DevXNewFilter.prototype.createDesc = function(){
    this.clean = false;
    var shortDesc = new Array();
    var k = 0; var i = 0;
    var tipDesc = new Array();
    while(k < this.filterCount){
        if (this.filterArray[k].checked){
            shortDesc[i] = this.filterArray[k].short_name;
            var re1 = /<td>/gi;
            var re2 = /<\/td>/gi;
            var re3 = /<td class="sep_td">/gi;
            var re4 = /<img src="img\/sep.gif">/gi;
            var re5 = /<br>/gi;
            tipDesc[i] = this.filterArray[k].name.replace(re4, '-').replace(re1, '').replace(re3, '').replace(re5, '&nbsp;').replace(re2, '&nbsp;');
            i++;
        }
        k++;
    }
    var desc = implode(', ', shortDesc);
    if (desc == ''){
        desc = this.defDesc;
        this.clean = true;
    }
    var tip = implode(',<br>', tipDesc);
    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();
    }
    if (document.getElementById(this.name+'FilterDesc').innerHTML != desc){
        Ext.get('updButton').addClass('btn_result');
        Ext.get('updButton').removeClass('btn_result_dis');
        updClicked = false;
    }
    document.getElementById(this.name+'FilterDesc').style.cursor = (this.clean)? 'pointer' : '';
    document.getElementById(this.name+'FilterDesc').innerHTML = desc;
    checkResetAll();
}

DevXNewFilter.prototype.hide = function(){
    var k = 0;
    var params = 'tmp=1';
    while(k < this.filterCount){
        this.filterArray[k].checked = document.getElementById(this.name+'_'+this.filterArray[k].st_id).checked;
        params += '&filter['+k+']='+this.filterArray[k].checked;
        k++;
    }
    this.createDesc();
    var url='index.php?act=filters&hdl=save&filter='+this.prefix+this.name;
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
}

DevXNewFilter.prototype.cancel = function(){
    this.filterCancelFlag = true;
    this.setCheckBoxes();
    this.FilterMenu.hide();
}

DevXNewFilter.prototype.setCheckBoxes = function(){
    var k = 0;
    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');
        k++;
    }
}

DevXNewFilter.prototype.getValues = function(){
    var k = 0; var i = 0;
    var idArr = new Array();
    while(k < this.filterCount){
        if (this.filterArray[k].checked){
            idArr[i] = this.name+'[]='+this.filterArray[k].st_id;
            i++;
        }
        k++;
    }
    if (i > 0){
        return implode('&', idArr)+'&filters[]='+this.name;
    }
    return '';
}

DevXNewFilter.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();
    }
}


DevXNewFilter.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();
    }
    this.setCheckBoxes();
    this.createDesc();
}

