var GridSelectSelector = '.gridselect';
var GridselectControl = Class.create(BaseControl, {
    drop:null,
    model:null,

    loadview: function(element)
    {
        this.model = $(element);
        
        if (this.model === null) return;
        
        var me = this.model.control = this;
        this.view = $(Builder.node('div', {className:'dropdown'},
            Builder.node('div', {className:'valuebox'})
        ));
        this.model.value = this.model.getAttribute('value');
        var display = this.model.getAttribute('display');
        if (!display) display = this.model.value;
        this.setDisplayValue(display);

        if (this.model.hasClassName('filtered')) this.view.addClassName('filtered');

        this.model.insert({after:this.view}).hide();

        this.drop = new DropdownControl(this.view, this.model.getAttribute('drop'));

        this.drop.observe('show', function(){
            var grid = me.getGrid();
            grid.stopObserving();
            grid.observe('rowselect', function(memo){  
                me.setValue(memo.id);
                me.setDisplayValue(memo.display);
                me.drop.hide();                
                me.fire('rowselect', memo);    
                if (me.model.onchange)   
                    me.model.onchange();
                me.drop.stopDocumentClick();
            });
            grid.find('.clear_selection').invoke('observe', 'click', function(){
                me.setValue('');
                me.setDisplayValue('');
                me.drop.hide();
                me.fire('rowselect', {id:'', display:''});
                if (me.model.onchange)   
                    me.model.onchange();
                me.drop.stopDocumentClick();     
            });
            
            grid.observe('ajaxcomplete', function()
            {
                grid.find('.clear_selection').invoke('observe', 'click', function(){
                    me.setValue('');
                    me.setDisplayValue('');
                    me.drop.hide();
                    me.fire('rowselect', {id:'', display:''});
                    if (me.model.onchange)   
                        me.model.onchange();
                    me.drop.stopDocumentClick();     
                });
                
            });
        })
    },
    
    refresh: function()
    {
        var grid = this.getGrid();
        grid.refresh();    
    },
    
    addHiddenFilter: function(key, value)
    {
        var grid = this.getGrid();
        grid.addHiddenFilter(key, value);    
    },

    addHiddenFilterArray: function(key_array)
    {
        for (i = 0; i < key_array.length; i++)   
        {
            this.addHiddenFilter(key_array[i]);
        }       
    },
    
    removeHiddenFilter: function(key)
    {
        var grid = this.getGrid();
        grid.removeHiddenFilter(key);    
    },
    
    hasHiddenFilter: function(key)
    {
        var grid = this.getGrid();
        return grid.hasHiddenFilter(key);    
    },
    
    removeHiddenFilterArray: function(key_array)
    {
        for (i = 0; i < key_array.length; i++)   
        {
            this.removeHiddenFilter(key_array[i]);
        }       
    },
    
    hasHiddenFilterArray: function(key_array)
    {
        result = true;
        for (i = 0; i < key_array.length; i++)   
        {
            result = result && this.hasHiddenFilter(key_array[i]);
        }       
        
        return result;
    },
    
    observeFilter: function()
    {     
        if (!this.model) 
            return;
                            
        var cell = this.model.up('.filter');
        
        if (!cell)
            cell = this.model.up('.cell');
            
        if (!cell) return;
        
        var related_fields  = cell.getAttribute('related_fields'); 
                              
        if (!Object.isUndefined(related_fields) && related_fields != null)
        {
            if (related_fields != '')
            {
                var related_fields_arr = related_fields.split(",");
                this.drop.observe('show', function ()
                    {
                            cell = this.model.up('.cell');             
                            if (cell)
                            {
                                for (i = 0; i < related_fields_arr.length; i++)
                                {   
                                    var related_cell = cell.up('.row').down('.cell[field=' + related_fields_arr[i] + ']');   
                                    var related_cell_box = related_cell.down('.box'); 
                                    var related_value = related_cell_box ? related_cell_box.value : related_cell.getAttribute('value');
                                    
                                    this.removeHiddenFilter(related_fields_arr[i]);
                                    this.addHiddenFilter(related_fields_arr[i], related_value)
                                }
                                
                                this.getGrid().refresh();   
                            }
                            else
                            {
                                if (this.hasHiddenFilterArray(related_fields_arr))
                                {
                                    this.removeHiddenFilterArray(related_fields_arr); 
                                    this.getGrid().refresh();
                                }
                            }
                    }.bind(this));   
                
                
            }
        }

    },
    
    observeNonFilter: function()
    {
        if (!this.model) 
            return;
                            
        var cell = this.model.up('.cell');
                    
        if (!cell) return;
        
        var related_fields  = cell.getAttribute('related_fields'); 
                       alert(related_fields);       
        if (!Object.isUndefined(related_fields) && related_fields != null)
        {
            if (related_fields != '')
            {
                var related_fields_arr = related_fields.split(",");
                
                if (!this.hasHiddenFilterArray(related_fields_arr))    
                {                                
                    for (i = 0; i < related_fields_arr.length; i++)
                    {   
                        var related_cell = cell.up('.row').down('.cell[field=' + related_fields_arr[i] + ']');   
                        var related_cell_box = related_cell.down('.box'); 
                        var related_value = related_cell_box ? related_cell_box.value : related_cell.getAttribute('value');
                        
                        this.addHiddenFilter(related_fields_arr[i], related_value)
                    }
                }

                this.drop.observe('show', function (){if (!this.hasHiddenFilterArray(related_fields_arr)){this.getGrid().refresh();}}.bind(this));   
            }
        }

    },
    
    setValue: function(value)
    {
        if (Object.isUndefined(this.model.originValue)) this.model.originValue = this.model.value;
                   
        this.model.value = value;
        if (value != this.model.originValue)
            this.view.addClassName('changed');
        else
            this.view.removeClassName('changed');
    },

    setDisplayValue: function(value)
    {
        this.view.down('.valuebox').update(value);
    },

    getGrid: function()
    {
        return this.drop.content.control;
    }
})