DevXCountryFilter = function DevXCountryFilter(name, defDesc, loadUrl, params){
    this.params = params;
    this.prefix = (typeof(params['prefix']) != 'undefined')? params['prefix'] : '';
    this.maxDesc = 5;
    this.maxSubLen = 17;
    this.name = name;
    this.loadUrl = loadUrl;
    this.defDesc = defDesc;
    this.filterArray = new Array();
    this.defFilterArray = new Array();
    this.defFilterCount = new Array();
    this.clean = true;
    for (var i = 0; i < 6; i++) this.filterArray[i] = new Array();
    this.filterCount = new Array();
    this.subFilterHtml = new Array();
    this.filterCancelFlag = false;
    this.header = (params['header'])? params['header'] : '';
    this.note = (params['note'])? params['note'] : '';

    this.obj = params['obj'];

    var f = this;

    this.FilterMenu = new Ext.menu.FilterMenu({
        id: this.name+'Menu',
        minWidth : 149,
        allowOtherMenus : true,
        ignoreParentClicks : true,
        subMenuAlign : 'tl-br?',
        shadow : 'drop'
    });

    this.FilterMenu.on('hide', function(menu){
        document.getElementById('errorPopup').style.display = 'none';
        for (var i = 0; i < 3; i++){
            f.FilterSubMenu[i].hide();
            f.FilterSubMenu[i].firstTimeShow = true;
        }
        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);
        var count = 2;
        var stageFilter = '';
        for (var i = 0; i < count; i++){
            var k = 0;
            f.filterCount[i] = res[i]['count'];
            var st_id = 0;
            while (k < f.filterCount[i]){
                st_id = (res[i][k]['pc_id'])? res[i][k]['pc_id'] : res[i][k]['region_id'];
                if (!f.filterArray[i][k]){
                    f.filterArray[i][k] = new DevXCountryFilterObj(res[i][k], res[i][k]['checked']);
                }else if (f.filterArray[i][k].st_id != st_id){
                    f.filterArray[i][k].reload(res[i][k], false);
                }
                k++;
            }
            stageFilter += f.obj[i]['header'];
            stageFilter += '<table class="filter_checks">';
            k = 0;
            while(k < f.filterCount[i]){
                stageFilter += '<tr><td class="checkbox_td">';
                stageFilter += '<input type=checkbox name='+f.name+f.obj[i]['name']+'[] id='+f.name+f.obj[i]['name']+'_' + f.filterArray[i][k].st_id
                        + ' value="' + f.filterArray[i][k].st_id + '"' + ((f.filterArray[i][k].checked)?' checked ' : '') + ' style="display:none"><img \n\
                        src="img/' + ((f.filterArray[i][k].checked)?'checked.gif' : 'unchecked.gif') + '" id='+f.name+f.obj[i]['name']+'_img_' + f.filterArray[i][k].st_id+'\n\
                        onclick="document.getElementById(\''+f.name+f.obj[i]['name']+'_' + f.filterArray[i][k].st_id+'\').checked = !document.getElementById(\''+f.name+f.obj[i]['name']+'_' + f.filterArray[i][k].st_id+'\').checked;\n\
                        this.src=\'img/\'+((document.getElementById(\''+f.name+f.obj[i]['name']+'_' + f.filterArray[i][k].st_id+'\').checked)? \'checked.gif\' : \'unchecked.gif\');">';
                stageFilter += '</td><td>';
                stageFilter += f.filterArray[i][k].short_name;
                stageFilter += '</td><td style="padding-top:5px;padding-bottom:0px;width:12px;"><img src="img/sep.gif" style="position:absolute;margin-left:3px;"></td><td>';
                stageFilter +=  f.filterArray[i][k].name;
                stageFilter += '</td></tr>';
                k++;
            }
            stageFilter += '</table>'
            stageFilter += '<br>';
        }
        stageFilter += '<div class="data_filt" style="margin-bottom:4px;">All Countries</div>';
        var filterDiv = '<div id="'+f.name+'FilterDiv">';
        filterDiv = filterDiv + '<div class="save-cancel" id="'+f.name+'SubAlignDiv">\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>';
        for (var i = 2; i < 6; i++){
            stageFilter = '';
            var k = 0;
            f.filterCount[i] = res[i]['count'];
            var st_id = 0;
            while (k < f.filterCount[i]){
                st_id = (res[i][k]['pc_id'])? res[i][k]['pc_id'] : res[i][k]['region_id'];
                if (!f.filterArray[i][k]){
                    f.filterArray[i][k] = new DevXCountryFilterObj(res[i][k], /*false*/res[i][k]['checked']);
                }else if (f.filterArray[i][k].st_id != st_id){
                    f.filterArray[i][k].reload(res[i][k], false);
                }
                k++;
            }
            stageFilter += '<table class="filter_checks">';
            k = 0;
            while(k < f.filterCount[i]){
                stageFilter += '<tr><td class="checkbox_td">';
                stageFilter += '<input type=checkbox name='+f.name+'all[] id='+f.name+'all_' + f.filterArray[i][k].st_id
                        + ' value="' + f.filterArray[i][k].st_id + '"' + ((f.filterArray[i][k].checked)?' checked ' : '') + ' style="display:none"><img \n\
                        src="img/' + ((f.filterArray[i][k].checked)?'checked.gif' : 'unchecked.gif') + '" id='+f.name+'all_img_' + f.filterArray[i][k].st_id+'\n\
                        onclick="document.getElementById(\''+f.name+'all_' + f.filterArray[i][k].st_id+'\').checked = !document.getElementById(\''+f.name+'all_' + f.filterArray[i][k].st_id+'\').checked;\n\
                        this.src=\'img/\'+((document.getElementById(\''+f.name+'all_' + f.filterArray[i][k].st_id+'\').checked)? \'checked.gif\' : \'unchecked.gif\');">';
                stageFilter += '</td><td>';
                stageFilter += f.filterArray[i][k].short_name;
                stageFilter += '</td><td style="padding-top:5px;padding-bottom:0px;width:12px;"><img src="img/sep.gif" style="position:absolute;margin-left:3px;"></td><td>';
                stageFilter +=  f.filterArray[i][k].name;
                stageFilter += '</td></tr>';
                k++;
            }
            stageFilter += '</table>';
            var subDiv = '<div id="'+f.name+'SubFilterDiv'+(i-2)+'">'+stageFilter+'</div>';
            f.subFilterHtml[i-2] = subDiv;
        }
        f.setDefault();

        var baseItem = new Ext.menu.TextItem({text : filterDiv});

        f.FilterSubMenu = new Array();
        var  FilterSubItem = new Array();
        var subtext = ['A - D', 'E - K', 'L - R', 'S - Z'];
        for (var i = 0; i < 4; i++){
            f.FilterSubMenu[i] = new Ext.menu.Menu({
                id: this.name+'SubMenu'+i,
                minWidth : 140,
                allowOtherMenus : true,
                ignoreParentClicks : false,
                shadow : 'drop',
                items: [
                    new Ext.menu.TextItem({text : f.subFilterHtml[i]})
                ]
            });
            f.FilterSubMenu[i].firstTimeShow = true;
            f.FilterSubMenu[i].num = i;
            f.FilterSubMenu[i].getEl().addClass('all-countries');
            FilterSubItem[i] = new Ext.menu.FilterItem({
                text : subtext[i],
                href : '',
                alignId : f.name+'SubAlignDiv',
                menu : f.FilterSubMenu[i]
            });
        }
        f.FilterMenu.add(baseItem);
        f.FilterMenu.add(FilterSubItem[0]);
        f.FilterMenu.add(FilterSubItem[1]);
        f.FilterMenu.add(FilterSubItem[2]);
        f.FilterMenu.add(FilterSubItem[3]);
        f.FilterMenu.add(new Ext.menu.FilterItem({
            text : '',
            href : '',
            disabled : true,
            style : {'height' : '25px'}
        }));
        f.filterCancelFlag = true;
        f.MenuButton.showMenu();
        f.FilterMenu.hide();
        f.createDesc();
        filterLoaded['country'] = 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);
}

