// vim: et:ts=4:sw=4:sts=4:ft=js
/*@
Ox.Checkbox <f:Ox.Element> Checkbox Element
    () ->              <f> Checkbox Element
    (options) ->       <f> Checkbox Element
    (options, self) -> <f> Checkbox Element
    options <o> Options object
        disabled <b> if true, checkbox is disabled
        id <s> element id
        group <b> if true, checkbox is part of a group
        checked <b> if true, checkbox is checked
        title <s> text on label
        width <n> width in px
    self <o>    Shared private variable
    change <!> triggered when checked property changes, passes {checked, id, title}
@*/

Ox.Checkbox = function(options, self) {

    var self = self || {},
        that = new Ox.Element({}, self)
            .defaults({
                disabled: false,
                id: '',
                group: false,
                checked: false,
                overlap: 'none',
                title: '',
                width: 'auto'
            })
            .options(options || {})
            .addClass('OxCheckbox' + 
                (self.options.overlap == 'none' ? '' : ' OxOverlap' +
                Ox.toTitleCase(self.options.overlap))
            )
            .attr(self.options.disabled ? {
                disabled: 'disabled'
            } : {});

    if (self.options.title) {
        self.options.width != 'auto' && that.css({
                width: self.options.width + 'px'
            });
        self.$title = new Ox.Label({
                disabled: self.options.disabled,
                id: self.options.id + 'Label',
                overlap: 'left',
                title: self.options.title,
                width: self.options.width - 16
            })
            .css({
                float: 'right'
            })
            .click(clickTitle)
            .appendTo(that);
    }

    self.$button = new Ox.Button({
            disabled: self.options.disabled,
            id: self.options.id + 'Button',
            title: [
                {id: 'none', title: 'none', selected: !self.options.checked},
                {id: 'check', title: 'check', selected: self.options.checked}
            ],
            type: 'image'
        })
        .addClass('OxCheckbox')
        .click(clickButton)
        .appendTo(that);

    function clickButton() {
        self.options.checked = !self.options.checked;
        // click will have toggled the button,
        // if it is part of a group, we have to revert that
        self.options.group && that.toggleChecked();
        that.triggerEvent('change', {
            checked: self.options.checked,
            id: self.options.id,
            title: self.options.title
        });
    }

    function clickTitle() {
        !self.options.disabled && self.$button.trigger('click');
    }

    self.setOption = function(key, value) {
        if (key == 'checked') {
            that.toggleChecked();
        }
    };

    /*@
    checked <f> get current checked state
        () -> <b> returns self.options.checked
    @*/
    that.checked = function() {
        return self.options.checked;
    }

    /*@
    toggleChecked <f> toggle current checked state
        () -> <f> toggle state, returns Checkbox Element
    @*/
    that.toggleChecked = function() {
        self.$button.toggleTitle();
        return that;
    }

    return that;

};
