blob: 3399fc1b7cebbe134481e45c44742275dcbbc0a4 [file] [log] [blame]
/* ===========================================================
* bootstrap-checkbox - v.1.0.1
* ===========================================================
* Copyright 2014 Roberto Montresor
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function($) {
var Checkbox = function(element, options, e) {
if (e) {
e.stopPropagation();
e.preventDefault();
}
this.$element = $(element);
this.$newElement = null;
this.button = null;
this.label = null;
this.labelPrepend = null;
this.options = $.extend({}, $.fn.checkbox.defaults, this.$element.data(), typeof options == 'object' && options);
this.init();
};
Checkbox.prototype = {
constructor: Checkbox,
init: function (e) {
this.$element.hide();
this.$element.attr('autocomplete', 'off');
this._createButtons();
},
_createButtons: function(){
var classList = this.$element.attr('class') !== undefined ? this.$element.attr('class').split(/\s+/) : '';
var template = this.getTemplate();
this.$element.after(template);
this.$newElement = this.$element.next('.bootstrap-checkbox');
this.button = this.$newElement.find('button');
this.label = this.$newElement.find('span.label-checkbox');
this.labelPrepend = this.$newElement.find('span.label-prepend-checkbox');
for (var i = 0; i < classList.length; i++) {
if(classList[i] != 'checkbox') {
this.$newElement.addClass(classList[i]);
}
}
this.button.addClass(this.options.buttonStyle);
if (this.$element.data('default-state') != undefined){
this.options.defaultState = this.$element.data('default-state');
}
if (this.$element.data('default-enabled') != undefined){
this.options.defaultEnabled = this.$element.data('default-enabled');
}
if (this.$element.data('display-as-button') != undefined){
this.options.displayAsButton = this.$element.data('display-as-button');
}
if (this.options.indeterminate)
this.$element.prop('indeterminate', true);
this.checkEnabled();
this.checkChecked();
this.checkTabIndex();
this.clickListener();
},
getTemplate: function() {
var additionalButtonStyle = this.options.displayAsButton ? ' displayAsButton' : '',
label = this.$element.data('label') ? '<span class="label-checkbox">'+this.$element.data('label')+'</span>' : '',
labelPrepend = this.$element.data('label-prepend') ? '<span class="label-prepend-checkbox">'+this.$element.data('label-prepend')+'</span>' : '';
var template =
'<span class="button-checkbox bootstrap-checkbox">' +
'<button type="button" class="btn clearfix'+additionalButtonStyle+'">' +
((this.$element.data('label-prepend') && this.options.displayAsButton) ? labelPrepend : '')+
'<span class="icon '+this.options.checkedClass+'" style="display:none;"></span>' +
'<span class="icon '+this.options.uncheckedClass+'"></span>' +
'<span class="icon '+this.options.indeterminateClass+'" style="display:none;"></span>' +
((this.$element.data('label') && this.options.displayAsButton) ? label : '')+
'</button>' +
'</span>';
if (!this.options.displayAsButton && (this.$element.data('label') || this.$element.data('label-prepend'))) {
template =
'<label class="'+this.options.labelClass+'">' +
labelPrepend + template + label+
'</label>';
}
return template;
},
checkEnabled: function() {
this.button.attr('disabled', this.$element.is(':disabled'));
this.$newElement.toggleClass('disabled', this.$element.is(':disabled'));
},
checkTabIndex: function() {
if (this.$element.is('[tabindex]')) {
var tabindex = this.$element.attr("tabindex");
this.button.attr('tabindex', tabindex);
}
},
checkChecked: function() {
var whitePattern = /\s/g, replaceChar = '.';
if (this.$element.prop('indeterminate') == true){
this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).hide();
this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).hide();
this.button.find('span.'+this.options.indeterminateClass.replace(whitePattern, replaceChar)).show();
} else {
if (this.$element.is(':checked')) {
this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).show();
this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).hide();
} else {
this.button.find('span.'+this.options.checkedClass.replace(whitePattern, replaceChar)).hide();
this.button.find('span.'+this.options.uncheckedClass.replace(whitePattern, replaceChar)).show();
}
this.button.find('span.'+this.options.indeterminateClass.replace(whitePattern, replaceChar)).hide();
}
if (this.$element.is(':checked')) {
if (this.options.buttonStyleChecked){
this.button.removeClass(this.options.buttonStyle);
this.button.addClass(this.options.buttonStyleChecked);
}
} else {
if (this.options.buttonStyleChecked){
this.button.removeClass(this.options.buttonStyleChecked);
this.button.addClass(this.options.buttonStyle);
}
}
if (this.$element.is(':checked')) {
if (this.options.labelClassChecked){
$(this.$element).next("label").addClass(this.options.labelClassChecked);
}
} else {
if (this.options.labelClassChecked){
$(this.$element).next("label").removeClass(this.options.labelClassChecked);
}
}
},
clickListener: function() {
var _this = this;
this.button.on('click', function(e){
e.preventDefault();
_this.$element.prop("indeterminate", false);
_this.$element[0].click();
_this.checkChecked();
});
this.$element.on('change', function(e) {
_this.checkChecked();
});
this.$element.parents('form').on('reset', function(e) {
if (_this.options.defaultState == null){
_this.$element.prop('indeterminate', true);
} else {
_this.$element.prop('checked', _this.options.defaultState);
}
_this.$element.prop('disabled', !_this.options.defaultEnabled);
_this.checkEnabled();
_this.checkChecked();
e.preventDefault();
});
},
setOptions: function(option, event){
if (option.checked != undefined) {
this.setChecked(option.checked);
}
if (option.enabled != undefined) {
this.setEnabled(option.enabled);
}
if (option.indeterminate != undefined) {
this.setIndeterminate(option.indeterminate);
}
},
setChecked: function(checked){
this.$element.prop("checked", checked);
this.$element.prop("indeterminate", false);
this.checkChecked();
},
setIndeterminate: function(indeterminate){
this.$element.prop("indeterminate", indeterminate);
this.checkChecked();
},
click: function(event){
this.$element.prop("indeterminate", false);
this.$element[0].click();
this.checkChecked();
},
change: function(event){
this.$element.change();
},
setEnabled: function(enabled){
this.$element.attr('disabled', !enabled);
this.checkEnabled();
},
toggleEnabled: function(event){
this.$element.attr('disabled', !this.$element.is(':disabled'));
this.checkEnabled();
},
refresh: function(event){
this.checkEnabled();
this.checkChecked();
},
update: function(options){
if (!this.$element.next().find('.bootstrap-checkbox'))
return;
this.options = $.extend({}, this.options, options);
this.$element.next().remove();
this._createButtons();
}
};
$.fn.checkbox = function(option, event) {
return this.each(function () {
var $this = $(this),
data = $this.data('checkbox'),
options = typeof option == 'object' && option;
if (!data) {
$this.data('checkbox', (data = new Checkbox(this, options, event)));
if (data.options.constructorCallback != undefined){
data.options.constructorCallback(data.$element, data.button, data.label, data.labelPrepend);
}
} else {
if (typeof option == 'string') {
data[option](event);
} else if (typeof option != 'undefined') {
data.setOptions(option, event);
}
}
});
};
$.fn.checkbox.defaults = {
displayAsButton: false,
indeterminate: false,
buttonStyle: 'btn-link',
buttonStyleChecked: null,
checkedClass: 'cb-icon-check',
uncheckedClass: 'cb-icon-check-empty',
indeterminateClass: 'cb-icon-check-indeterminate',
defaultState: false,
defaultEnabled: true,
constructorCallback: null,
labelClass: "checkbox bootstrap-checkbox",
labelClassChecked: "active"
};
}(window.jQuery);