DevXCountryFilterObj = function(params, checked){
    if (!params) {
        return;
    }
    this.name = params['full_name'];
    this.checked = checked;
    this.short_name = params['name'];
    this.st_id = (params['pc_id'])? params['pc_id'] : params['region_id'];
}

DevXCountryFilterObj.prototype.reload = function(params, checked){
    this.name = params['full_name'];
    this.checked = checked;
    this.short_name = params['name'];
    this.st_id = (params['pc_id'])? params['pc_id'] : params['region_id'];
}

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

DevXCountryFilter.prototype.clear = function(){
    var params = 'tmp=1';
    this.clean = true;
    checkResetAll();
    for (var i=0; i<6; i++){
        var fname = 'allcountries'
        if (i == 0) fname = 'regions';
        else if (i == 1) fname = 'countries';
        var k = 0;
        while(k < this.filterCount[i]){
            this.filterArray[i][k].checked = false;
            params += '&filters['+this.prefix+fname+']['+k+']=false';
            if (i > 1){
                if (document.getElementById(this.name+'all_'+this.filterArray[i][k].st_id)){
                    document.getElementById(this.name+'all_'+this.filterArray[i][k].st_id).checked = false;
                    document.getElementById(this.name+'all_img_'+this.filterArray[i][k].st_id).src = 'img/unchecked.gif';
                }
            }else{
                if (document.getElementById(this.name+this.obj[i]['name']+'_'+this.filterArray[i][k].st_id)){
                    document.getElementById(this.name+this.obj[i]['name']+'_'+this.filterArray[i][k].st_id).checked = false;
                    document.getElementById(this.name+this.obj[i]['name']+'_img_'+this.filterArray[i][k].st_id).src = 'img/unchecked.gif';
                }
            }
            k++;
        }
    }
    url='index.php?act=filters&hdl=save&filter='+this.prefix+'countries';
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
    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').innerHTML = this.defDesc;
    document.getElementById(this.name+'FilterDesc').style.cursor = 'pointer';
}

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

