2
* @author alexander.farkas
9
if(!$.prop || supportsValidity){return;}
10
var supportTest = function(){
11
supportsValidity = !!$('<input />').prop('validity');
17
$.widget('ui.checkBox', {
20
addVisualElement: true,
28
if(!this.element.is(':radio,:checkbox')){
29
if(this.element[0].elements && $.nodeName(this.element[0], 'form')){
30
$(this.element[0].elements).filter(':radio,:checkbox').checkBox(opts);
35
this._proxiedReflectUI = $.proxy(this, 'reflectUI');
39
this.checkedStatus = false;
40
this.disabledStatus = false;
41
this.hoverStatus = false;
43
this.inputType = this.element[0].type;
44
this.radio = this.inputType == 'radio';
46
this.visualElement = $([]);
48
this.element.addClass('ui-helper-hidden-accessible');
49
if(opts.addVisualElement){
50
this.visualElement = $('<span />')
51
.addClass('ui-'+this.inputType)
53
this.element.after(this.visualElement[0]);
58
var id = this.element[0].id;
60
this.labels = $('label[for="' + id + '"]', this.element[0].form || this.element[0].ownerDocument).add(this.element.parent('label'));
63
this.labels = this.element.closest('label', this.element[0].form);
65
this.labels.addClass(this.radio ? 'ui-radio' : 'ui-checkbox');
68
this.visualGroup = this.visualElement.add(this.labels);
72
this.initialized = true;
73
this.reflectUI({type: 'initialreflect'});
76
_addEvents: function(){
81
toggleHover = function(e){
82
if(that.disabledStatus){
85
that.hover = (e.type == 'focus' || e.type == 'mouseenter');
86
if(e.type == 'focus'){
87
that.visualGroup.addClass(that.inputType +'-focused');
88
} else if(e.type == 'blur'){
89
that.visualGroup.removeClass(that.inputType +'-focused');
91
that._changeStateClassChain();
97
.bind('click.checkBox invalid.checkBox', this._proxiedReflectUI)
98
.bind('focus.checkBox blur.checkBox', toggleHover)
102
.bind('usermode', function(e){
104
that.destroy.call(that, true));
108
if(opts.addVisualElement){
110
.bind('click.checkBox', function(e){
111
that.element[0].click();
117
this.visualGroup.bind('mouseenter.checkBox mouseleave.checkBox', toggleHover);
120
_changeStateClassChain: function(){
121
var allElements = this.labels.add(this.visualElement),
123
baseClass = 'ui-'+ this.inputType
126
if(this.checkedStatus){
127
stateClass += '-checked';
128
allElements.addClass(baseClass+'-checked');
130
allElements.removeClass(baseClass+'-checked');
133
if(this.disabledStatus){
134
stateClass += '-disabled';
135
allElements.addClass(baseClass+'-disabled');
137
allElements.removeClass(baseClass+'-disabled');
140
stateClass += '-hover';
141
allElements.addClass(baseClass+'-hover');
143
allElements.removeClass(baseClass+'-hover');
146
baseClass += '-state';
148
stateClass = baseClass + stateClass;
151
function switchStateClass(){
152
var classes = this.className.split(' '),
154
$.each(classes, function(i, classN){
155
if(classN.indexOf(baseClass) === 0){
157
classes[i] = stateClass;
163
classes.push(stateClass);
165
this.className = classes.join(' ');
168
this.visualGroup.each(switchStateClass);
170
destroy: function(onlyCss){
171
this.element.removeClass('ui-helper-hidden-accessible');
172
this.visualElement.addClass('ui-helper-hidden');
174
var o = this.options;
175
this.element.unbind('.checkBox');
176
this.visualElement.remove();
179
.removeClass('ui-state-hover ui-state-checked ui-state-disabled')
184
disable: function(status){
185
if(status === undefined){
188
this.element[0].disabled = status;
189
this.reflectUI({type: 'manuallydisabled'});
193
this.element[0].disabled = false;
194
this.reflectUI({type: 'manuallyenabled'});
198
this.changeCheckStatus(!(this.element.is(':checked')), e);
201
changeCheckStatus: function(status, e){
202
if(e && e.type == 'click' && this.element[0].disabled){
205
this.element[0].checked = !!status;
206
this.reflectUI(e || {
207
type: 'changecheckstatus'
211
propagate: function(n, e, _noGroupReflect){
212
if(!e || e.type != 'initialreflect'){
213
if (this.radio && !_noGroupReflect) {
214
var elem = this.element[0];
216
$('[name="'+ elem.name +'"]', elem.form || elem.ownerDocument).checkBox('reflectUI', e, true);
219
return this._trigger(n, e, {
220
options: this.options,
221
checked: this.checkedStatus,
223
disabled: this.disabledStatus
228
changeValidityState: function(){
229
if(supportsValidity){
230
this.visualGroup[ !this.element.prop('willValidate') || (this.element.prop('validity') || {valid: true}).valid ? 'removeClass' : 'addClass' ](this.inputType +'-invalid');
233
reflectUI: function(e){
235
var oldChecked = this.checkedStatus,
236
oldDisabledStatus = this.disabledStatus
239
this.disabledStatus = this.element.is(':disabled');
240
this.checkedStatus = this.element.is(':checked');
241
if(!e || e.type !== 'initialreflect'){
242
this.changeValidityState();
245
if (this.disabledStatus != oldDisabledStatus || this.checkedStatus !== oldChecked) {
246
this._changeStateClassChain();
248
(this.disabledStatus != oldDisabledStatus &&
249
this.propagate('disabledchange', e));
251
(this.checkedStatus !== oldChecked &&
252
this.propagate('change', e));
259
$.each({checked: 'changeCheckStatus', disabled: 'disable'}, function(name, fn){
261
if(!$.propHooks[name]){
262
$.propHooks[name] = {};
264
var oldSetHook = $.propHooks[name].set;
266
$.propHooks[name].set = function(elem, value){
267
var widget = $.data(elem, 'checkBox');
271
return oldSetHook && oldSetHook(elem, value) ;