// vim: et:ts=4:sw=4:sts=4:ft=javascript 'use strict'; /*@ Ox.InputGroup InputGroup Object () -> InputGroup Object (options) -> InputGroup Object (options, self) -> InputGroup Object options Options object id id inputs inputs separators seperators width width self shared private variable @*/ Ox.InputGroup = function(options, self) { self = self || {}; var that = Ox.Element({}, self) .defaults({ id: '', inputs: [], join: null, separators: [], split: null, value: options.split ? '' : [], width: 0 }) .options(options || {}) .addClass('OxInputGroup') .click(click); if (Ox.isEmpty(self.options.value)) { self.options.value = getValue(); } else { setValue(); } if (self.options.width) { setWidths(); } else { self.options.width = getWidth(); } that.css({ width: self.options.width + 'px' }); self.$separator = []; self.options.separators.forEach(function(v, i) { self.$separator[i] = Ox.Label({ textAlign: 'center', title: v.title, width: v.width + 32 }) .addClass('OxSeparator') .css({ marginLeft: (self.options.inputs[i].options('width') - (i == 0 ? 16 : 32)) + 'px' }) .appendTo(that); }); self.options.inputs.forEach(function($input, i) { $input.options({ id: self.options.id + Ox.toTitleCase($input.options('id') || '') }) .css({ marginLeft: -Ox.sum(self.options.inputs.map(function($input, i_) { return i_ > i ? self.options.inputs[i_ - 1].options('width') + self.options.separators[i_ - 1].width : (i_ == i ? 16 : 0); })) + 'px' }) .bindEvent({ change: change, submit: change, validate: validate }) .appendTo(that); }); function change(data) { //Ox.Log('Form', 'InputGroup change') self.options.value = getValue(); that.triggerEvent('change', { value: self.options.value }); } function click(event) { if ($(event.target).hasClass('OxSeparator')) { Ox.forEach(self.options.inputs, function($input) { if ($input.focusInput) { $input.focusInput(true); return false; } }); } } function getValue() { var value = self.options.inputs.map(function($input) { return $input.value(); }); return self.options.join ? self.options.join(value) : value; } function getWidth() { return Ox.sum(self.options.inputs.map(function(v) { return v.options('width'); })) + Ox.sum(self.options.separators.map(function(v) { return v.width; }));// + 2; // fixme: why + 2? } function setValue() { var values = self.options.split ? self.options.split(self.options.value) : self.options.value; values.forEach(function(value, i) { self.options.inputs[i].value(value); }); } function setWidths() { var length = self.options.inputs.length, inputWidths = Ox.divideInt( self.options.width - Ox.sum(self.options.separators.map(function(v) { return v.width; })), length ); self.options.inputs.forEach(function(v) { v.options({ width: inputWidths[1] // fixme: 1?? i? }); }); } function validate(data) { //Ox.Log('Form', 'INPUTGROUP TRIGGER VALIDATE') that.triggerEvent('validate', data); } self.setOption = function(key, value) { if (key == 'value') { setValue(); } } // fixme: is this used? that.getInputById = function(id) { var input = null; Ox.forEach(self.options.inputs, function(v, i) { //Ox.Log('Form', v, v.options('id'), id) if (v.options('id') == self.options.id + Ox.toTitleCase(id)) { input = v; return false; } }); return input; }; return that; };