// vim: et:ts=4:sw=4:sts=4:ft=javascript 'use strict'; /*@ Ox.CheckboxGroup CheckboxGroup Object () -> CheckboxGroup Object (options) -> CheckboxGroup Object (options, self) -> CheckboxGroup Object options Options object checkboxes array of checkboxes max max selected min min selected type type ("group" or "list") width width in px self shared private variable change triggered when checked property changes passes {id, title, value} @*/ Ox.CheckboxGroup = function(options, self) { self = self || {}; var that = Ox.Element({}, self) .defaults({ // fixme: should 'checkboxes' be 'items'? checkboxes: [], max: 1, min: 1, type: 'group', value: options.max != 1 ? [] : '', width: 256 }) .options(options || {}) .addClass('OxCheckboxGroup Ox' + Ox.toTitleCase(self.options.type)); self.options.checkboxes = self.options.checkboxes.map(function(checkbox) { return { checked: Ox.toArray(self.options.value).indexOf(checkbox.id || checkbox) > -1, id: checkbox.id || checkbox, title: checkbox.title || checkbox }; }); self.optionGroup = new Ox.OptionGroup( self.options.checkboxes, self.options.min, self.options.max, 'checked' ); self.options.checkboxes = self.optionGroup.init(); self.$checkboxes = []; if (self.options.type == 'group') { self.checkboxWidth = Ox.divideInt( self.options.width + (self.options.checkboxes.length - 1) * 6, self.options.checkboxes.length ).map(function(v, i) { return v + (i < self.options.checkboxes.length - 1 ? 10 : 0); }); }; self.options.checkboxes.forEach(function(checkbox, pos) { self.$checkboxes[pos] = Ox.Checkbox(Ox.extend(checkbox, { group: true, id: checkbox.id, width: self.options.type == 'group' ? self.checkboxWidth[pos] : self.options.width, value: checkbox.checked })) .bindEvent('change', function() { toggleCheckbox(pos); }) .appendTo(that); }); function toggleCheckbox(pos) { var toggled = self.optionGroup.toggle(pos); Ox.Log('Form', 'change', pos, 'toggled', toggled) if (!toggled.length) { self.$checkboxes[pos].options({ value: !self.$checkboxes[pos].options('value') }); } else { toggled.forEach(function(i) { i != pos && self.$checkboxes[i].options({ // FIXME: fix and use that.toggleOption() value: !self.$checkboxes[i].options('value') }); }); self.options.value = self.optionGroup.value(); that.triggerEvent('change', { value: self.options.value }); } } that.value = function() { return self.options.checkboxes.filter(function(checkbox) { return checkbox.value; }).map(function(checkbox) { return checkbox.id; }); }; return that; };