181 lines
5.4 KiB
JavaScript
181 lines
5.4 KiB
JavaScript
|
/*! ========================================================================
|
||
|
* Bootstrap Toggle: bootstrap-toggle.js v2.2.0
|
||
|
* http://www.bootstraptoggle.com
|
||
|
* ========================================================================
|
||
|
* Copyright 2014 Min Hur, The New York Times Company
|
||
|
* Licensed under MIT
|
||
|
* ======================================================================== */
|
||
|
|
||
|
|
||
|
+function ($) {
|
||
|
'use strict';
|
||
|
|
||
|
// TOGGLE PUBLIC CLASS DEFINITION
|
||
|
// ==============================
|
||
|
|
||
|
var Toggle = function (element, options) {
|
||
|
this.$element = $(element)
|
||
|
this.options = $.extend({}, this.defaults(), options)
|
||
|
this.render()
|
||
|
}
|
||
|
|
||
|
Toggle.VERSION = '2.2.0'
|
||
|
|
||
|
Toggle.DEFAULTS = {
|
||
|
on: 'On',
|
||
|
off: 'Off',
|
||
|
onstyle: 'primary',
|
||
|
offstyle: 'default',
|
||
|
size: 'normal',
|
||
|
style: '',
|
||
|
width: null,
|
||
|
height: null
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.defaults = function() {
|
||
|
return {
|
||
|
on: this.$element.attr('data-on') || Toggle.DEFAULTS.on,
|
||
|
off: this.$element.attr('data-off') || Toggle.DEFAULTS.off,
|
||
|
onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle,
|
||
|
offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle,
|
||
|
size: this.$element.attr('data-size') || Toggle.DEFAULTS.size,
|
||
|
style: this.$element.attr('data-style') || Toggle.DEFAULTS.style,
|
||
|
width: this.$element.attr('data-width') || Toggle.DEFAULTS.width,
|
||
|
height: this.$element.attr('data-height') || Toggle.DEFAULTS.height
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.render = function () {
|
||
|
this._onstyle = 'btn-' + this.options.onstyle
|
||
|
this._offstyle = 'btn-' + this.options.offstyle
|
||
|
var size = this.options.size === 'large' ? 'btn-lg'
|
||
|
: this.options.size === 'small' ? 'btn-sm'
|
||
|
: this.options.size === 'mini' ? 'btn-xs'
|
||
|
: ''
|
||
|
var $toggleOn = $('<label class="btn">').html(this.options.on)
|
||
|
.addClass(this._onstyle + ' ' + size)
|
||
|
var $toggleOff = $('<label class="btn">').html(this.options.off)
|
||
|
.addClass(this._offstyle + ' ' + size + ' active')
|
||
|
var $toggleHandle = $('<span class="toggle-handle btn btn-default">')
|
||
|
.addClass(size)
|
||
|
var $toggleGroup = $('<div class="toggle-group">')
|
||
|
.append($toggleOn, $toggleOff, $toggleHandle)
|
||
|
var $toggle = $('<div class="toggle btn" data-toggle="toggle">')
|
||
|
.addClass( this.$element.prop('checked') ? this._onstyle : this._offstyle+' off' )
|
||
|
.addClass(size).addClass(this.options.style)
|
||
|
|
||
|
this.$element.wrap($toggle)
|
||
|
$.extend(this, {
|
||
|
$toggle: this.$element.parent(),
|
||
|
$toggleOn: $toggleOn,
|
||
|
$toggleOff: $toggleOff,
|
||
|
$toggleGroup: $toggleGroup
|
||
|
})
|
||
|
this.$toggle.append($toggleGroup)
|
||
|
|
||
|
var width = this.options.width || Math.max($toggleOn.outerWidth(), $toggleOff.outerWidth())+($toggleHandle.outerWidth()/2)
|
||
|
var height = this.options.height || Math.max($toggleOn.outerHeight(), $toggleOff.outerHeight())
|
||
|
$toggleOn.addClass('toggle-on')
|
||
|
$toggleOff.addClass('toggle-off')
|
||
|
this.$toggle.css({ width: width, height: height })
|
||
|
if (this.options.height) {
|
||
|
$toggleOn.css('line-height', $toggleOn.height() + 'px')
|
||
|
$toggleOff.css('line-height', $toggleOff.height() + 'px')
|
||
|
}
|
||
|
this.update(true)
|
||
|
this.trigger(true)
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.toggle = function () {
|
||
|
if (this.$element.prop('checked')) this.off()
|
||
|
else this.on()
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.on = function (silent) {
|
||
|
if (this.$element.prop('disabled')) return false
|
||
|
this.$toggle.removeClass(this._offstyle + ' off').addClass(this._onstyle)
|
||
|
this.$element.prop('checked', true)
|
||
|
if (!silent) this.trigger()
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.off = function (silent) {
|
||
|
if (this.$element.prop('disabled')) return false
|
||
|
this.$toggle.removeClass(this._onstyle).addClass(this._offstyle + ' off')
|
||
|
this.$element.prop('checked', false)
|
||
|
if (!silent) this.trigger()
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.enable = function () {
|
||
|
this.$toggle.removeAttr('disabled')
|
||
|
this.$element.prop('disabled', false)
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.disable = function () {
|
||
|
this.$toggle.attr('disabled', 'disabled')
|
||
|
this.$element.prop('disabled', true)
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.update = function (silent) {
|
||
|
if (this.$element.prop('disabled')) this.disable()
|
||
|
else this.enable()
|
||
|
if (this.$element.prop('checked')) this.on(silent)
|
||
|
else this.off(silent)
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.trigger = function (silent) {
|
||
|
this.$element.off('change.bs.toggle')
|
||
|
if (!silent) this.$element.change()
|
||
|
this.$element.on('change.bs.toggle', $.proxy(function() {
|
||
|
this.update()
|
||
|
}, this))
|
||
|
}
|
||
|
|
||
|
Toggle.prototype.destroy = function() {
|
||
|
this.$element.off('change.bs.toggle')
|
||
|
this.$toggleGroup.remove()
|
||
|
this.$element.removeData('bs.toggle')
|
||
|
this.$element.unwrap()
|
||
|
}
|
||
|
|
||
|
// TOGGLE PLUGIN DEFINITION
|
||
|
// ========================
|
||
|
|
||
|
function Plugin(option) {
|
||
|
return this.each(function () {
|
||
|
var $this = $(this)
|
||
|
var data = $this.data('bs.toggle')
|
||
|
var options = typeof option == 'object' && option
|
||
|
|
||
|
if (!data) $this.data('bs.toggle', (data = new Toggle(this, options)))
|
||
|
if (typeof option == 'string' && data[option]) data[option]()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
var old = $.fn.bootstrapToggle
|
||
|
|
||
|
$.fn.bootstrapToggle = Plugin
|
||
|
$.fn.bootstrapToggle.Constructor = Toggle
|
||
|
|
||
|
// TOGGLE NO CONFLICT
|
||
|
// ==================
|
||
|
|
||
|
$.fn.toggle.noConflict = function () {
|
||
|
$.fn.bootstrapToggle = old
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
// TOGGLE DATA-API
|
||
|
// ===============
|
||
|
|
||
|
$(function() {
|
||
|
$('input[type=checkbox][data-toggle^=toggle]').bootstrapToggle()
|
||
|
})
|
||
|
|
||
|
$(document).on('click.bs.toggle', 'div[data-toggle^=toggle]', function(e) {
|
||
|
var $checkbox = $(this).find('input[type=checkbox]')
|
||
|
$checkbox.bootstrapToggle('toggle')
|
||
|
e.preventDefault()
|
||
|
})
|
||
|
|
||
|
}(jQuery);
|