'use strict';

/*@
Ox.Checkbox <f> Checkbox Element
    options <o> Options object
        disabled <b> if true, checkbox is disabled
        group <b> if true, checkbox is part of a group
        indeterminate <b> if true, checkbox appears as indeterminate
        label <s> Label (on the left side)
        labelWidth <n|64> Label width
        title <s> Title (on the right side)
        value <b> if true, checkbox is checked
        width <n> width in px
    self <o>    Shared private variable
    ([options[, self]]) -> <o:Ox.Element> Checkbox Element
        change <!> triggered when value changes
@*/

Ox.Checkbox = function(options, self) {

    self = self || {};
    var that = Ox.Element({}, self)
            .defaults({
                disabled: false,
                group: false,
                indeterminate: false,
                label: '',
                labelWidth: 64,
                overlap: 'none',
                style: 'rounded',
                title: '',
                value: false,
                width: options && (options.label || options.title) ? 'auto' : 16
            })
            .options(options || {})
            .update({
                disabled: function() {
                    var disabled = self.options.disabled;
                    that.attr({disabled: disabled});
                    self.$button.options({disabled: disabled});
                    self.$title && self.$title.options({disabled: disabled});
                },
                indeterminate: function() {
                    if (self.options.indeterminate) {
                        self.$button.options({values: ['remove']});
                        self.$button.options({value: 'remove'});
                    } else {
                        self.$button.options({values: ['none', 'check']});
                        self.$button.options({
                            value: self.options.value ? 'check' : 'none'
                        });
                    }
                },
                label: function() {
                    self.$label.options({title: self.options.label});
                },
                title: function() {
                    self.$title.options({title: self.options.title});
                },
                value: function() {
                    self.$button.toggle();
                },
                width: function() {
                    that.css({width: self.options.width + 'px'});
                    self.$title && self.$title.options({width: getTitleWidth()});
                }
            })
            .addClass('OxCheckbox' + (
                self.options.overlap == 'none'
                ? '' : ' OxOverlap' + Ox.toTitleCase(self.options.overlap)
            ))
            .attr({
                disabled: self.options.disabled
            })
            .css(self.options.width != 'auto' ? {
                width: self.options.width
            } : {});

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

    if (self.options.label) {
        self.$label = Ox.Label({
                overlap: 'right',
                textAlign: 'right',
                title: self.options.label,
                width: self.options.labelWidth
            })
            .css({float: 'left'})
            .appendTo(that);
    }

    self.$button = Ox.Button({
            disabled: self.options.disabled,
            id: self.options.id + 'Button',
            style: self.options.style != 'rounded' ? self.options.style : '',
            type: 'image',
            value: self.options.indeterminate ? 'remove'
                : self.options.value ? 'check' : 'none',
            values: self.options.indeterminate ? ['remove'] : ['none', 'check']
        })
        .addClass('OxCheckbox')
        .bindEvent({
            change: clickButton
        })
        .appendTo(that);

    function clickButton() {
        self.options.value = !self.options.value;
        if (self.options.indeterminate) {
            self.options.indeterminate = false;
            self.$button.options({values: ['none', 'check']});
            self.$button.options({value: self.options.value ? 'check' : 'none'});
        }
        that.triggerEvent('change', {
            value: self.options.value
        });
    }

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

    function getTitleWidth() {
        return self.options.width - 16
            - !!self.options.label * self.options.labelWidth;
    }

    return that;

};