bootstrap-switch.min.js
12.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*! ============================================================
* bootstrapSwitch v1.8 by Larentis Mattia @SpiritualGuru
* http://www.larentis.eu/
*
* Enhanced for radiobuttons by Stein, Peter @BdMdesigN
* http://www.bdmdesign.org/
*
* Project site:
* http://www.larentis.eu/switch/
* ============================================================
* Licensed under the Apache License, Version 2.0
* http://www.apache.org/licenses/LICENSE-2.0
* ============================================================ */
!function ($) {
"use strict";
$.fn['bootstrapSwitch'] = function (method) {
var inputSelector = 'input[type!="hidden"]';
var methods = {init: function () {
return this.each(function () {
var $element = $(this), $div, $switchLeft, $switchRight, $label, $form = $element.closest('form'), myClasses = "", classes = $element.attr('class'), color, moving, onLabel = "ON", offLabel = "OFF", icon = false, textLabel = false;
$.each(['switch-mini', 'switch-small', 'switch-large'], function (i, el) {
if (classes.indexOf(el) >= 0)myClasses = el
});
$element.addClass('has-switch');
if ($element.data('on') !== undefined)color = "switch-" + $element.data('on');
if ($element.data('on-label') !== undefined)onLabel = $element.data('on-label');
if ($element.data('off-label') !== undefined)offLabel = $element.data('off-label');
if ($element.data('label-icon') !== undefined)icon = $element.data('label-icon');
if ($element.data('text-label') !== undefined)textLabel = $element.data('text-label');
$switchLeft = $('<span>').addClass("switch-left").addClass(myClasses).addClass(color).html(onLabel);
color = '';
if ($element.data('off') !== undefined)color = "switch-" + $element.data('off');
$switchRight = $('<span>').addClass("switch-right").addClass(myClasses).addClass(color).html(offLabel);
$label = $('<label>').html(" ").addClass(myClasses).attr('for', $element.find(inputSelector).attr('id'));
if (icon) {
$label.html('<i class="icon ' + icon + '"></i>')
}
if (textLabel) {
$label.html('' + textLabel + '')
}
$div = $element.find(inputSelector).wrap($('<div>')).parent().data('animated', false);
if ($element.data('animated') !== false)$div.addClass('switch-animate').data('animated', true);
$div.append($switchLeft).append($label).append($switchRight);
$element.find('>div').addClass($element.find(inputSelector).is(':checked') ? 'switch-on' : 'switch-off');
if ($element.find(inputSelector).is(':disabled'))$(this).addClass('deactivate');
var changeStatus = function ($this) {
if ($element.parent('label').is('.label-change-switch')) {
} else {
$this.siblings('label').trigger('mousedown').trigger('mouseup').trigger('click')
}
};
$element.on('keydown', function (e) {
if (e.keyCode === 32) {
e.stopImmediatePropagation();
e.preventDefault();
changeStatus($(e.target).find('span:first'))
}
});
$switchLeft.on('click', function (e) {
changeStatus($(this))
});
$switchRight.on('click', function (e) {
changeStatus($(this))
});
$element.find(inputSelector).on('change', function (e, skipOnChange) {
var $this = $(this), $element = $this.parent(), thisState = $this.is(':checked'), state = $element.is('.switch-off');
e.preventDefault();
$element.css('left', '');
if (state === thisState) {
if (thisState)$element.removeClass('switch-off').addClass('switch-on'); else $element.removeClass('switch-on').addClass('switch-off');
if ($element.data('animated') !== false)$element.addClass("switch-animate");
if (typeof skipOnChange === 'boolean' && skipOnChange)return;
$element.parent().trigger('switch-change', {'el': $this, 'value': thisState})
}
});
$element.find('label').on('mousedown touchstart', function (e) {
var $this = $(this);
moving = false;
e.preventDefault();
e.stopImmediatePropagation();
$this.closest('div').removeClass('switch-animate');
if ($this.closest('.has-switch').is('.deactivate')) {
$this.unbind('click')
} else if ($this.closest('.switch-on').parent().is('.radio-no-uncheck')) {
$this.unbind('click')
} else {
$this.on('mousemove touchmove', function (e) {
var $element = $(this).closest('.make-switch'), relativeX = (e.pageX || e.originalEvent.targetTouches[0].pageX) - $element.offset().left, percent = (relativeX / $element.width()) * 100, left = 25, right = 75;
moving = true;
if (percent < left)percent = left; else if (percent > right)percent = right;
$element.find('>div').css('left', (percent - right) + "%")
});
$this.on('click touchend', function (e) {
var $this = $(this), $target = $(e.target), $myRadioCheckBox = $target.siblings('input');
e.stopImmediatePropagation();
e.preventDefault();
$this.unbind('mouseleave');
if (moving)$myRadioCheckBox.prop('checked', !(parseInt($this.parent().css('left')) < -25)); else $myRadioCheckBox.prop("checked", !$myRadioCheckBox.is(":checked"));
moving = false;
$myRadioCheckBox.trigger('change')
});
$this.on('mouseleave', function (e) {
var $this = $(this), $myInputBox = $this.siblings('input');
e.preventDefault();
e.stopImmediatePropagation();
$this.unbind('mouseleave');
$this.trigger('mouseup');
$myInputBox.prop('checked', !(parseInt($this.parent().css('left')) < -25)).trigger('change')
});
$this.on('mouseup', function (e) {
e.stopImmediatePropagation();
e.preventDefault();
$(this).unbind('mousemove')
})
}
});
if ($form.data('bootstrapSwitch') !== 'injected') {
$form.bind('reset', function () {
setTimeout(function () {
$form.find('.make-switch').each(function () {
var $input = $(this).find(inputSelector);
$input.prop('checked', $input.is(':checked')).trigger('change')
})
}, 1)
});
$form.data('bootstrapSwitch', 'injected')
}
})
}, toggleActivation: function () {
var $this = $(this);
$this.toggleClass('deactivate');
$this.find(inputSelector).prop('disabled', $this.is('.deactivate'))
}, isActive: function () {
return!$(this).hasClass('deactivate')
}, setActive: function (active) {
var $this = $(this);
if (active) {
$this.removeClass('deactivate');
$this.find(inputSelector).removeAttr('disabled')
} else {
$this.addClass('deactivate');
$this.find(inputSelector).attr('disabled', 'disabled')
}
}, toggleState: function (skipOnChange) {
var $input = $(this).find(':checkbox');
$input.prop('checked', !$input.is(':checked')).trigger('change', skipOnChange)
}, toggleRadioState: function (skipOnChange) {
var $radioinput = $(this).find(':radio');
$radioinput.not(':checked').prop('checked', !$radioinput.is(':checked')).trigger('change', skipOnChange)
}, toggleRadioStateAllowUncheck: function (uncheck, skipOnChange) {
var $radioinput = $(this).find(':radio');
if (uncheck) {
$radioinput.not(':checked').trigger('change', skipOnChange)
} else {
$radioinput.not(':checked').prop('checked', !$radioinput.is(':checked')).trigger('change', skipOnChange)
}
}, setState: function (value, skipOnChange) {
$(this).find(inputSelector).prop('checked', value).trigger('change', skipOnChange)
}, setOnLabel: function (value) {
var $switchLeft = $(this).find(".switch-left");
$switchLeft.html(value)
}, setOffLabel: function (value) {
var $switchRight = $(this).find(".switch-right");
$switchRight.html(value)
}, setOnClass: function (value) {
var $switchLeft = $(this).find(".switch-left");
var color = '';
if (value !== undefined) {
if ($(this).attr('data-on') !== undefined) {
color = "switch-" + $(this).attr('data-on')
}
$switchLeft.removeClass(color);
color = "switch-" + value;
$switchLeft.addClass(color)
}
}, setOffClass: function (value) {
var $switchRight = $(this).find(".switch-right");
var color = '';
if (value !== undefined) {
if ($(this).attr('data-off') !== undefined) {
color = "switch-" + $(this).attr('data-off')
}
$switchRight.removeClass(color);
color = "switch-" + value;
$switchRight.addClass(color)
}
}, setAnimated: function (value) {
var $element = $(this).find(inputSelector).parent();
if (value === undefined)value = false;
$element.data('animated', value);
$element.attr('data-animated', value);
if ($element.data('animated') !== false) {
$element.addClass("switch-animate")
} else {
$element.removeClass("switch-animate")
}
}, setSizeClass: function (value) {
var $element = $(this);
var $switchLeft = $element.find(".switch-left");
var $switchRight = $element.find(".switch-right");
var $label = $element.find("label");
$.each(['switch-mini', 'switch-small', 'switch-large'], function (i, el) {
if (el !== value) {
$switchLeft.removeClass(el);
$switchRight.removeClass(el);
$label.removeClass(el)
} else {
$switchLeft.addClass(el);
$switchRight.addClass(el);
$label.addClass(el)
}
})
}, status: function () {
return $(this).find(inputSelector).is(':checked')
}, destroy: function () {
var $element = $(this), $div = $element.find('div'), $form = $element.closest('form'), $inputbox;
$div.find(':not(input)').remove();
$inputbox = $div.children();
$inputbox.unwrap().unwrap();
$inputbox.unbind('change');
if ($form) {
$form.unbind('reset');
$form.removeData('bootstrapSwitch')
}
return $inputbox
}};
if (methods[method])return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); else if (typeof method === 'object' || !method)return methods.init.apply(this, arguments); else $.error('Method ' + method + ' does not exist!')
}
}(jQuery);
(function ($) {
$(function () {
$('.make-switch')['bootstrapSwitch']()
})
})(jQuery);