oxjs/source/Ox.UI/js/Form/Ox.OptionGroup.js

121 lines
3.2 KiB
JavaScript
Raw Normal View History

2011-07-29 18:48:43 +00:00
// vim: et:ts=4:sw=4:sts=4:ft=javascript
2011-05-16 10:49:48 +00:00
2011-11-05 16:46:53 +00:00
'use strict';
2011-05-16 10:49:48 +00:00
/*@
Ox.OptionGroup <f> OptionGroup
Helper object, used by ButtonGroup, CheckboxGroup, Select and Menu
2011-05-16 10:49:48 +00:00
(items, min, max, property) -> <f> OptionGroup
items <a> array of items
min <n> minimum number of selected items
max <n> maximum number of selected items
property <s|checked> property to check
@*/
2011-04-22 22:03:10 +00:00
Ox.OptionGroup = function(items, min, max, property) {
var length = items.length;
property = property || 'checked';
max = max == -1 ? length : max;
2011-04-22 22:03:10 +00:00
function getLastBefore(pos) {
// returns the position of the last checked item before position pos
var last = -1;
// fixme: why is length not == items.length here?
Ox.forEach(Ox.merge(
2011-04-22 22:03:10 +00:00
pos > 0 ? Ox.range(pos - 1, -1, -1) : [],
pos < items.length - 1 ? Ox.range(items.length - 1, pos, -1) : []
), function(v) {
if (items[v][property]) {
last = v;
return false;
}
});
return last;
}
function getNumber() {
// returns the number of checked items
var num = 0;
items.forEach(function(item) {
if (item[property]) {
num++;
}
});
2011-04-22 22:03:10 +00:00
return num;
}
2011-05-16 10:49:48 +00:00
/*@
[property] <f> returns an array with the positions of all checked item
() -> <a> returns checked items
@*/
2011-04-22 22:03:10 +00:00
this[property] = function() {
// returns an array with the positions of all checked item
var checked = [];
items.forEach(function(item, i) {
if (item[property]) {
checked.push(i);
}
})
return checked;
};
2011-05-16 10:49:48 +00:00
/*@
init <f> init group
() -> <a> returns items
@*/
2011-04-22 22:03:10 +00:00
this.init = function() {
var num = getNumber(),
count = 0;
//if (num < min || num > max) {
items.forEach(function(item) {
if (Ox.isUndefined(item[property])) {
item[property] = false;
}
if (item[property]) {
count++;
if (count > max) {
item[property] = false;
}
} else {
if (num < min) {
item[property] = true;
num++;
}
}
});
//}
return items;
};
2011-05-16 10:49:48 +00:00
/*@
toggle <f> toggle options
(pos) -> <a> returns toggled state
@*/
2011-04-22 22:03:10 +00:00
this.toggle = function(pos) {
var last,
num = getNumber(),
toggled = [];
if (!items[pos][property]) { // check
if (num >= max) {
last = getLastBefore(pos);
items[last][property] = false;
toggled.push(last);
}
if (!items[pos][property]) {
items[pos][property] = true;
toggled.push(pos);
}
} else { // uncheck
if (num > min) {
items[pos][property] = false;
toggled.push(pos);
}
}
return toggled;
}
return this;
}