var ImageButtonGroup = Class.create();
ImageButtonGroup.prototype = {
    m_selected : null,
    m_buttons : null,
    m_name : null,
    
    initialize : function(t_name)
    {
        this.m_name = t_name;
        this.m_selected = null;
        this.m_buttons = new Array();        
    },
    
    getName : function()
    {
        return this.m_name;
    },
    
    addToGroup : function(t_imgButton)
    {
        this.m_buttons.push(t_imgButton);
    },
    
    getSelected : function()
    {
        return this.m_selected;
    },
    
    setSelected : function(t_button)
    {
        var t_func = function(current)
        {
            if( current.id != t_button.id )
            {
                current.unselect();
            }
            else
            {            
                current._select();
                this.m_selected = current;
            }
        };
        
        this.m_buttons.each(
            t_func
        );        
    }
}

var ImageButton = Class.create();
ImageButton.prototype = {
    m_isSelected : true,
    m_isDisabled : false,
    m_buttonGroup : null,
    m_element : null,
    m_srcSelected : null,
    m_srcNotSelected : null,
    m_srcDisabled : null,
    m_srcHover : null,
    id : null,
    
    initialize : function(t_element, t_buttonGroup)
    {
        this.id = t_element.id;
        this.m_element = t_element;
        this.m_buttonGroup = $defined(t_buttonGroup) ? t_buttonGroup : new ImageButtonGroup(new Date().valueOf());
        
        var t_strSelected = t_element.attributes["selected"];
        this.m_isSelected = $defined(t_strSelected) && t_strSelected != null ? t_strSelected.value.toUpperCase()=="TRUE" : false;
        
        try
        {
            var t_src = t_element.attributes["src"].nodeValue;
            var t_srcSelected = t_element.attributes["srcselected"];
            var t_srcNotSelected = t_element.attributes["srcnotselected"];
            
            this.m_srcSelected = $defined(t_srcSelected) ? t_srcSelected.nodeValue : t_src;        
            this.m_srcNotSelected = $defined(t_srcNotSelected) ? t_srcNotSelected.nodeValue : t_src;
            
            var t_disabledAttribute = t_element.attributes["srcdisabled"];
            this.m_srcDisabled = $defined(t_disabledAttribute) ? t_disabledAttribute.nodeValue : t_src;
        }
        catch(e)
        {
            throw {message : "Invalid imageButton-element. Required attributes are 'srcSelected' and 'srcNotSelected'."};
        }
                
        var t_hover = t_element.attributes["srchover"];
        if( $defined(t_hover) )
        {
            this.m_srcSelected = t_hover.nodeValue;
        }
        var onclick = t_element.onclick;
        
        if(typeof onclick != "undefined")
        {
            //Remove onclick element. Set image radio button state if onclick-function
            //returns true.
            t_element.onclick = null;
            Event.observe(t_element, "click", 
                (function()
                {
                    var t_retval = onclick();
                    if(typeof t_retval == "undefined" || t_retval != false)
                    {
                        this._click.bind(this)();
                    }
                }).bind(this)
            );
        }
        else
        {    
            Event.observe(t_element, "click", this._click.bind(this));
        }
        var t_thisextend = {radio : this};
        
        Object.extend(t_element, t_thisextend);   
             
        //Reg button in buttongroup
        if( this.m_buttonGroup.addToGroup )
        {
            this.m_buttonGroup.addToGroup(this);
            
            if(this.m_isSelected)
            {
                this.m_buttonGroup.setSelected(this);
            }
        }
        else
        {
            //element is not buttongroup
            throw {message:"Argument buttonGroup is not of type ButtonGroup."};
        }
        //Object.extend(t_element, this); 
    },
    
    unselect : function()
    {
        this.m_element.radio.m_isSelected = false;
        
        if( this.m_element.radio.m_isDisabled )
        {
            this.m_element.src = this.m_element.radio.m_srcDisabled;
        }
        else
        {
            this.m_element.src = this.m_element.radio.m_srcNotSelected;
            
        }
    },
    
    _select : function()
    {        
        this.m_element.radio.m_isSelected = true;
        this.m_element.src = this.m_element.radio.m_srcSelected;        
    },
    

    
    select : function()
    {
        this.m_element.radio.m_buttonGroup.setSelected(this);      
//        if( !this.m_isSelected )
//        {
//            this.m_isSelected = true;
//            this.m_element.src = this.m_srcSelected;        
//        }
    },
    
    disable : function()
    {
        if( this.m_element.radio.m_srcDisabled != null )
        {
            this.m_element.src = this.m_element.radio.m_srcDisabled;
            this.m_element.radio.m_isDisabled = true;
        }
    },
    
    enable : function()
    {
        if( this.m_element.radio.m_srcDisabled != null )
        {
            if( this.m_element.radio.m_isSelected )
            {
                this.m_element.src = this.m_element.radio.m_srcSelected;   
            }
            else
            {
                this.m_element.src = this.m_element.radio.m_srcNotSelected;
            }
            
            this.m_element.radio.m_isDisabled = false;
        }
    },
    
    getButtonGroup : function()
    {
        return this.m_element.radio.m_buttonGroup;
    },
    
    _click : function()
    {
        this.m_element.radio.m_buttonGroup.setSelected(this);
    }
}

//Initialize objects.
//Event.observe(window, "load", 
//    initButtonGroups()
//);

function __initButtonGroups()
{
    var t_groups = $$("[buttongroup!='']");            
    var i, l1=t_groups.length;
    for(i=0; i<l1; i++)
    {
        try
        {
            var t_btnGroup = new ImageButtonGroup(t_groups[i].attributes["buttongroup"].value);
            
            var t_buttons = t_groups[i].getElementsBySelector(".imageButton");
            var j, l2 = t_buttons.length;
            for(j=0; j<l2; j++)
            {
                new ImageButton(
                    t_buttons[j],
                    t_btnGroup
                    );                       
            }
        }
        catch(e)
        {
            alert(e.message);
            //ignore
            if( $defined(Debug) && Debug.ENABLED )
            {
                alert("imagebuttongroup exception initiating groups. " + e.message);
            }
        }
    }
}
