'use strict'; /*@ Ox.Checkbox Checkbox Element options Options object disabled if true, checkbox is disabled group if true, checkbox is part of a group indeterminate if true, checkbox appears as indeterminate label Label (on the left side) labelWidth Label width title Title (on the right side) value if true, checkbox is checked width width in px self Shared private variable ([options[, self]]) -> 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; };