You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

59 lines
2.0 KiB

/*
---
name: Form.RadioGroup
description: Class to represent a group of Form.Radio buttons
authors: Bryan J Swift (@bryanjswift)
license: MIT-style license.
requires: [Core/Class.Extras, Core/Element, Core/Element.Event, Form-Replacement/Form.Radio]
provides: Form.RadioGroup
...
*/
if (typeof window.Form === 'undefined') { window.Form = {}; }
Form.RadioGroup = new Class({
Implements: [Events,Options],
options: {
radioOptions: {},
initialValues: {}
},
bound: {},
radios: [],
value: null,
initialize: function(group,options) {
if (!Form.Radio) { throw 'required Class Form.Radio not found'; }
this.setOptions(options);
this.bound = { select: this.select.bind(this) };
group = $(group);
if (!group) { return this; }
var radios = group.getElements('input[type=radio]');
radios.each(this.addCheck,this);
},
addCheck: function(radio,i) {
var initialValues = this.options.initialValues[radio.get('name')];
var radioOptions = {};
radioOptions.checked = initialValues ? initialValues.contains(radio.get('value')) : radio.get('checked');
radioOptions.disabled = radio.get('disabled');
var check = (radio.retrieve('Form.Radio::data')
|| new Form.Radio(radio,Object.append(radioOptions,this.options.radioOptions)));
check.addEvent('onCheck',this.bound.select);
if (check.checked) { i ? this.changed(check) : this.value = check.value; }
radio.store('Form.RadioGroup::data',this);
this.radios.push(check);
},
changed: function(radio) {
this.value = radio.value;
this.fireEvent('onChange',this);
},
disable: function() {
this.radios.each(function(radio) { radio.disable(); });
},
enable: function() {
this.radios.each(function(radio) { radio.enable(); });
},
select: function(checkedRadio) {
this.radios.each(function(radio) {
if (radio.checked && radio.value !== checkedRadio.value) { radio.uncheck(); }
});
if (checkedRadio.value !== this.value) { this.changed(checkedRadio); }
}
});