DevXCountryFilter.prototype.createDesc = function(){
    this.clean = false;
    var shortDesc = new Array();
    var tipDesc = new Array();
    var i = 0;
    for (var j = 0; j < 2; j++){
        var k = 0;
        while(k < this.filterCount[j]){
            if (this.filterArray[j][k].checked){
                if (i < this.maxDesc) shortDesc[i] = this.filterArray[j][k].short_name;
                var re1 = /<br>/gi;
                tipDesc[i] = this.filterArray[j][k].short_name + ' - ' + this.filterArray[j][k].name.replace(re1, '&nbsp;');
                i++;
            }
            k++;
        }
    }
    for (var j = 2; j < 6; j++){
        var k = 0;
        while(k < this.filterCount[j]){
            if (this.filterArray[j][k].checked){
                if (i < this.maxDesc) shortDesc[i] = this.filterArray[j][k].short_name;
                var re1 = /<br>/gi;
                tipDesc[i] = this.filterArray[j][k].short_name + ' - ' + this.filterArray[j][k].name.replace(re1, '&nbsp;');
                i++;
            }
            k++;
        }
    }
    var desc = implode(', ', shortDesc);
    if (desc == ''){
        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;', 2, '<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,
            defaultAlign : 'tl-br?',
            showEl : Ext.get(this.name+'FilterDesc'),
            showOffset : [10, -4],
            defaultAlign : 'tl-bl?',
            html : tip
        });
        Ext.QuickTips.init();
    }
    checkResetAll();
}

