/////////////////////////// Checkboxes ////////////////////////////////
/**
* Multiple checkboxes
* @constructor
*/
hui.ui.Checkboxes = function(options) {
this.options = options;
this.element = hui.get(options.element);
this.name = options.name;
this.items = options.items || [];
this.subItems = [];
this.values = options.values || options.value || []; // values is deprecated
hui.ui.extend(this);
this._addBehavior();
this._updateUI();
if (options.url) {
new hui.ui.Source({url:options.url,delegate:this});
}
};
hui.ui.Checkboxes.create = function(o) {
o.element = hui.build('div',{'class':o.vertical ? 'hui_checkboxes hui_checkboxes_vertical' : 'hui_checkboxes'});
if (o.items) {
hui.each(o.items,function(item) {
var node = hui.build('a',{'class':'hui_checkbox',href:'#',html:'<span class="hui_checkbox_button"></span><span class="hui_checkbox_label">'+hui.string.escape(item.title)+'</span>'});
hui.ui.addFocusClass({element:node,'class':'hui_checkbox_focused'});
o.element.appendChild(node);
});
}
return new hui.ui.Checkboxes(o);
};
hui.ui.Checkboxes.prototype = {
_addBehavior : function() {
var checks = hui.get.byClass(this.element,'hui_checkbox');
hui.each(checks,function(check,i) {
hui.ui.addFocusClass({element:check,'class':'hui_checkbox_focused'});
hui.listen(check,'click',function(e) {
hui.stop(e);
this.flipValue(this.items[i].value);
}.bind(this));
}.bind(this));
},
getValue : function() {
return this.values;
},
_checkValues : function() {
var newValues = [];
for (var i=0; i < this.values.length; i++) {
var value = this.values[i],
found = false,
j;
for (j=0; j < this.items.length; j++) {
found = found || this.items[j].value===value;
}
for (j=0; j < this.subItems.length; j++) {
found = found || this.subItems[j]._hasValue(value);
}
if (found) {
newValues.push(value);
}
}
this.values=newValues;
},
setValue : function(values) {
this.values = values;
this._checkValues();
this._updateUI();
},
flipValue : function(value) {
hui.array.flip(this.values,value);
this._checkValues();
this._updateUI();
this.fire('valueChanged',this.values);
hui.ui.callAncestors(this,'childValueChanged',this.values);
},
_updateUI : function() {
var i,item,found;
for (i=0; i < this.subItems.length; i++) {
this.subItems[i]._updateUI();
}
var nodes = hui.get.byClass(this.element,'hui_checkbox');
for (i=0; i < this.items.length; i++) {
item = this.items[i];
found = hui.array.contains(this.values,item.value);
hui.cls.set(nodes[i],'hui_checkbox_selected',found);
}
},
refresh : function() {
for (var i=0; i < this.subItems.length; i++) {
this.subItems[i].refresh();
}
},
reset : function() {
this.setValues([]);
},
/**
* @private
* @deprecated
*/
setValues : function(values) {
this.setValue(values);
},
/**
* @private
* @deprecated
*/
getValues : function() {
return this.values;
},
/** @private */
registerItem : function(item) {
// If it is a number, treat it as such
if (parseInt(item.value)==item.value) {
item.value = parseInt(item.value);
}
this.items.push(item);
},
/** @private */
registerItems : function(items) {
items.parent = this;
this.subItems.push(items);
},
/** @private */
$optionsLoaded : function(items) {
hui.each(items,function(item) {
var node = hui.build('a',{'class':'hui_checkbox',href:'#',html:'<span class="hui_checkbox_button"></span><span class="hui_checkbox_label">'+hui.string.escape(item.title)+'</span>'});
hui.listen(node,'click',function(e) {
hui.stop(e);
this.flipValue(item.value);
}.bind(this));
hui.ui.addFocusClass({element:node,'class':'hui_checkbox_focused'});
this.element.appendChild(node);
this.items.push(item);
}.bind(this));
this._checkValues();
this._updateUI();
}
};
/////////////////////// Checkbox items ///////////////////
/**
* Check box items
* @constructor
*/
hui.ui.Checkboxes.Items = function(options) {
this.element = hui.get(options.element);
this.name = options.name;
this.parent = null;
this.options = options;
this.checkboxes = [];
hui.ui.extend(this);
if (this.options.source) {
this.options.source.listen(this);
}
};
hui.ui.Checkboxes.Items.prototype = {
refresh : function() {
if (this.options.source) {
this.options.source.refresh();
}
},
/** @private */
$optionsLoaded : function(items) {
this.checkboxes = [];
this.element.innerHTML='';
var self = this;
hui.each(items,function(item) {
var parsed = {text:item.title || item.text,value:hui.intOrString(item.value)};
var node = parsed.element = hui.build('a',{'class':'hui_checkbox',href:'#',html:'<span class="hui_checkbox_button"></span><span class="hui_checkbox_label">'+hui.string.escape(parsed.text)+'</span>'});
hui.listen(node,'click',function(e) {
hui.stop(e);
node.focus();
self._onItemClick(parsed);
});
hui.ui.addFocusClass({element:node,'class':'hui_checkbox_focused'});
self.element.appendChild(node);
self.checkboxes.push(parsed);
});
this.parent._checkValues();
this._updateUI();
},
$objectsLoaded : function(items) {
this.$optionsLoaded(items);
},
_onItemClick : function(item) {
this.parent.flipValue(item.value);
},
_updateUI : function() {
for (var i=0; i < this.checkboxes.length; i++) {
var item = this.checkboxes[i];
var index = hui.array.indexOf(this.parent.values,item.value);
hui.cls.set(item.element,'hui_checkbox_selected',index!=-1);
}
},
_hasValue : function(value) {
for (var i=0; i < this.checkboxes.length; i++) {
if (this.checkboxes[i].value==value) {
return true;
}
}
return false;
}
};