DevXCountryFilter.prototype.hide = function(){
    var params = 'tmp=1';
    for (var j = 0; j < 2; j++){
        var k = 0;
        while(k < this.filterCount[j]){
            if (this.filterArray[j][k].checked != document.getElementById(this.name+this.obj[j]['name']+'_'+this.filterArray[j][k].st_id).checked){
                Ext.get('updButton').addClass('btn_result');
                Ext.get('updButton').removeClass('btn_result_dis');
                updClicked = false;
            }
            this.filterArray[j][k].checked = document.getElementById(this.name+this.obj[j]['name']+'_'+this.filterArray[j][k].st_id).checked;
            params += '&filters['+this.prefix+((j == 0)? 'regions' : 'countries')+']['+k+']='+this.filterArray[j][k].checked;
            k++;
        }
    }
    for (var j = 2; j < 6; j++){
        var k = 0;
        while(k < this.filterCount[j]){
            if (!document.getElementById(this.name+'all_'+this.filterArray[j][k].st_id)){
                params += '&filters['+this.prefix+'allcountries]['+/*k*/this.filterArray[j][k].st_id+']=false';
                k++;
                continue;
            }
            if (this.filterArray[j][k].checked != document.getElementById(this.name+'all_'+this.filterArray[j][k].st_id).checked){
                Ext.get('updButton').addClass('btn_result');
                Ext.get('updButton').removeClass('btn_result_dis');
                updClicked = false;
            }
            this.filterArray[j][k].checked = document.getElementById(this.name+'all_'+this.filterArray[j][k].st_id).checked;
            params += '&filters['+this.prefix+'allcountries]['+/*k*/this.filterArray[j][k].st_id+']='+this.filterArray[j][k].checked;
            k++;
        }
    }
    url='index.php?act=filters&hdl=save&filter='+this.prefix+'countries';
    loader.data['onerror'] = function(){};
    loader.processPOST(url, params, function(http){}, false, false);
    this.createDesc();
}

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

DevXCountryFilter.prototype.setCheckBoxes = function() {
    for (var j = 0; j < 2; j++){
        var k = 0;
        while(k < this.filterCount[j]){
            document.getElementById(this.name+this.obj[j]['name']+'_'+this.filterArray[j][k].st_id).checked = this.filterArray[j][k].checked;
            document.getElementById(this.name+this.obj[j]['name']+'_img_'+this.filterArray[j][k].st_id).src = 'img/'+
                ((document.getElementById(this.name+this.obj[j]['name']+'_'+this.filterArray[j][k].st_id).checked)?'checked.gif' : 'unchecked.gif');
            k++;
        }
    }
    for (var j = 2; j < 6; j++){
        var k = 0;
        while(k < this.filterCount[j]){
            if (!document.getElementById(this.name+'all_'+this.filterArray[j][k].st_id)){
                k++;
                continue;
            }
            document.getElementById(this.name+'all_'+this.filterArray[j][k].st_id).checked = this.filterArray[j][k].checked;
            document.getElementById(this.name+'all_img_'+this.filterArray[j][k].st_id).src = 'img/'+
                ((document.getElementById(this.name+'all_'+this.filterArray[j][k].st_id).checked)?'checked.gif' : 'unchecked.gif');
            k++;
        }
    }
}

DevXCountryFilter.prototype.getValues = function(){
    var k = 0; var i = 0;
    var idArr = new Array();
    //region
    while(k < this.filterCount[0]){
        if (this.filterArray[0][k].checked){
            idArr[i] = this.name+'_region[]='+this.filterArray[0][k].st_id;
            i++;
        }
        k++;
    }
    for (var j=1; j < 6; j++){
        k = 0;
        while(k < this.filterCount[j]){
            if (this.filterArray[j][k].checked){
                idArr[i] = this.name+'_country[]='+this.filterArray[j][k].st_id;
                i++;
            }
            k++;
        }
    }
    if (i > 0){
        return implode('&', idArr)+'&filters[]='+this.name;
    }
    return '';
}

DevXCountryFilter.prototype.setDefault = function(){
    this.defFilterArray = new Array();
    this.defFilterCount = new Array();
    var count = 6;
    for (var i = 0; i < count; i++){
        this.defFilterCount[i] = this.filterCount[i];
        this.defFilterArray[i] = new Array();
        for(var k = 0; k < this.filterCount[i]; k++){
            this.defFilterArray[i][k] = this.filterArray[i][k].clone();
        }
    }
}

DevXCountryFilter.prototype.resetToDefault = function(){
    this.filterArray = new Array();
    this.filterCount = new Array();
    var count = 6;
    for (var i = 0; i < count; i++){
        this.filterCount[i] = this.defFilterCount[i];
        this.filterArray[i] = new Array();
        for(var k = 0; k < this.defFilterCount[i]; k++){
            this.filterArray[i][k] = this.defFilterArray[i][k].clone();
        }
    }
    this.setCheckBoxes();
    this.createDesc();
}
