Browse Source

Build and dependency overhaul

Emanuele 8 years ago
parent
commit
b7ed8f174d

+ 8 - 0
.babelrc

@@ -0,0 +1,8 @@
+{
+  "presets": ["env"],
+  "env": {
+    "production": {
+      "presets": ["babili"]
+    }
+  }
+}

+ 0 - 3
.bowerrc

@@ -1,3 +0,0 @@
-{
-  "directory": "components"
-}

+ 1 - 0
.gitignore

@@ -4,3 +4,4 @@ components
 test.html
 .DS_Store
 .idea
+test/

+ 1 - 2
bower.json

@@ -23,7 +23,6 @@
     "jquery": ">=1.9.0"
   },
   "devDependencies": {
-    "jquery": "~2.1",
-    "bootstrap": "~3.3"
+    "jquery": "~2.1"
   }
 }

+ 37 - 58
dist/css/bootstrap2/bootstrap-switch.css

@@ -1,24 +1,3 @@
-/* ========================================================================
- * bootstrap-switch - v3.3.2
- * http://www.bootstrap-switch.org
- * ========================================================================
- * Copyright 2012-2013 Mattia Larentis
- *
- * ========================================================================
- * 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.
- * ========================================================================
- */
-
 .clearfix {
   *zoom: 1;
 }
@@ -105,19 +84,19 @@
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
-  color: #ffffff;
+  color: #fff;
   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
   background-color: #005fcc;
-  background-image: -moz-linear-gradient(top, #0044cc, #0088cc);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0044cc), to(#0088cc));
-  background-image: -webkit-linear-gradient(top, #0044cc, #0088cc);
-  background-image: -o-linear-gradient(top, #0044cc, #0088cc);
-  background-image: linear-gradient(to bottom, #0044cc, #0088cc);
+  background-image: -moz-linear-gradient(top, #0044cc, #08c);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0044cc), to(#08c));
+  background-image: -webkit-linear-gradient(top, #0044cc, #08c);
+  background-image: -o-linear-gradient(top, #0044cc, #08c);
+  background-image: linear-gradient(to bottom, #0044cc, #08c);
   background-repeat: repeat-x;
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0044cc', endColorstr='#ff0088cc', GradientType=0);
-  border-color: #0088cc #0088cc #005580;
+  border-color: #08c #08c #005580;
   border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #0088cc;
+  *background-color: #08c;
   /* Darken IE7 buttons by default so they stand out more given they won't have borders */
   filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
 }
@@ -133,8 +112,8 @@
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.disabled,
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary[disabled],
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary[disabled] {
-  color: #ffffff;
-  background-color: #0088cc;
+  color: #fff;
+  background-color: #08c;
   *background-color: #0077b3;
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:active,
@@ -145,7 +124,7 @@
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
-  color: #ffffff;
+  color: #fff;
   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
   background-color: #41a7c5;
   background-image: -moz-linear-gradient(top, #2f96b4, #5bc0de);
@@ -173,7 +152,7 @@
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.disabled,
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info[disabled],
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info[disabled] {
-  color: #ffffff;
+  color: #fff;
   background-color: #5bc0de;
   *background-color: #46b8da;
 }
@@ -185,7 +164,7 @@
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
-  color: #ffffff;
+  color: #fff;
   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
   background-color: #58b058;
   background-image: -moz-linear-gradient(top, #51a351, #62c462);
@@ -213,7 +192,7 @@
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.disabled,
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success[disabled],
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success[disabled] {
-  color: #ffffff;
+  color: #fff;
   background-color: #62c462;
   *background-color: #4fbd4f;
 }
@@ -225,7 +204,7 @@
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
-  color: #ffffff;
+  color: #fff;
   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
   background-color: #f9a123;
   background-image: -moz-linear-gradient(top, #f89406, #fbb450);
@@ -253,7 +232,7 @@
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.disabled,
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning[disabled],
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning[disabled] {
-  color: #ffffff;
+  color: #fff;
   background-color: #fbb450;
   *background-color: #faa937;
 }
@@ -265,7 +244,7 @@
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
-  color: #ffffff;
+  color: #fff;
   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
   background-color: #d14641;
   background-image: -moz-linear-gradient(top, #bd362f, #ee5f5b);
@@ -293,7 +272,7 @@
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.disabled,
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger[disabled],
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger[disabled] {
-  color: #ffffff;
+  color: #fff;
   background-color: #ee5f5b;
   *background-color: #ec4844;
 }
@@ -305,19 +284,19 @@
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
-  color: #333333;
+  color: #333;
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
   background-color: #f0f0f0;
-  background-image: -moz-linear-gradient(top, #e6e6e6, #ffffff);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e6e6e6), to(#ffffff));
-  background-image: -webkit-linear-gradient(top, #e6e6e6, #ffffff);
-  background-image: -o-linear-gradient(top, #e6e6e6, #ffffff);
-  background-image: linear-gradient(to bottom, #e6e6e6, #ffffff);
+  background-image: -moz-linear-gradient(top, #e6e6e6, #fff);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e6e6e6), to(#fff));
+  background-image: -webkit-linear-gradient(top, #e6e6e6, #fff);
+  background-image: -o-linear-gradient(top, #e6e6e6, #fff);
+  background-image: linear-gradient(to bottom, #e6e6e6, #fff);
   background-repeat: repeat-x;
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6', endColorstr='#ffffffff', GradientType=0);
-  border-color: #ffffff #ffffff #d9d9d9;
+  border-color: #fff #fff #d9d9d9;
   border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #ffffff;
+  *background-color: #fff;
   /* Darken IE7 buttons by default so they stand out more given they won't have borders */
   filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
 }
@@ -333,8 +312,8 @@
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.disabled,
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default[disabled],
 .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default[disabled] {
-  color: #333333;
-  background-color: #ffffff;
+  color: #333;
+  background-color: #fff;
   *background-color: #f2f2f2;
 }
 .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:active,
@@ -348,16 +327,16 @@
   margin-top: -1px;
   margin-bottom: -1px;
   z-index: 100;
-  border-left: 1px solid #cccccc;
-  border-right: 1px solid #cccccc;
-  color: #333333;
+  border-left: 1px solid #ccc;
+  border-right: 1px solid #ccc;
+  color: #333;
   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
   background-color: #f5f5f5;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-image: -moz-linear-gradient(top, #fff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #fff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #fff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #fff, #e6e6e6);
   background-repeat: repeat-x;
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
   border-color: #e6e6e6 #e6e6e6 #bfbfbf;
@@ -372,7 +351,7 @@
 .bootstrap-switch .bootstrap-switch-label.active,
 .bootstrap-switch .bootstrap-switch-label.disabled,
 .bootstrap-switch .bootstrap-switch-label[disabled] {
-  color: #333333;
+  color: #333;
   background-color: #e6e6e6;
   *background-color: #d9d9d9;
 }

File diff suppressed because it is too large
+ 0 - 21
dist/css/bootstrap2/bootstrap-switch.min.css


+ 3 - 24
dist/css/bootstrap3/bootstrap-switch.css

@@ -1,31 +1,10 @@
-/* ========================================================================
- * bootstrap-switch - v3.3.2
- * http://www.bootstrap-switch.org
- * ========================================================================
- * Copyright 2012-2013 Mattia Larentis
- *
- * ========================================================================
- * 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.
- * ========================================================================
- */
-
 .bootstrap-switch {
   display: inline-block;
   direction: ltr;
   cursor: pointer;
   border-radius: 4px;
   border: 1px solid;
-  border-color: #cccccc;
+  border-color: #ccc;
   position: relative;
   text-align: left;
   overflow: hidden;
@@ -100,8 +79,8 @@
   margin-top: -1px;
   margin-bottom: -1px;
   z-index: 100;
-  color: #333333;
-  background: #ffffff;
+  color: #333;
+  background: #fff;
 }
 .bootstrap-switch .bootstrap-switch-handle-on {
   border-bottom-left-radius: 3px;

File diff suppressed because it is too large
+ 0 - 21
dist/css/bootstrap3/bootstrap-switch.min.css


+ 541 - 573
dist/js/bootstrap-switch.js

@@ -1,160 +1,118 @@
-/* ========================================================================
- * bootstrap-switch - v3.3.2
- * http://www.bootstrap-switch.org
- * ========================================================================
- * Copyright 2012-2013 Mattia Larentis
- *
- * ========================================================================
- * 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 slice = [].slice;
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+(function ($, window) {
+  var BootstrapSwitch = function () {
+    function BootstrapSwitch(element) {
+      var _this = this,
+          _arguments = arguments;
+
+      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+      _classCallCheck(this, BootstrapSwitch);
+
+      this.$element = $(element);
+      this.options = Object.asign({}, $.fn.bootstrapSwitch.defaults, this._getElementOptions(), options);
+      this.prevOptions = {};
+
+      this.$wrapper = $('<div>', {
+        class: function _class() {
+          var classes = [];
+          classes.push(this.options.state ? 'on' : 'off');
+          if (this.options.size) {
+            classes.push(this.options.size);
+          }
+          if (this.options.disabled) {
+            classes.push('disabled');
+          }
+          if (this.options.readonly) {
+            classes.push('readonly');
+          }
+          if (this.options.indeterminate) {
+            classes.push('indeterminate');
+          }
+          if (this.options.inverse) {
+            classes.push('inverse');
+          }
+          if (this.$element.attr('id')) {
+            classes.push('id-' + this.$element.attr('id'));
+          }
+          return classes.map(this._getClass.bind(this)).concat([this.options.baseClass], this._getClasses(this.options.wrapperClass)).join(' ');
+        }
+      });
+      this.$container = $('<div>', { class: this._getClass('container') });
+      this.$on = $('<span>', {
+        html: this.options.onText,
+        class: this._getClass('handle-on') + ' ' + this._getClass(this.options.onColor)
+      });
+      this.$off = $('<span>', {
+        html: this.options.offText,
+        class: this._getClass('handle-off') + ' ' + this._getClass(this.options.offColor)
+      });
+      this.$label = $('<span>', {
+        html: this.options.labelText,
+        class: this._getClass('label')
+      });
 
-  (function($, window) {
-    "use strict";
-    var BootstrapSwitch;
-    BootstrapSwitch = (function() {
-      function BootstrapSwitch(element, options) {
-        if (options == null) {
-          options = {};
-        }
-        this.$element = $(element);
-        this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, {
-          state: this.$element.is(":checked"),
-          size: this.$element.data("size"),
-          animate: this.$element.data("animate"),
-          disabled: this.$element.is(":disabled"),
-          readonly: this.$element.is("[readonly]"),
-          indeterminate: this.$element.data("indeterminate"),
-          inverse: this.$element.data("inverse"),
-          radioAllOff: this.$element.data("radio-all-off"),
-          onColor: this.$element.data("on-color"),
-          offColor: this.$element.data("off-color"),
-          onText: this.$element.data("on-text"),
-          offText: this.$element.data("off-text"),
-          labelText: this.$element.data("label-text"),
-          handleWidth: this.$element.data("handle-width"),
-          labelWidth: this.$element.data("label-width"),
-          baseClass: this.$element.data("base-class"),
-          wrapperClass: this.$element.data("wrapper-class")
-        }, options);
-        this.prevOptions = {};
-        this.$wrapper = $("<div>", {
-          "class": (function(_this) {
-            return function() {
-              var classes;
-              classes = ["" + _this.options.baseClass].concat(_this._getClasses(_this.options.wrapperClass));
-              classes.push(_this.options.state ? _this.options.baseClass + "-on" : _this.options.baseClass + "-off");
-              if (_this.options.size != null) {
-                classes.push(_this.options.baseClass + "-" + _this.options.size);
-              }
-              if (_this.options.disabled) {
-                classes.push(_this.options.baseClass + "-disabled");
-              }
-              if (_this.options.readonly) {
-                classes.push(_this.options.baseClass + "-readonly");
-              }
-              if (_this.options.indeterminate) {
-                classes.push(_this.options.baseClass + "-indeterminate");
-              }
-              if (_this.options.inverse) {
-                classes.push(_this.options.baseClass + "-inverse");
-              }
-              if (_this.$element.attr("id")) {
-                classes.push(_this.options.baseClass + "-id-" + (_this.$element.attr("id")));
-              }
-              return classes.join(" ");
-            };
-          })(this)()
-        });
-        this.$container = $("<div>", {
-          "class": this.options.baseClass + "-container"
-        });
-        this.$on = $("<span>", {
-          html: this.options.onText,
-          "class": this.options.baseClass + "-handle-on " + this.options.baseClass + "-" + this.options.onColor
-        });
-        this.$off = $("<span>", {
-          html: this.options.offText,
-          "class": this.options.baseClass + "-handle-off " + this.options.baseClass + "-" + this.options.offColor
-        });
-        this.$label = $("<span>", {
-          html: this.options.labelText,
-          "class": this.options.baseClass + "-label"
-        });
-        this.$element.on("init.bootstrapSwitch", (function(_this) {
-          return function() {
-            return _this.options.onInit.apply(element, arguments);
-          };
-        })(this));
-        this.$element.on("switchChange.bootstrapSwitch", (function(_this) {
-          return function(e) {
-            if (false === _this.options.onSwitchChange.apply(element, arguments)) {
-              if (_this.$element.is(":radio")) {
-                return $("[name='" + (_this.$element.attr('name')) + "']").trigger("previousState.bootstrapSwitch", true);
-              } else {
-                return _this.$element.trigger("previousState.bootstrapSwitch", true);
-              }
-            }
-          };
-        })(this));
-        this.$container = this.$element.wrap(this.$container).parent();
-        this.$wrapper = this.$container.wrap(this.$wrapper).parent();
-        this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
-        if (this.options.indeterminate) {
-          this.$element.prop("indeterminate", true);
+      this.$element.on('init.bootstrapSwitch', this.options.onInit.bind(this, element));
+      this.$element.on('switchChange.bootstrapSwitch', function (event) {
+        if (_this.options.onSwitchChange.apply(element, _arguments) === false) {
+          if (_this.$element.is(':radio')) {
+            $('[name="' + _this.$element.attr('name') + '"]').trigger('previousState.bootstrapSwitch', true);
+          } else {
+            _this.$element.trigger('previousState.bootstrapSwitch', true);
+          }
         }
-        this._init();
-        this._elementHandlers();
-        this._handleHandlers();
-        this._labelHandlers();
-        this._formHandler();
-        this._externalLabelHandler();
-        this.$element.trigger("init.bootstrapSwitch", this.options.state);
-      }
+      });
 
-      BootstrapSwitch.prototype._constructor = BootstrapSwitch;
+      this.$container = this.$element.wrap(this.$container).parent();
+      this.$wrapper = this.$container.wrap(this.$wrapper).parent();
+      this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
 
-      BootstrapSwitch.prototype.setPrevOptions = function() {
-        return this.prevOptions = $.extend(true, {}, this.options);
-      };
+      if (this.options.indeterminate) {
+        this.$element.prop('indeterminate', true);
+      }
 
-      BootstrapSwitch.prototype.state = function(value, skip) {
-        if (typeof value === "undefined") {
+      this._init();
+      this._elementHandlers();
+      this._handleHandlers();
+      this._labelHandlers();
+      this._formHandler();
+      this._externalLabelHandler();
+      this.$element.trigger('init.bootstrapSwitch', this.options.state);
+    }
+
+    _createClass(BootstrapSwitch, [{
+      key: 'setPrevOptions',
+      value: function setPrevOptions() {
+        this.prevOptions = Object.assign({}, this.options);
+      }
+    }, {
+      key: 'state',
+      value: function state(value, skip) {
+        if (typeof value === 'undefined') {
           return this.options.state;
         }
-        if (this.options.disabled || this.options.readonly) {
-          return this.$element;
-        }
-        if (this.options.state && !this.options.radioAllOff && this.$element.is(":radio")) {
+        if (this.options.disabled || this.options.readonly || this.options.state && !this.options.radioAllOff && this.$element.is(':radio')) {
           return this.$element;
         }
-        if (this.$element.is(":radio")) {
-          $("[name='" + (this.$element.attr('name')) + "']").trigger("setPreviousOptions.bootstrapSwitch");
+        if (this.$element.is(':radio')) {
+          $('[name="' + this.$element.attr('name') + '"]').trigger('setPreviousOptions.bootstrapSwitch');
         } else {
-          this.$element.trigger("setPreviousOptions.bootstrapSwitch");
+          this.$element.trigger('setPreviousOptions.bootstrapSwitch');
         }
         if (this.options.indeterminate) {
           this.indeterminate(false);
         }
-        value = !!value;
-        this.$element.prop("checked", value).trigger("change.bootstrapSwitch", skip);
+        this.$element.prop('checked', Boolean(value)).trigger('change.bootstrapSwitch', skip);
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.toggleState = function(skip) {
+      }
+    }, {
+      key: 'toggleState',
+      value: function toggleState(skip) {
         if (this.options.disabled || this.options.readonly) {
           return this.$element;
         }
@@ -162,152 +120,156 @@
           this.indeterminate(false);
           return this.state(true);
         } else {
-          return this.$element.prop("checked", !this.options.state).trigger("change.bootstrapSwitch", skip);
+          return this.$element.prop('checked', !this.options.state).trigger('change.bootstrapSwitch', skip);
         }
-      };
-
-      BootstrapSwitch.prototype.size = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'size',
+      value: function size(value) {
+        if (typeof value === 'undefined') {
           return this.options.size;
         }
         if (this.options.size != null) {
-          this.$wrapper.removeClass(this.options.baseClass + "-" + this.options.size);
+          this.$wrapper.removeClass(this._getClass(this.options.size));
         }
         if (value) {
-          this.$wrapper.addClass(this.options.baseClass + "-" + value);
+          this.$wrapper.addClass(this._getClass(value));
         }
         this._width();
         this._containerPosition();
         this.options.size = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.animate = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'animate',
+      value: function animate(value) {
+        if (typeof value === 'undefined') {
           return this.options.animate;
         }
-        value = !!value;
-        if (value === this.options.animate) {
+        if (this.options.animate === Boolean(value)) {
           return this.$element;
         }
         return this.toggleAnimate();
-      };
-
-      BootstrapSwitch.prototype.toggleAnimate = function() {
+      }
+    }, {
+      key: 'toggleAnimate',
+      value: function toggleAnimate() {
         this.options.animate = !this.options.animate;
-        this.$wrapper.toggleClass(this.options.baseClass + "-animate");
+        this.$wrapper.toggleClass(this._getClass('animate'));
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.disabled = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'disabled',
+      value: function disabled(value) {
+        if (typeof value === 'undefined') {
           return this.options.disabled;
         }
-        value = !!value;
-        if (value === this.options.disabled) {
+        if (this.options.disabled === Boolean(value)) {
           return this.$element;
         }
         return this.toggleDisabled();
-      };
-
-      BootstrapSwitch.prototype.toggleDisabled = function() {
+      }
+    }, {
+      key: 'toggleDisabled',
+      value: function toggleDisabled() {
         this.options.disabled = !this.options.disabled;
-        this.$element.prop("disabled", this.options.disabled);
-        this.$wrapper.toggleClass(this.options.baseClass + "-disabled");
+        this.$element.prop('disabled', this.options.disabled);
+        this.$wrapper.toggleClass(this._getClass('disabled'));
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.readonly = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'readonly',
+      value: function readonly(value) {
+        if (typeof value === 'undefined') {
           return this.options.readonly;
         }
-        value = !!value;
-        if (value === this.options.readonly) {
+        if (this.options.readonly === Boolean(value)) {
           return this.$element;
         }
         return this.toggleReadonly();
-      };
-
-      BootstrapSwitch.prototype.toggleReadonly = function() {
+      }
+    }, {
+      key: 'toggleReadonly',
+      value: function toggleReadonly() {
         this.options.readonly = !this.options.readonly;
-        this.$element.prop("readonly", this.options.readonly);
-        this.$wrapper.toggleClass(this.options.baseClass + "-readonly");
+        this.$element.prop('readonly', this.options.readonly);
+        this.$wrapper.toggleClass(this._getClass('readonly'));
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.indeterminate = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'indeterminate',
+      value: function indeterminate(value) {
+        if (typeof value === 'undefined') {
           return this.options.indeterminate;
         }
-        value = !!value;
-        if (value === this.options.indeterminate) {
+        if (this.options.indeterminate === Boolean(value)) {
           return this.$element;
         }
         return this.toggleIndeterminate();
-      };
-
-      BootstrapSwitch.prototype.toggleIndeterminate = function() {
+      }
+    }, {
+      key: 'toggleIndeterminate',
+      value: function toggleIndeterminate() {
         this.options.indeterminate = !this.options.indeterminate;
-        this.$element.prop("indeterminate", this.options.indeterminate);
-        this.$wrapper.toggleClass(this.options.baseClass + "-indeterminate");
+        this.$element.prop('indeterminate', this.options.indeterminate);
+        this.$wrapper.toggleClass(this._getClass('indeterminate'));
         this._containerPosition();
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.inverse = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'inverse',
+      value: function inverse(value) {
+        if (typeof value === 'undefined') {
           return this.options.inverse;
         }
-        value = !!value;
-        if (value === this.options.inverse) {
+        if (this.options.inverse === Boolean(value)) {
           return this.$element;
         }
         return this.toggleInverse();
-      };
-
-      BootstrapSwitch.prototype.toggleInverse = function() {
-        var $off, $on;
-        this.$wrapper.toggleClass(this.options.baseClass + "-inverse");
-        $on = this.$on.clone(true);
-        $off = this.$off.clone(true);
+      }
+    }, {
+      key: 'toggleInverse',
+      value: function toggleInverse() {
+        this.$wrapper.toggleClass(this._getClass('inverse'));
+        var $on = this.$on.clone(true);
+        var $off = this.$off.clone(true);
         this.$on.replaceWith($off);
         this.$off.replaceWith($on);
         this.$on = $off;
         this.$off = $on;
         this.options.inverse = !this.options.inverse;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onColor = function(value) {
-        var color;
-        color = this.options.onColor;
-        if (typeof value === "undefined") {
-          return color;
+      }
+    }, {
+      key: 'onColor',
+      value: function onColor(value) {
+        if (typeof value === 'undefined') {
+          return this.options.onColor;
         }
-        if (color != null) {
-          this.$on.removeClass(this.options.baseClass + "-" + color);
+        if (this.options.onColor) {
+          this.$on.removeClass(this._getClass(this.options.onColor));
         }
-        this.$on.addClass(this.options.baseClass + "-" + value);
+        this.$on.addClass(this._getClass(value));
         this.options.onColor = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.offColor = function(value) {
-        var color;
-        color = this.options.offColor;
-        if (typeof value === "undefined") {
-          return color;
+      }
+    }, {
+      key: 'offColor',
+      value: function offColor(value) {
+        if (typeof value === 'undefined') {
+          return this.options.offColor;
         }
-        if (color != null) {
-          this.$off.removeClass(this.options.baseClass + "-" + color);
+        if (this.options.offColor) {
+          this.$off.removeClass(this._getClass(this.options.offColor));
         }
-        this.$off.addClass(this.options.baseClass + "-" + value);
+        this.$off.addClass(this._getClass(value));
         this.options.offColor = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onText = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'onText',
+      value: function onText(value) {
+        if (typeof value === 'undefined') {
           return this.options.onText;
         }
         this.$on.html(value);
@@ -315,10 +277,11 @@
         this._containerPosition();
         this.options.onText = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.offText = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'offText',
+      value: function offText(value) {
+        if (typeof value === 'undefined') {
           return this.options.offText;
         }
         this.$off.html(value);
@@ -326,69 +289,76 @@
         this._containerPosition();
         this.options.offText = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.labelText = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'labelText',
+      value: function labelText(value) {
+        if (typeof value === 'undefined') {
           return this.options.labelText;
         }
         this.$label.html(value);
         this._width();
         this.options.labelText = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.handleWidth = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'handleWidth',
+      value: function handleWidth(value) {
+        if (typeof value === 'undefined') {
           return this.options.handleWidth;
         }
         this.options.handleWidth = value;
         this._width();
         this._containerPosition();
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.labelWidth = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'labelWidth',
+      value: function labelWidth(value) {
+        if (typeof value === 'undefined') {
           return this.options.labelWidth;
         }
         this.options.labelWidth = value;
         this._width();
         this._containerPosition();
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.baseClass = function(value) {
+      }
+    }, {
+      key: 'baseClass',
+      value: function baseClass(value) {
         return this.options.baseClass;
-      };
-
-      BootstrapSwitch.prototype.wrapperClass = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'wrapperClass',
+      value: function wrapperClass(value) {
+        if (typeof value === 'undefined') {
           return this.options.wrapperClass;
         }
         if (!value) {
           value = $.fn.bootstrapSwitch.defaults.wrapperClass;
         }
-        this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" "));
-        this.$wrapper.addClass(this._getClasses(value).join(" "));
+        this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(' '));
+        this.$wrapper.addClass(this._getClasses(value).join(' '));
         this.options.wrapperClass = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.radioAllOff = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'radioAllOff',
+      value: function radioAllOff(value) {
+        if (typeof value === 'undefined') {
           return this.options.radioAllOff;
         }
-        value = !!value;
-        if (value === this.options.radioAllOff) {
+        var val = Boolean(value);
+        if (this.options.radioAllOff === val) {
           return this.$element;
         }
-        this.options.radioAllOff = value;
+        this.options.radioAllOff = val;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onInit = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'onInit',
+      value: function onInit(value) {
+        if (typeof value === 'undefined') {
           return this.options.onInit;
         }
         if (!value) {
@@ -396,10 +366,11 @@
         }
         this.options.onInit = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onSwitchChange = function(value) {
-        if (typeof value === "undefined") {
+      }
+    }, {
+      key: 'onSwitchChange',
+      value: function onSwitchChange(value) {
+        if (typeof value === 'undefined') {
           return this.options.onSwitchChange;
         }
         if (!value) {
@@ -407,338 +378,335 @@
         }
         this.options.onSwitchChange = value;
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype.destroy = function() {
-        var $form;
-        $form = this.$element.closest("form");
+      }
+    }, {
+      key: 'destroy',
+      value: function destroy() {
+        var $form = this.$element.closest('form');
         if ($form.length) {
-          $form.off("reset.bootstrapSwitch").removeData("bootstrap-switch");
+          $form.off('reset.bootstrapSwitch').removeData('bootstrap-switch');
         }
         this.$container.children().not(this.$element).remove();
-        this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch");
+        this.$element.unwrap().unwrap().off('.bootstrapSwitch').removeData('bootstrap-switch');
         return this.$element;
-      };
-
-      BootstrapSwitch.prototype._width = function() {
-        var $handles, handleWidth;
-        $handles = this.$on.add(this.$off);
-        $handles.add(this.$label).css("width", "");
-        handleWidth = this.options.handleWidth === "auto" ? Math.max(this.$on.width(), this.$off.width()) : this.options.handleWidth;
+      }
+    }, {
+      key: '_getElementOptions',
+      value: function _getElementOptions() {
+        return {
+          state: this.$element.is(':checked'),
+          size: this.$element.data('size'),
+          animate: this.$element.data('animate'),
+          disabled: this.$element.is(':disabled'),
+          readonly: this.$element.is('[readonly]'),
+          indeterminate: this.$element.data('indeterminate'),
+          inverse: this.$element.data('inverse'),
+          radioAllOff: this.$element.data('radio-all-off'),
+          onColor: this.$element.data('on-color'),
+          offColor: this.$element.data('off-color'),
+          onText: this.$element.data('on-text'),
+          offText: this.$element.data('off-text'),
+          labelText: this.$element.data('label-text'),
+          handleWidth: this.$element.data('handle-width'),
+          labelWidth: this.$element.data('label-width'),
+          baseClass: this.$element.data('base-class'),
+          wrapperClass: this.$element.data('wrapper-class')
+        };
+      }
+    }, {
+      key: '_width',
+      value: function _width() {
+        var _this2 = this;
+
+        var $handles = this.$on.add(this.$off).add(this.$label).css('width', '');
+        var handleWidth = void 0;
+        if (this.options.handleWidth === 'auto') {
+          handleWidth = Math.round(Math.max(this.$on.width(), this.$off.width()));
+        } else {
+          handleWidth = this.options.handleWidth;
+        }
         $handles.width(handleWidth);
-        this.$label.width((function(_this) {
-          return function(index, width) {
-            if (_this.options.labelWidth !== "auto") {
-              return _this.options.labelWidth;
-            }
-            if (width < handleWidth) {
-              return handleWidth;
-            } else {
-              return width;
-            }
-          };
-        })(this));
+        this.$label.width(function (index, width) {
+          if (_this2.options.labelWidth !== 'auto') {
+            return _this2.options.labelWidth;
+          }
+          if (width < handleWidth) {
+            return handleWidth;
+          }
+          return width;
+        });
         this._handleWidth = this.$on.outerWidth();
         this._labelWidth = this.$label.outerWidth();
-        this.$container.width((this._handleWidth * 2) + this._labelWidth);
+        this.$container.width(this._handleWidth * 2 + this._labelWidth);
         return this.$wrapper.width(this._handleWidth + this._labelWidth);
-      };
-
-      BootstrapSwitch.prototype._containerPosition = function(state, callback) {
-        if (state == null) {
-          state = this.options.state;
-        }
-        this.$container.css("margin-left", (function(_this) {
-          return function() {
-            var values;
-            values = [0, "-" + _this._handleWidth + "px"];
-            if (_this.options.indeterminate) {
-              return "-" + (_this._handleWidth / 2) + "px";
+      }
+    }, {
+      key: '_containerPosition',
+      value: function _containerPosition(callback) {
+        var _this3 = this;
+
+        this.$container.css('margin-left', function () {
+          var values = [0, '-' + _this3._handleWidth + 'px'];
+          if (_this3.options.indeterminate) {
+            return '-' + _this3._handleWidth / 2 + 'px';
+          }
+          if (_this3.options.state) {
+            if (_this3.options.inverse) {
+              return values[1];
+            } else {
+              return values[0];
             }
-            if (state) {
-              if (_this.options.inverse) {
-                return values[1];
-              } else {
-                return values[0];
-              }
+          } else {
+            if (_this3.options.inverse) {
+              return values[0];
             } else {
-              if (_this.options.inverse) {
-                return values[0];
-              } else {
-                return values[1];
-              }
+              return values[1];
             }
-          };
-        })(this));
-        if (!callback) {
-          return;
+          }
+        });
+        if (callback) {
+          setTimeout(callback.bind(this), 50);
         }
-        return setTimeout(function() {
-          return callback();
-        }, 50);
-      };
-
-      BootstrapSwitch.prototype._init = function() {
-        var init, initInterval;
-        init = (function(_this) {
-          return function() {
-            _this.setPrevOptions();
-            _this._width();
-            return _this._containerPosition(null, function() {
-              if (_this.options.animate) {
-                return _this.$wrapper.addClass(_this.options.baseClass + "-animate");
-              }
-            });
-          };
-        })(this);
-        if (this.$wrapper.is(":visible")) {
+      }
+    }, {
+      key: '_init',
+      value: function _init() {
+        var _this4 = this;
+
+        var init = function init() {
+          _this4.setPrevOptions();
+          _this4._width();
+          _this4._containerPosition(null, function () {
+            if (_this4.options.animate) {
+              return _this4.$wrapper.addClass(_this4.options.baseClass + '-animate');
+            }
+          });
+        };
+        if (this.$wrapper.is(':visible')) {
           return init();
         }
-        return initInterval = window.setInterval((function(_this) {
-          return function() {
-            if (_this.$wrapper.is(":visible")) {
-              init();
-              return window.clearInterval(initInterval);
-            }
-          };
-        })(this), 50);
-      };
+        var initInterval = window.setInterval(function () {
+          if (_this4.$wrapper.is(':visible')) {
+            init();
+            return window.clearInterval(initInterval);
+          }
+        }, 50);
+      }
+    }, {
+      key: '_elementHandlers',
+      value: function _elementHandlers() {
+        var _this5 = this;
 
-      BootstrapSwitch.prototype._elementHandlers = function() {
         return this.$element.on({
-          "setPreviousOptions.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              return _this.setPrevOptions();
-            };
-          })(this),
-          "previousState.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              _this.options = _this.prevOptions;
-              if (_this.options.indeterminate) {
-                _this.$wrapper.addClass(_this.options.baseClass + "-indeterminate");
-              }
-              return _this.$element.prop("checked", _this.options.state).trigger("change.bootstrapSwitch", true);
-            };
-          })(this),
-          "change.bootstrapSwitch": (function(_this) {
-            return function(e, skip) {
-              var state;
-              e.preventDefault();
-              e.stopImmediatePropagation();
-              state = _this.$element.is(":checked");
-              _this._containerPosition(state);
-              if (state === _this.options.state) {
-                return;
-              }
-              _this.options.state = state;
-              _this.$wrapper.toggleClass(_this.options.baseClass + "-off").toggleClass(_this.options.baseClass + "-on");
-              if (!skip) {
-                if (_this.$element.is(":radio")) {
-                  $("[name='" + (_this.$element.attr('name')) + "']").not(_this.$element).prop("checked", false).trigger("change.bootstrapSwitch", true);
-                }
-                return _this.$element.trigger("switchChange.bootstrapSwitch", [state]);
-              }
-            };
-          })(this),
-          "focus.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              e.preventDefault();
-              return _this.$wrapper.addClass(_this.options.baseClass + "-focused");
-            };
-          })(this),
-          "blur.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              e.preventDefault();
-              return _this.$wrapper.removeClass(_this.options.baseClass + "-focused");
-            };
-          })(this),
-          "keydown.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              if (!e.which || _this.options.disabled || _this.options.readonly) {
-                return;
-              }
-              switch (e.which) {
-                case 37:
-                  e.preventDefault();
-                  e.stopImmediatePropagation();
-                  return _this.state(false);
-                case 39:
-                  e.preventDefault();
-                  e.stopImmediatePropagation();
-                  return _this.state(true);
+          'setPreviousOptions.bootstrapSwitch': this.setPrevOptions.bind(this),
+
+          'previousState.bootstrapSwitch': function previousStateBootstrapSwitch() {
+            this.options = this.prevOptions;
+            if (this.options.indeterminate) {
+              this.$wrapper.addClass(this.options.baseClass + '-indeterminate');
+            }
+            this.$element.prop('checked', this.options.state).trigger('change.bootstrapSwitch', true);
+          },
+
+
+          'change.bootstrapSwitch': function changeBootstrapSwitch(event, skip) {
+            event.preventDefault();
+            event.stopImmediatePropagation();
+            var state = _this5.$element.is(':checked');
+            _this5._containerPosition(state);
+            if (state === _this5.options.state) {
+              return;
+            }
+            _this5.options.state = state;
+            _this5.$wrapper.toggleClass(_this5.options.baseClass + '-off').toggleClass(_this5.options.baseClass + '-on');
+            if (!skip) {
+              if (_this5.$element.is(':radio')) {
+                $('[name="' + _this5.$element.attr('name') + '"]').not(_this5.$element).prop('checked', false).trigger('change.bootstrapSwitch', true);
               }
-            };
-          })(this)
-        });
-      };
+              return _this5.$element.trigger('switchChange.bootstrapSwitch', [state]);
+            }
+          },
 
-      BootstrapSwitch.prototype._handleHandlers = function() {
-        this.$on.on("click.bootstrapSwitch", (function(_this) {
-          return function(event) {
+          'focus.bootstrapSwitch': function focusBootstrapSwitch(event) {
+            event.preventDefault();
+            this.$wrapper.addClass(this._getClass('focused'));
+          },
+          'blur.bootstrapSwitch': function blurBootstrapSwitch(event) {
             event.preventDefault();
+            this.$wrapper.removeClass(this._getClass('focused'));
+          },
+          'keydown.bootstrapSwitch': function keydownBootstrapSwitch(event) {
+            if (!event.which || this.options.disabled || this.options.readonly) {
+              return;
+            }
+            if (event.which === 37 || event.which === 39) {
+              event.preventDefault();
+              event.stopImmediatePropagation();
+              this.state(event.which === 39);
+            }
+          }
+        });
+      }
+    }, {
+      key: '_handleHandlers',
+      value: function _handleHandlers() {
+        var _this6 = this;
+
+        this.$on.on('click.bootstrapSwitch', function (event) {
+          event.preventDefault();
+          event.stopPropagation();
+          _this6.state(false);
+          return _this6.$element.trigger('focus.bootstrapSwitch');
+        });
+        return this.$off.on('click.bootstrapSwitch', function (event) {
+          event.preventDefault();
+          event.stopPropagation();
+          _this6.state(true);
+          return _this6.$element.trigger('focus.bootstrapSwitch');
+        });
+      }
+    }, {
+      key: '_labelHandlers',
+      value: function _labelHandlers() {
+        var handlers = {
+          click: function click(event) {
             event.stopPropagation();
-            _this.state(false);
-            return _this.$element.trigger("focus.bootstrapSwitch");
-          };
-        })(this));
-        return this.$off.on("click.bootstrapSwitch", (function(_this) {
-          return function(event) {
+          },
+          'mousedown.bootstrapSwitch touchstart.bootstrapSwitch': function mousedownBootstrapSwitchTouchstartBootstrapSwitch(event) {
+            if (this._dragStart || this.options.disabled || this.options.readonly) {
+              return;
+            }
             event.preventDefault();
             event.stopPropagation();
-            _this.state(true);
-            return _this.$element.trigger("focus.bootstrapSwitch");
-          };
-        })(this));
-      };
-
-      BootstrapSwitch.prototype._labelHandlers = function() {
-        return this.$label.on({
-          "click": function(e) {
-            return e.stopPropagation();
+            this._dragStart = (event.pageX || event.originalEvent.touches[0].pageX) - parseInt(this.$container.css('margin-left'), 10);
+            if (this.options.animate) {
+              this.$wrapper.removeClass(this._getClass('animate'));
+            }
+            this.$element.trigger('focus.bootstrapSwitch');
           },
-          "mousedown.bootstrapSwitch touchstart.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              if (_this._dragStart || _this.options.disabled || _this.options.readonly) {
-                return;
-              }
-              e.preventDefault();
-              e.stopPropagation();
-              _this._dragStart = (e.pageX || e.originalEvent.touches[0].pageX) - parseInt(_this.$container.css("margin-left"), 10);
-              if (_this.options.animate) {
-                _this.$wrapper.removeClass(_this.options.baseClass + "-animate");
-              }
-              return _this.$element.trigger("focus.bootstrapSwitch");
-            };
-          })(this),
-          "mousemove.bootstrapSwitch touchmove.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              var difference;
-              if (_this._dragStart == null) {
-                return;
-              }
-              e.preventDefault();
-              difference = (e.pageX || e.originalEvent.touches[0].pageX) - _this._dragStart;
-              if (difference < -_this._handleWidth || difference > 0) {
-                return;
-              }
-              _this._dragEnd = difference;
-              return _this.$container.css("margin-left", _this._dragEnd + "px");
-            };
-          })(this),
-          "mouseup.bootstrapSwitch touchend.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              var state;
-              if (!_this._dragStart) {
-                return;
-              }
-              e.preventDefault();
-              if (_this.options.animate) {
-                _this.$wrapper.addClass(_this.options.baseClass + "-animate");
-              }
-              if (_this._dragEnd) {
-                state = _this._dragEnd > -(_this._handleWidth / 2);
-                _this._dragEnd = false;
-                _this.state(_this.options.inverse ? !state : state);
-              } else {
-                _this.state(!_this.options.state);
-              }
-              return _this._dragStart = false;
-            };
-          })(this),
-          "mouseleave.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              return _this.$label.trigger("mouseup.bootstrapSwitch");
-            };
-          })(this)
-        });
-      };
-
-      BootstrapSwitch.prototype._externalLabelHandler = function() {
-        var $externalLabel;
-        $externalLabel = this.$element.closest("label");
-        return $externalLabel.on("click", (function(_this) {
-          return function(event) {
+          'mousemove.bootstrapSwitch touchmove.bootstrapSwitch': function mousemoveBootstrapSwitchTouchmoveBootstrapSwitch(event) {
+            if (this._dragStart == null) {
+              return;
+            }
+            var difference = (event.pageX || event.originalEvent.touches[0].pageX) - this._dragStart;
             event.preventDefault();
-            event.stopImmediatePropagation();
-            if (event.target === $externalLabel[0]) {
-              return _this.toggleState();
+            if (difference < -this._handleWidth || difference > 0) {
+              return;
             }
-          };
-        })(this));
-      };
-
-      BootstrapSwitch.prototype._formHandler = function() {
-        var $form;
-        $form = this.$element.closest("form");
-        if ($form.data("bootstrap-switch")) {
+            this._dragEnd = difference;
+            this.$container.css('margin-left', this._dragEnd + 'px');
+          },
+          'mouseup.bootstrapSwitch touchend.bootstrapSwitch': function mouseupBootstrapSwitchTouchendBootstrapSwitch(event) {
+            if (!this._dragStart) {
+              return;
+            }
+            event.preventDefault();
+            if (this.options.animate) {
+              this.$wrapper.addClass(this._getClass('animate'));
+            }
+            if (this._dragEnd) {
+              var state = this._dragEnd > -(this._handleWidth / 2);
+              this._dragEnd = false;
+              this.state(this.options.inverse ? !state : state);
+            } else {
+              this.state(!this.options.state);
+            }
+            this._dragStart = false;
+          },
+          'mouseleave.bootstrapSwitch': function mouseleaveBootstrapSwitch() {
+            this.$label.trigger('mouseup.bootstrapSwitch');
+          }
+        };
+        this.$label.on(handlers);
+      }
+    }, {
+      key: '_externalLabelHandler',
+      value: function _externalLabelHandler() {
+        var _this7 = this;
+
+        var $externalLabel = this.$element.closest('label');
+        $externalLabel.on('click', function (event) {
+          event.preventDefault();
+          event.stopImmediatePropagation();
+          if (event.target === $externalLabel[0]) {
+            _this7.toggleState();
+          }
+        });
+      }
+    }, {
+      key: '_formHandler',
+      value: function _formHandler() {
+        var $form = this.$element.closest('form');
+        if ($form.data('bootstrap-switch')) {
           return;
         }
-        return $form.on("reset.bootstrapSwitch", function() {
-          return window.setTimeout(function() {
-            return $form.find("input").filter(function() {
-              return $(this).data("bootstrap-switch");
-            }).each(function() {
-              return $(this).bootstrapSwitch("state", this.checked);
+        $form.on('reset.bootstrapSwitch', function () {
+          window.setTimeout(function () {
+            $form.find('input').filter(function () {
+              return $(this).data('bootstrap-switch');
+            }).each(function () {
+              return $(this).bootstrapSwitch('state', this.checked);
             });
           }, 1);
-        }).data("bootstrap-switch", true);
-      };
-
-      BootstrapSwitch.prototype._getClasses = function(classes) {
-        var c, cls, i, len;
+        }).data('bootstrap-switch', true);
+      }
+    }, {
+      key: '_getClass',
+      value: function _getClass(name) {
+        return this.options.baseClass + '-' + name;
+      }
+    }, {
+      key: '_getClasses',
+      value: function _getClasses(classes) {
         if (!$.isArray(classes)) {
-          return [this.options.baseClass + "-" + classes];
-        }
-        cls = [];
-        for (i = 0, len = classes.length; i < len; i++) {
-          c = classes[i];
-          cls.push(this.options.baseClass + "-" + c);
-        }
-        return cls;
-      };
-
-      return BootstrapSwitch;
-
-    })();
-    $.fn.bootstrapSwitch = function() {
-      var args, option, ret;
-      option = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
-      ret = this;
-      this.each(function() {
-        var $this, data;
-        $this = $(this);
-        data = $this.data("bootstrap-switch");
-        if (!data) {
-          $this.data("bootstrap-switch", data = new BootstrapSwitch(this, option));
-        }
-        if (typeof option === "string") {
-          return ret = data[option].apply(data, args);
+          return [this._getClass(classes)];
         }
-      });
-      return ret;
-    };
-    $.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
-    return $.fn.bootstrapSwitch.defaults = {
-      state: true,
-      size: null,
-      animate: true,
-      disabled: false,
-      readonly: false,
-      indeterminate: false,
-      inverse: false,
-      radioAllOff: false,
-      onColor: "primary",
-      offColor: "default",
-      onText: "ON",
-      offText: "OFF",
-      labelText: "&nbsp;",
-      handleWidth: "auto",
-      labelWidth: "auto",
-      baseClass: "bootstrap-switch",
-      wrapperClass: "wrapper",
-      onInit: function() {},
-      onSwitchChange: function() {}
-    };
-  })(window.jQuery, window);
-
-}).call(this);
+        return classes.map(this._getClass.bind(this));
+      }
+    }]);
+
+    return BootstrapSwitch;
+  }();
+
+  $.fn.bootstrapSwitch = function (option) {
+    for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+      args[_key - 1] = arguments[_key];
+    }
+
+    var ret = this;
+    this.each(function () {
+      var $this = $(this);
+      var data = $this.data('bootstrap-switch');
+      if (!data) {
+        data = new BootstrapSwitch(this, option);
+        $this.data('bootstrap-switch', data);
+      }
+      if (typeof option === 'string') {
+        ret = data[option].apply(data, args);
+      }
+    });
+    return ret;
+  };
+  $.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
+  $.fn.bootstrapSwitch.defaults = {
+    state: true,
+    size: null,
+    animate: true,
+    disabled: false,
+    readonly: false,
+    indeterminate: false,
+    inverse: false,
+    radioAllOff: false,
+    onColor: 'primary',
+    offColor: 'default',
+    onText: 'ON',
+    offText: 'OFF',
+    labelText: '&nbsp',
+    handleWidth: 'auto',
+    labelWidth: 'auto',
+    baseClass: 'bootstrap-switch',
+    wrapperClass: 'wrapper',
+    onInit: function onInit() {},
+    onSwitchChange: function onSwitchChange() {}
+  };
+})(window.jQuery, window);

File diff suppressed because it is too large
+ 0 - 21
dist/js/bootstrap-switch.min.js


+ 23 - 39
gulpfile.coffee

@@ -80,54 +80,38 @@ banner = """
 
 
 # build
-gulp.task 'coffee', ->
+gulp.task 'js', ->
   gulp
-  .src src.scripts
-  .pipe $.plumber errorHandler: $.notify.onError "Error: <%= error.message %>"
-  .pipe $.changed dest.scripts
-  .pipe $.coffeelint 'coffeelint.json'
-  .pipe $.coffeelint.reporter()
-  .pipe $.coffeelint.reporter("fail")
-  .pipe $.coffee()
-    .on 'error', $.util.log
+  # .src src.scripts
+  # .pipe $.plumber errorHandler: $.notify.onError "Error: <%= error.message %>"
+  # .pipe $.changed dest.scripts
+  # .pipe $.coffeelint 'coffeelint.json'
+  # .pipe $.coffeelint.reporter()
+  # .pipe $.coffeelint.reporter("fail")
+  # .pipe $.coffee().on 'error', $.util.log
   .pipe $.header banner, pkg: pkg
-  .pipe gulp.dest dest.scripts
-  .pipe gulp.dest dest.test
-  .pipe $.uglify()
+  # .pipe gulp.dest dest.scripts
+  # .pipe gulp.dest dest.test
+  # .pipe $.uglify()
   .pipe $.header banner, pkg: pkg
-  .pipe $.rename suffix: '.min'
-  .pipe gulp.dest dest.scripts
+  # .pipe $.rename suffix: '.min'
+  # .pipe gulp.dest dest.scripts
 
 gulp.task 'less-bootstrap2', ->
   gulp
-  .src src.stylesheets.bootstrap2
-  .pipe $.plumber errorHandler: $.notify.onError "Error: <%= error.message %>"
-  .pipe $.changed dest.stylesheets.bootstrap2
-  .pipe $.less()
-    .on 'error', $.util.log
-  .pipe $.header banner, pkg: pkg
-  .pipe $.rename basename: name
-  .pipe gulp.dest dest.stylesheets.bootstrap2
-  .pipe $.less plugins: [cleanCss]
-  .pipe $.header banner, pkg: pkg
-  .pipe $.rename suffix: '.min'
-  .pipe gulp.dest dest.stylesheets.bootstrap2
-
-gulp.task 'less-bootstrap3', ->
-  gulp
-  .src src.stylesheets.bootstrap3
-  .pipe $.plumber errorHandler: $.notify.onError "Error: <%= error.message %>"
-  .pipe $.changed dest.stylesheets.bootstrap3
-  .pipe $.less()
+  # .src src.stylesheets.bootstrap2
+  # .pipe $.plumber errorHandler: $.notify.onError "Error: <%= error.message %>"
+  # .pipe $.changed dest.stylesheets.bootstrap2
+  # .pipe $.less()
+    # .on 'error', $.util.log
   .pipe $.header banner, pkg: pkg
-  .pipe $.rename basename: name
-  .pipe gulp.dest dest.stylesheets.bootstrap3
-  .pipe $.less plugins: [cleanCss]
+  # .pipe $.rename basename: name
+  # .pipe gulp.dest dest.stylesheets.bootstrap2
+  # .pipe $.less plugins: [cleanCss]
   .pipe $.header banner, pkg: pkg
-  .pipe $.rename suffix: '.min'
-  .pipe gulp.dest dest.stylesheets.bootstrap3
+  # .pipe $.rename suffix: '.min'
+  # .pipe gulp.dest dest.stylesheets.bootstrap2
 
-# docs
 vendorTask = (name) ->
   return ->
     gulp

+ 17 - 0
karma.js

@@ -0,0 +1,17 @@
+module.exports = function (config) {
+  config.set({
+    autoWatch: true,
+    singleRun: false,
+    frameworks: ['jasmine'],
+    files: [
+      'node_modules/jquery/dist/jquery.js',
+      'node_modules/bootstrap/dist/js/bootstrap.js',
+      'test/bootstrap-switch.js',
+      'test/bootstrap-switch.tests.js'
+    ],
+    colors: true,
+    browsers: ['PhantomJS'],
+    reporters: ['progress'],
+    plugins: ['karma-jasmine', 'karma-phantomjs-launcher']
+  })
+}

+ 0 - 19
karma.json

@@ -1,19 +0,0 @@
-{
-  "frameworks": ["jasmine"],
-  "files": [
-    "components/jquery/dist/jquery.js",
-    "components/bootstrap/dist/js/bootstrap.js",
-    "test/bootstrap-switch.js",
-    "test/bootstrap-switch.tests.js"
-  ],
-  "reporters": ["progress"],
-  "port": 9876,
-  "colors": true,
-  "autoWatch": true,
-  "browsers": ["Firefox"],
-  "singleRun": false,
-  "plugins": [
-    "karma-jasmine",
-    "karma-firefox-launcher"
-  ]
-}

+ 48 - 46
package.json

@@ -14,20 +14,18 @@
     "email": "[email protected]",
     "url": "http://larentis.eu"
   },
-  "contributors": [
-    {
-      "name": "Emanuele Marchi",
-      "email": "[email protected]",
-      "url": "http://lostcrew.it"
-    },
-    {
-      "name": "Peter Stein",
-      "url": "http://www.bdmdesign.org"
-    }
-  ],
+  "contributors": [{
+    "name": "Emanuele Marchi",
+    "email": "[email protected]",
+    "url": "http://lostcrew.it"
+  }, {
+    "name": "Peter Stein",
+    "url": "http://www.bdmdesign.org"
+  }],
   "main": "dist/js/bootstrap-switch.js",
   "peerDependencies": {
-    "jquery": ">=1.9.0"
+    "bootstrap": "^3.1.1",
+    "jquery": "^1.9.0"
   },
   "repository": {
     "type": "git",
@@ -37,43 +35,47 @@
   "license": "Apache Version 2",
   "readmeFilename": "README.md",
   "devDependencies": {
-    "browser-sync": "^2.6.4",
-    "coffee-script": "~1.9.2",
-    "gulp": "^3.8.11",
-    "gulp-changed": "^1.2.1",
-    "gulp-coffee": "~2.3.1",
-    "gulp-coffeelint": "~0.4.0",
-    "gulp-connect": "^2.2.0",
-    "gulp-header": "~1.2.2",
-    "gulp-jade": "^1.0.0",
-    "gulp-less": "^3.0.2",
-    "gulp-load-plugins": "^0.10.0",
-    "gulp-notify": "^2.2.0",
-    "gulp-open": "~0.3.2",
-    "gulp-plumber": "^1.0.0",
-    "gulp-rename": "~1.2.2",
-    "gulp-uglify": "~1.2.0",
-    "gulp-util": "~3.0.4",
-    "jasmine-core": "^2.2.0",
-    "karma": "~0.12.31",
-    "karma-firefox-launcher": "~0.1.4",
-    "karma-jasmine": "^0.3.5",
+    "babel-cli": "^6.22.2",
+    "babel-preset-babili": "^0.0.10",
+    "babel-preset-env": "^1.1.8",
+    "jasmine": "^2.5.3",
+    "jasmine-core": "^2.5.2",
+    "jquery": "^3.1.1",
+    "karma": "^1.4.1",
+    "karma-cli": "^1.0.1",
+    "karma-jasmine": "^1.1.0",
+    "karma-phantomjs-launcher": "^1.0.2",
+    "less": "^2.7.2",
     "less-plugin-clean-css": "^1.5.0",
-    "run-sequence": "~1.0.2"
+    "npm-run-all": "^4.0.1",
+    "standard": "^8.6.0"
   },
   "scripts": {
-    "build": "gulp dist",
-    "test": "gulp test"
+    "js:dir": "mkdir -p dist/js",
+    "js:lint": "standard src/js/**/*.js",
+    "js:test": "mkdir -p test && babel --out-file test/bootstrap-switch.test.js src/js/bootstrap-switch.test.js && karma start karma.js",
+    "js:base": "babel --out-file dist/js/bootstrap-switch.js src/js/bootstrap-switch.js",
+    "js:min": "NODE_ENV=production babel --out-file dist/js/bootstrap-switch.min.js src/js/bootstrap-switch.js",
+    "js": "npm-run-all js:dir js:lint -p js:base js:min -s js:test",
+    "css:dir": "mkdir -p dist/css",
+    "css:bs2:base": "lessc src/less/bootstrap2/build.less dist/css/bootstrap2/bootstrap-switch.css",
+    "css:bs2:min": "lessc --clean-css='--advanced' src/less/bootstrap2/build.less dist/css/bootstrap2/bootstrap-switch.min.css",
+    "css:bs3:base": "lessc src/less/bootstrap3/build.less dist/css/bootstrap3/bootstrap-switch.css",
+    "css:bs3:min": "lessc --clean-css='--advanced' src/less/bootstrap3/build.less dist/css/bootstrap3/bootstrap-switch.min.css",
+    "css": "run-p css:bs2:* css:bs3:*",
+    "clean": "rm -rf dist",
+    "build": "run-p js css",
+    "docs": "",
+    "start": "run-s clean build docs"
   },
   "npmName": "bootstrap-switch",
-  "npmFileMap": [
-    {
-      "basePath": "/dist/",
-      "files": [
-        "*.js",
-        "css/bootstrap3/*.css",
-        "css/bootstrap2/*.css"
-      ]
-    }
-  ]
+  "npmFileMap": [{
+    "basePath": "/dist/",
+    "files": [
+      "*.js",
+      "css/bootstrap3/*.css",
+      "css/bootstrap2/*.css"
+    ]
+  }],
+  "dependencies": {}
 }

+ 617 - 0
src/js/bootstrap-switch.js

@@ -0,0 +1,617 @@
+(function ($, window) {
+  class BootstrapSwitch {
+    constructor (element, options = {}) {
+      this.$element = $(element)
+      this.options = Object.asign(
+        {},
+        $.fn.bootstrapSwitch.defaults,
+        this._getElementOptions(),
+        options
+      )
+      this.prevOptions = {}
+
+      this.$wrapper = $('<div>', {
+        class () {
+          const classes = []
+          classes.push(this.options.state ? 'on' : 'off')
+          if (this.options.size) {
+            classes.push(this.options.size)
+          }
+          if (this.options.disabled) {
+            classes.push('disabled')
+          }
+          if (this.options.readonly) {
+            classes.push('readonly')
+          }
+          if (this.options.indeterminate) {
+            classes.push('indeterminate')
+          }
+          if (this.options.inverse) {
+            classes.push('inverse')
+          }
+          if (this.$element.attr('id')) {
+            classes.push(`id-${this.$element.attr('id')}`)
+          }
+          return classes
+            .map(this._getClass.bind(this))
+            .concat([this.options.baseClass], this._getClasses(this.options.wrapperClass))
+            .join(' ')
+        }
+      })
+      this.$container = $('<div>', { class: this._getClass('container') })
+      this.$on = $('<span>', {
+        html: this.options.onText,
+        class: `${this._getClass('handle-on')} ${this._getClass(this.options.onColor)}`
+      })
+      this.$off = $('<span>', {
+        html: this.options.offText,
+        class: `${this._getClass('handle-off')} ${this._getClass(this.options.offColor)}`
+      })
+      this.$label = $('<span>', {
+        html: this.options.labelText,
+        class: this._getClass('label')
+      })
+
+      this.$element.on('init.bootstrapSwitch', this.options.onInit.bind(this, element))
+      this.$element.on('switchChange.bootstrapSwitch', event => {
+        if (this.options.onSwitchChange.apply(element, arguments) === false) {
+          if (this.$element.is(':radio')) {
+            $(`[name="${this.$element.attr('name')}"]`).trigger('previousState.bootstrapSwitch', true)
+          } else {
+            this.$element.trigger('previousState.bootstrapSwitch', true)
+          }
+        }
+      })
+
+      this.$container = this.$element.wrap(this.$container).parent()
+      this.$wrapper = this.$container.wrap(this.$wrapper).parent()
+      this.$element
+        .before(this.options.inverse ? this.$off : this.$on)
+        .before(this.$label)
+        .before(this.options.inverse ? this.$on : this.$off)
+
+      if (this.options.indeterminate) {
+        this.$element.prop('indeterminate', true)
+      }
+
+      this._init()
+      this._elementHandlers()
+      this._handleHandlers()
+      this._labelHandlers()
+      this._formHandler()
+      this._externalLabelHandler()
+      this.$element.trigger('init.bootstrapSwitch', this.options.state)
+    }
+
+    setPrevOptions () {
+      this.prevOptions = Object.assign({}, this.options)
+    }
+
+    state (value, skip) {
+      if (typeof value === 'undefined') { return this.options.state }
+      if (
+        (this.options.disabled || this.options.readonly) ||
+        (this.options.state && !this.options.radioAllOff && this.$element.is(':radio'))
+      ) { return this.$element }
+      if (this.$element.is(':radio')) {
+        $(`[name="${this.$element.attr('name')}"]`).trigger('setPreviousOptions.bootstrapSwitch')
+      } else {
+        this.$element.trigger('setPreviousOptions.bootstrapSwitch')
+      }
+      if (this.options.indeterminate) {
+        this.indeterminate(false)
+      }
+      this.$element
+        .prop('checked', Boolean(value))
+        .trigger('change.bootstrapSwitch', skip)
+      return this.$element
+    }
+
+    toggleState (skip) {
+      if (this.options.disabled || this.options.readonly) { return this.$element }
+      if (this.options.indeterminate) {
+        this.indeterminate(false)
+        return this.state(true)
+      } else {
+        return this.$element.prop('checked', !this.options.state).trigger('change.bootstrapSwitch', skip)
+      }
+    }
+
+    size (value) {
+      if (typeof value === 'undefined') { return this.options.size }
+      if (this.options.size != null) {
+        this.$wrapper.removeClass(this._getClass(this.options.size))
+      }
+      if (value) {
+        this.$wrapper.addClass(this._getClass(value))
+      }
+      this._width()
+      this._containerPosition()
+      this.options.size = value
+      return this.$element
+    }
+
+    animate (value) {
+      if (typeof value === 'undefined') { return this.options.animate }
+      if (this.options.animate === Boolean(value)) { return this.$element }
+      return this.toggleAnimate()
+    }
+
+    toggleAnimate () {
+      this.options.animate = !this.options.animate
+      this.$wrapper.toggleClass(this._getClass('animate'))
+      return this.$element
+    }
+
+    disabled (value) {
+      if (typeof value === 'undefined') { return this.options.disabled }
+      if (this.options.disabled === Boolean(value)) { return this.$element }
+      return this.toggleDisabled()
+    }
+
+    toggleDisabled () {
+      this.options.disabled = !this.options.disabled
+      this.$element.prop('disabled', this.options.disabled)
+      this.$wrapper.toggleClass(this._getClass('disabled'))
+      return this.$element
+    }
+
+    readonly (value) {
+      if (typeof value === 'undefined') { return this.options.readonly }
+      if (this.options.readonly === Boolean(value)) { return this.$element }
+      return this.toggleReadonly()
+    }
+
+    toggleReadonly () {
+      this.options.readonly = !this.options.readonly
+      this.$element.prop('readonly', this.options.readonly)
+      this.$wrapper.toggleClass(this._getClass('readonly'))
+      return this.$element
+    }
+
+    indeterminate (value) {
+      if (typeof value === 'undefined') { return this.options.indeterminate }
+      if (this.options.indeterminate === Boolean(value)) { return this.$element }
+      return this.toggleIndeterminate()
+    }
+
+    toggleIndeterminate () {
+      this.options.indeterminate = !this.options.indeterminate
+      this.$element.prop('indeterminate', this.options.indeterminate)
+      this.$wrapper.toggleClass(this._getClass('indeterminate'))
+      this._containerPosition()
+      return this.$element
+    }
+
+    inverse (value) {
+      if (typeof value === 'undefined') { return this.options.inverse }
+      if (this.options.inverse === Boolean(value)) { return this.$element }
+      return this.toggleInverse()
+    }
+
+    toggleInverse () {
+      this.$wrapper.toggleClass(this._getClass('inverse'))
+      const $on = this.$on.clone(true)
+      const $off = this.$off.clone(true)
+      this.$on.replaceWith($off)
+      this.$off.replaceWith($on)
+      this.$on = $off
+      this.$off = $on
+      this.options.inverse = !this.options.inverse
+      return this.$element
+    }
+
+    onColor (value) {
+      if (typeof value === 'undefined') { return this.options.onColor }
+      if (this.options.onColor) {
+        this.$on.removeClass(this._getClass(this.options.onColor))
+      }
+      this.$on.addClass(this._getClass(value))
+      this.options.onColor = value
+      return this.$element
+    }
+
+    offColor (value) {
+      if (typeof value === 'undefined') { return this.options.offColor }
+      if (this.options.offColor) {
+        this.$off.removeClass(this._getClass(this.options.offColor))
+      }
+      this.$off.addClass(this._getClass(value))
+      this.options.offColor = value
+      return this.$element
+    }
+
+    onText (value) {
+      if (typeof value === 'undefined') { return this.options.onText }
+      this.$on.html(value)
+      this._width()
+      this._containerPosition()
+      this.options.onText = value
+      return this.$element
+    }
+
+    offText (value) {
+      if (typeof value === 'undefined') { return this.options.offText }
+      this.$off.html(value)
+      this._width()
+      this._containerPosition()
+      this.options.offText = value
+      return this.$element
+    }
+
+    labelText (value) {
+      if (typeof value === 'undefined') { return this.options.labelText }
+      this.$label.html(value)
+      this._width()
+      this.options.labelText = value
+      return this.$element
+    }
+
+    handleWidth (value) {
+      if (typeof value === 'undefined') { return this.options.handleWidth }
+      this.options.handleWidth = value
+      this._width()
+      this._containerPosition()
+      return this.$element
+    }
+
+    labelWidth (value) {
+      if (typeof value === 'undefined') { return this.options.labelWidth }
+      this.options.labelWidth = value
+      this._width()
+      this._containerPosition()
+      return this.$element
+    }
+
+    baseClass (value) {
+      return this.options.baseClass
+    }
+
+    wrapperClass (value) {
+      if (typeof value === 'undefined') { return this.options.wrapperClass }
+      if (!value) {
+        value = $.fn.bootstrapSwitch.defaults.wrapperClass
+      }
+      this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(' '))
+      this.$wrapper.addClass(this._getClasses(value).join(' '))
+      this.options.wrapperClass = value
+      return this.$element
+    }
+
+    radioAllOff (value) {
+      if (typeof value === 'undefined') { return this.options.radioAllOff }
+      const val = Boolean(value)
+      if (this.options.radioAllOff === val) { return this.$element }
+      this.options.radioAllOff = val
+      return this.$element
+    }
+
+    onInit (value) {
+      if (typeof value === 'undefined') { return this.options.onInit }
+      if (!value) {
+        value = $.fn.bootstrapSwitch.defaults.onInit
+      }
+      this.options.onInit = value
+      return this.$element
+    }
+
+    onSwitchChange (value) {
+      if (typeof value === 'undefined') {
+        return this.options.onSwitchChange
+      }
+      if (!value) {
+        value = $.fn.bootstrapSwitch.defaults.onSwitchChange
+      }
+      this.options.onSwitchChange = value
+      return this.$element
+    }
+
+    destroy () {
+      const $form = this.$element.closest('form')
+      if ($form.length) {
+        $form.off('reset.bootstrapSwitch').removeData('bootstrap-switch')
+      }
+      this.$container
+        .children()
+        .not(this.$element)
+        .remove()
+      this.$element
+        .unwrap()
+        .unwrap()
+        .off('.bootstrapSwitch')
+        .removeData('bootstrap-switch')
+      return this.$element
+    }
+
+    _getElementOptions () {
+      return {
+        state: this.$element.is(':checked'),
+        size: this.$element.data('size'),
+        animate: this.$element.data('animate'),
+        disabled: this.$element.is(':disabled'),
+        readonly: this.$element.is('[readonly]'),
+        indeterminate: this.$element.data('indeterminate'),
+        inverse: this.$element.data('inverse'),
+        radioAllOff: this.$element.data('radio-all-off'),
+        onColor: this.$element.data('on-color'),
+        offColor: this.$element.data('off-color'),
+        onText: this.$element.data('on-text'),
+        offText: this.$element.data('off-text'),
+        labelText: this.$element.data('label-text'),
+        handleWidth: this.$element.data('handle-width'),
+        labelWidth: this.$element.data('label-width'),
+        baseClass: this.$element.data('base-class'),
+        wrapperClass: this.$element.data('wrapper-class')
+      }
+    }
+
+    _width () {
+      const $handles = this.$on
+        .add(this.$off)
+        .add(this.$label)
+        .css('width', '')
+      let handleWidth
+      if (this.options.handleWidth === 'auto') {
+        handleWidth = Math.round(Math.max(this.$on.width(), this.$off.width()))
+      } else {
+        handleWidth = this.options.handleWidth
+      }
+      $handles.width(handleWidth)
+      this.$label.width((index, width) => {
+        if (this.options.labelWidth !== 'auto') { return this.options.labelWidth }
+        if (width < handleWidth) { return handleWidth }
+        return width
+      })
+      this._handleWidth = this.$on.outerWidth()
+      this._labelWidth = this.$label.outerWidth()
+      this.$container.width((this._handleWidth * 2) + this._labelWidth)
+      return this.$wrapper.width(this._handleWidth + this._labelWidth)
+    }
+
+    _containerPosition (callback) {
+      this.$container.css('margin-left', () => {
+        const values = [0, `-${this._handleWidth}px`]
+        if (this.options.indeterminate) {
+          return `-${this._handleWidth / 2}px`
+        }
+        if (this.options.state) {
+          if (this.options.inverse) {
+            return values[1]
+          } else {
+            return values[0]
+          }
+        } else {
+          if (this.options.inverse) {
+            return values[0]
+          } else {
+            return values[1]
+          }
+        }
+      })
+      if (callback) {
+        setTimeout(callback.bind(this), 50)
+      }
+    }
+
+    _init () {
+      const init = () => {
+        this.setPrevOptions()
+        this._width()
+        this._containerPosition(null, () => {
+          if (this.options.animate) {
+            return this.$wrapper.addClass(`${this.options.baseClass}-animate`)
+          }
+        })
+      }
+      if (this.$wrapper.is(':visible')) {
+        return init()
+      }
+      const initInterval = window.setInterval(() => {
+        if (this.$wrapper.is(':visible')) {
+          init()
+          return window.clearInterval(initInterval)
+        }
+      }, 50)
+    }
+
+    _elementHandlers () {
+      return this.$element.on({
+        'setPreviousOptions.bootstrapSwitch': this.setPrevOptions.bind(this),
+
+        'previousState.bootstrapSwitch' () {
+          this.options = this.prevOptions
+          if (this.options.indeterminate) {
+            this.$wrapper.addClass(`${this.options.baseClass}-indeterminate`)
+          }
+          this.$element
+            .prop('checked', this.options.state)
+            .trigger('change.bootstrapSwitch', true)
+        },
+
+        'change.bootstrapSwitch': (event, skip) => {
+          event.preventDefault()
+          event.stopImmediatePropagation()
+          const state = this.$element.is(':checked')
+          this._containerPosition(state)
+          if (state === this.options.state) {
+            return
+          }
+          this.options.state = state
+          this.$wrapper
+            .toggleClass(`${this.options.baseClass}-off`)
+            .toggleClass(`${this.options.baseClass}-on`)
+          if (!skip) {
+            if (this.$element.is(':radio')) {
+              $(`[name="${this.$element.attr('name')}"]`)
+                .not(this.$element)
+                .prop('checked', false)
+                .trigger('change.bootstrapSwitch', true)
+            }
+            return this.$element.trigger('switchChange.bootstrapSwitch', [state])
+          }
+        },
+
+        'focus.bootstrapSwitch' (event) {
+          event.preventDefault()
+          this.$wrapper.addClass(this._getClass('focused'))
+        },
+
+        'blur.bootstrapSwitch' (event) {
+          event.preventDefault()
+          this.$wrapper.removeClass(this._getClass('focused'))
+        },
+
+        'keydown.bootstrapSwitch' (event) {
+          if (!event.which || this.options.disabled || this.options.readonly) {
+            return
+          }
+          if (event.which === 37 || event.which === 39) {
+            event.preventDefault()
+            event.stopImmediatePropagation()
+            this.state(event.which === 39)
+          }
+        }
+      })
+    }
+
+    _handleHandlers () {
+      this.$on.on('click.bootstrapSwitch', event => {
+        event.preventDefault()
+        event.stopPropagation()
+        this.state(false)
+        return this.$element.trigger('focus.bootstrapSwitch')
+      })
+      return this.$off.on('click.bootstrapSwitch', event => {
+        event.preventDefault()
+        event.stopPropagation()
+        this.state(true)
+        return this.$element.trigger('focus.bootstrapSwitch')
+      })
+    }
+
+    _labelHandlers () {
+      const handlers = {
+        click (event) { event.stopPropagation() },
+
+        'mousedown.bootstrapSwitch touchstart.bootstrapSwitch' (event) {
+          if (this._dragStart || this.options.disabled || this.options.readonly) {
+            return
+          }
+          event.preventDefault()
+          event.stopPropagation()
+          this._dragStart = (event.pageX || event.originalEvent.touches[0].pageX) - parseInt(this.$container.css('margin-left'), 10)
+          if (this.options.animate) {
+            this.$wrapper.removeClass(this._getClass('animate'))
+          }
+          this.$element.trigger('focus.bootstrapSwitch')
+        },
+
+        'mousemove.bootstrapSwitch touchmove.bootstrapSwitch' (event) {
+          if (this._dragStart == null) { return }
+          const difference = (event.pageX || event.originalEvent.touches[0].pageX) - this._dragStart
+          event.preventDefault()
+          if (difference < -this._handleWidth || difference > 0) { return }
+          this._dragEnd = difference
+          this.$container.css('margin-left', `${this._dragEnd}px`)
+        },
+
+        'mouseup.bootstrapSwitch touchend.bootstrapSwitch' (event) {
+          if (!this._dragStart) { return }
+          event.preventDefault()
+          if (this.options.animate) {
+            this.$wrapper.addClass(this._getClass('animate'))
+          }
+          if (this._dragEnd) {
+            const state = this._dragEnd > -(this._handleWidth / 2)
+            this._dragEnd = false
+            this.state(this.options.inverse ? !state : state)
+          } else {
+            this.state(!this.options.state)
+          }
+          this._dragStart = false
+        },
+
+        'mouseleave.bootstrapSwitch' () {
+          this.$label.trigger('mouseup.bootstrapSwitch')
+        }
+      }
+      this.$label.on(handlers)
+    }
+
+    _externalLabelHandler () {
+      const $externalLabel = this.$element.closest('label')
+      $externalLabel.on('click', event => {
+        event.preventDefault()
+        event.stopImmediatePropagation()
+        if (event.target === $externalLabel[0]) {
+          this.toggleState()
+        }
+      })
+    }
+
+    _formHandler () {
+      const $form = this.$element.closest('form')
+      if ($form.data('bootstrap-switch')) {
+        return
+      }
+      $form
+        .on('reset.bootstrapSwitch', () => {
+          window.setTimeout(() => {
+            $form.find('input')
+              .filter(function () { return $(this).data('bootstrap-switch') })
+              .each(function () { return $(this).bootstrapSwitch('state', this.checked) })
+          }, 1)
+        })
+        .data('bootstrap-switch', true)
+    }
+
+    _getClass (name) {
+      return `${this.options.baseClass}-${name}`
+    }
+
+    _getClasses (classes) {
+      if (!$.isArray(classes)) {
+        return [this._getClass(classes)]
+      }
+      return classes.map(this._getClass.bind(this))
+    }
+  }
+
+  $.fn.bootstrapSwitch = function (option, ...args) {
+    let ret = this
+    this.each(function () {
+      const $this = $(this)
+      let data = $this.data('bootstrap-switch')
+      if (!data) {
+        data = new BootstrapSwitch(this, option)
+        $this.data('bootstrap-switch', data)
+      }
+      if (typeof option === 'string') {
+        ret = data[option].apply(data, args)
+      }
+    })
+    return ret
+  }
+  $.fn.bootstrapSwitch.Constructor = BootstrapSwitch
+  $.fn.bootstrapSwitch.defaults = {
+    state: true,
+    size: null,
+    animate: true,
+    disabled: false,
+    readonly: false,
+    indeterminate: false,
+    inverse: false,
+    radioAllOff: false,
+    onColor: 'primary',
+    offColor: 'default',
+    onText: 'ON',
+    offText: 'OFF',
+    labelText: '&nbsp',
+    handleWidth: 'auto',
+    labelWidth: 'auto',
+    baseClass: 'bootstrap-switch',
+    wrapperClass: 'wrapper',
+    onInit () {},
+    onSwitchChange () {}
+  }
+})(window.jQuery, window)

+ 130 - 0
src/js/bootstrap-switch.test.js

@@ -0,0 +1,130 @@
+const $ = window.jQuery
+const { describe, beforeEach, afterEach, it, expect } = window
+
+describe('Bootstrap Switch:', function () {
+  beforeEach(function () {
+    $.support.transition = false
+    $.fx.off = true
+  })
+  afterEach(function () {
+    return $('.' + $.fn.bootstrapSwitch.defaults.baseClass).bootstrapSwitch('destroy')
+  })
+
+  function createCheckbox () {
+    return $('<input>', {
+      type: 'checkbox',
+      'class': 'switch'
+    }).appendTo('body')
+  }
+
+  function createRadio () {
+    return $('<input>', {
+      type: 'radio',
+      name: 'name',
+      'class': 'switch'
+    }).appendTo('body')
+  }
+
+  function getOptions ($element) {
+    return $element.data('bootstrap-switch').options
+  }
+
+  it('should set the default options as element options, except state', function () {
+    var $switch
+    $switch = createCheckbox().prop('checked', true).bootstrapSwitch()
+    expect(getOptions($switch)).toEqual($.fn.bootstrapSwitch.defaults)
+  })
+
+  it('should override default options with initialization ones', function () {
+    var $switch, $switch2
+    $switch = createCheckbox().prop('checked', false).bootstrapSwitch()
+    $switch2 = createCheckbox().bootstrapSwitch({
+      state: false
+    })
+    expect(getOptions($switch).state).toBe(false)
+    expect(getOptions($switch2).state).toBe(false)
+  })
+
+  it('should something', function () {
+    var $switch, eventDoc, eventElement
+    eventDoc = eventElement = 0
+    $switch = createCheckbox().bootstrapSwitch()
+    $(document).on('switchChange.bootstrapSwitch', ':checkbox', function (event, state) {
+      return eventDoc++
+    })
+    $(':checkbox').on('switchChange.bootstrapSwitch', function (event, state) {
+      return eventElement++
+    })
+    $switch.click()
+    expect(eventElement).toEqual(eventDoc)
+    expect(eventElement).toEqual(1)
+  })
+
+  describe('The Checkbox Bootstrap Switch', function () {
+    it('should conserve its state if onSwitchChange returns false', function () {
+      var $indeterminateSwitch, $switch
+      $switch = createCheckbox().bootstrapSwitch({
+        onSwitchChange: function (e, s) {
+          expect(s).toEqual(true)
+          return false
+        }
+      })
+      $indeterminateSwitch = createCheckbox().data('indeterminate', true).bootstrapSwitch({
+        onSwitchChange: function (e, s) {
+          expect(s).toEqual(true)
+          return false
+        }
+      })
+      $switch.click()
+      $indeterminateSwitch.click()
+      expect($switch.bootstrapSwitch('state')).toEqual(false)
+      expect($indeterminateSwitch.bootstrapSwitch('state')).toEqual(false)
+    })
+
+    it('should change its state if onSwitchChange not returns false', function () {
+      var $switch
+      $switch = createCheckbox().bootstrapSwitch({
+        onSwitchChange: function (e, s) {
+          expect(s).toEqual(true)
+        }
+      })
+      $switch.click()
+      expect($switch.bootstrapSwitch('state')).toEqual(true)
+    })
+  })
+
+  describe('The Radio Bootstrap Switch', function () {
+    it('should conserve its state if onSwitchChange returns false', function () {
+      var $radio1, $radio2, $radio3
+      $radio1 = createRadio().prop('checked', true)
+      $radio2 = createRadio().prop('checked', false)
+      $radio3 = createRadio().prop('checked', false)
+      $('[name="name"]').bootstrapSwitch({
+        onSwitchChange: function (e, s) {
+          expect(s).toEqual(true)
+          return false
+        }
+      })
+      $radio2.click()
+      expect($radio1.bootstrapSwitch('state')).toEqual(true)
+      expect($radio2.bootstrapSwitch('state')).toEqual(false)
+      expect($radio3.bootstrapSwitch('state')).toEqual(false)
+    })
+
+    it('should change its state if onSwitchChange not returns false', function () {
+      var $radio1, $radio2, $radio3
+      $radio1 = createRadio().prop('checked', true)
+      $radio2 = createRadio().prop('checked', false)
+      $radio3 = createRadio().prop('checked', false)
+      $('[name="name"]').bootstrapSwitch({
+        onSwitchChange: function (e, s) {
+          expect(s).toEqual(true)
+        }
+      })
+      $radio2.click()
+      expect($radio1.bootstrapSwitch('state')).toEqual(false)
+      expect($radio2.bootstrapSwitch('state')).toEqual(true)
+      expect($radio3.bootstrapSwitch('state')).toEqual(false)
+    })
+  })
+})

+ 1 - 1
test.html

@@ -29,4 +29,4 @@
     })
     </script>
   </body>
-</html>
+</html>

+ 0 - 744
test/bootstrap-switch.js

@@ -1,744 +0,0 @@
-/* ========================================================================
- * bootstrap-switch - v3.3.2
- * http://www.bootstrap-switch.org
- * ========================================================================
- * Copyright 2012-2013 Mattia Larentis
- *
- * ========================================================================
- * 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 slice = [].slice;
-
-  (function($, window) {
-    "use strict";
-    var BootstrapSwitch;
-    BootstrapSwitch = (function() {
-      function BootstrapSwitch(element, options) {
-        if (options == null) {
-          options = {};
-        }
-        this.$element = $(element);
-        this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, {
-          state: this.$element.is(":checked"),
-          size: this.$element.data("size"),
-          animate: this.$element.data("animate"),
-          disabled: this.$element.is(":disabled"),
-          readonly: this.$element.is("[readonly]"),
-          indeterminate: this.$element.data("indeterminate"),
-          inverse: this.$element.data("inverse"),
-          radioAllOff: this.$element.data("radio-all-off"),
-          onColor: this.$element.data("on-color"),
-          offColor: this.$element.data("off-color"),
-          onText: this.$element.data("on-text"),
-          offText: this.$element.data("off-text"),
-          labelText: this.$element.data("label-text"),
-          handleWidth: this.$element.data("handle-width"),
-          labelWidth: this.$element.data("label-width"),
-          baseClass: this.$element.data("base-class"),
-          wrapperClass: this.$element.data("wrapper-class")
-        }, options);
-        this.prevOptions = {};
-        this.$wrapper = $("<div>", {
-          "class": (function(_this) {
-            return function() {
-              var classes;
-              classes = ["" + _this.options.baseClass].concat(_this._getClasses(_this.options.wrapperClass));
-              classes.push(_this.options.state ? _this.options.baseClass + "-on" : _this.options.baseClass + "-off");
-              if (_this.options.size != null) {
-                classes.push(_this.options.baseClass + "-" + _this.options.size);
-              }
-              if (_this.options.disabled) {
-                classes.push(_this.options.baseClass + "-disabled");
-              }
-              if (_this.options.readonly) {
-                classes.push(_this.options.baseClass + "-readonly");
-              }
-              if (_this.options.indeterminate) {
-                classes.push(_this.options.baseClass + "-indeterminate");
-              }
-              if (_this.options.inverse) {
-                classes.push(_this.options.baseClass + "-inverse");
-              }
-              if (_this.$element.attr("id")) {
-                classes.push(_this.options.baseClass + "-id-" + (_this.$element.attr("id")));
-              }
-              return classes.join(" ");
-            };
-          })(this)()
-        });
-        this.$container = $("<div>", {
-          "class": this.options.baseClass + "-container"
-        });
-        this.$on = $("<span>", {
-          html: this.options.onText,
-          "class": this.options.baseClass + "-handle-on " + this.options.baseClass + "-" + this.options.onColor
-        });
-        this.$off = $("<span>", {
-          html: this.options.offText,
-          "class": this.options.baseClass + "-handle-off " + this.options.baseClass + "-" + this.options.offColor
-        });
-        this.$label = $("<span>", {
-          html: this.options.labelText,
-          "class": this.options.baseClass + "-label"
-        });
-        this.$element.on("init.bootstrapSwitch", (function(_this) {
-          return function() {
-            return _this.options.onInit.apply(element, arguments);
-          };
-        })(this));
-        this.$element.on("switchChange.bootstrapSwitch", (function(_this) {
-          return function(e) {
-            if (false === _this.options.onSwitchChange.apply(element, arguments)) {
-              if (_this.$element.is(":radio")) {
-                return $("[name='" + (_this.$element.attr('name')) + "']").trigger("previousState.bootstrapSwitch", true);
-              } else {
-                return _this.$element.trigger("previousState.bootstrapSwitch", true);
-              }
-            }
-          };
-        })(this));
-        this.$container = this.$element.wrap(this.$container).parent();
-        this.$wrapper = this.$container.wrap(this.$wrapper).parent();
-        this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
-        if (this.options.indeterminate) {
-          this.$element.prop("indeterminate", true);
-        }
-        this._init();
-        this._elementHandlers();
-        this._handleHandlers();
-        this._labelHandlers();
-        this._formHandler();
-        this._externalLabelHandler();
-        this.$element.trigger("init.bootstrapSwitch", this.options.state);
-      }
-
-      BootstrapSwitch.prototype._constructor = BootstrapSwitch;
-
-      BootstrapSwitch.prototype.setPrevOptions = function() {
-        return this.prevOptions = $.extend(true, {}, this.options);
-      };
-
-      BootstrapSwitch.prototype.state = function(value, skip) {
-        if (typeof value === "undefined") {
-          return this.options.state;
-        }
-        if (this.options.disabled || this.options.readonly) {
-          return this.$element;
-        }
-        if (this.options.state && !this.options.radioAllOff && this.$element.is(":radio")) {
-          return this.$element;
-        }
-        if (this.$element.is(":radio")) {
-          $("[name='" + (this.$element.attr('name')) + "']").trigger("setPreviousOptions.bootstrapSwitch");
-        } else {
-          this.$element.trigger("setPreviousOptions.bootstrapSwitch");
-        }
-        if (this.options.indeterminate) {
-          this.indeterminate(false);
-        }
-        value = !!value;
-        this.$element.prop("checked", value).trigger("change.bootstrapSwitch", skip);
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.toggleState = function(skip) {
-        if (this.options.disabled || this.options.readonly) {
-          return this.$element;
-        }
-        if (this.options.indeterminate) {
-          this.indeterminate(false);
-          return this.state(true);
-        } else {
-          return this.$element.prop("checked", !this.options.state).trigger("change.bootstrapSwitch", skip);
-        }
-      };
-
-      BootstrapSwitch.prototype.size = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.size;
-        }
-        if (this.options.size != null) {
-          this.$wrapper.removeClass(this.options.baseClass + "-" + this.options.size);
-        }
-        if (value) {
-          this.$wrapper.addClass(this.options.baseClass + "-" + value);
-        }
-        this._width();
-        this._containerPosition();
-        this.options.size = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.animate = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.animate;
-        }
-        value = !!value;
-        if (value === this.options.animate) {
-          return this.$element;
-        }
-        return this.toggleAnimate();
-      };
-
-      BootstrapSwitch.prototype.toggleAnimate = function() {
-        this.options.animate = !this.options.animate;
-        this.$wrapper.toggleClass(this.options.baseClass + "-animate");
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.disabled = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.disabled;
-        }
-        value = !!value;
-        if (value === this.options.disabled) {
-          return this.$element;
-        }
-        return this.toggleDisabled();
-      };
-
-      BootstrapSwitch.prototype.toggleDisabled = function() {
-        this.options.disabled = !this.options.disabled;
-        this.$element.prop("disabled", this.options.disabled);
-        this.$wrapper.toggleClass(this.options.baseClass + "-disabled");
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.readonly = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.readonly;
-        }
-        value = !!value;
-        if (value === this.options.readonly) {
-          return this.$element;
-        }
-        return this.toggleReadonly();
-      };
-
-      BootstrapSwitch.prototype.toggleReadonly = function() {
-        this.options.readonly = !this.options.readonly;
-        this.$element.prop("readonly", this.options.readonly);
-        this.$wrapper.toggleClass(this.options.baseClass + "-readonly");
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.indeterminate = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.indeterminate;
-        }
-        value = !!value;
-        if (value === this.options.indeterminate) {
-          return this.$element;
-        }
-        return this.toggleIndeterminate();
-      };
-
-      BootstrapSwitch.prototype.toggleIndeterminate = function() {
-        this.options.indeterminate = !this.options.indeterminate;
-        this.$element.prop("indeterminate", this.options.indeterminate);
-        this.$wrapper.toggleClass(this.options.baseClass + "-indeterminate");
-        this._containerPosition();
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.inverse = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.inverse;
-        }
-        value = !!value;
-        if (value === this.options.inverse) {
-          return this.$element;
-        }
-        return this.toggleInverse();
-      };
-
-      BootstrapSwitch.prototype.toggleInverse = function() {
-        var $off, $on;
-        this.$wrapper.toggleClass(this.options.baseClass + "-inverse");
-        $on = this.$on.clone(true);
-        $off = this.$off.clone(true);
-        this.$on.replaceWith($off);
-        this.$off.replaceWith($on);
-        this.$on = $off;
-        this.$off = $on;
-        this.options.inverse = !this.options.inverse;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onColor = function(value) {
-        var color;
-        color = this.options.onColor;
-        if (typeof value === "undefined") {
-          return color;
-        }
-        if (color != null) {
-          this.$on.removeClass(this.options.baseClass + "-" + color);
-        }
-        this.$on.addClass(this.options.baseClass + "-" + value);
-        this.options.onColor = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.offColor = function(value) {
-        var color;
-        color = this.options.offColor;
-        if (typeof value === "undefined") {
-          return color;
-        }
-        if (color != null) {
-          this.$off.removeClass(this.options.baseClass + "-" + color);
-        }
-        this.$off.addClass(this.options.baseClass + "-" + value);
-        this.options.offColor = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onText = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.onText;
-        }
-        this.$on.html(value);
-        this._width();
-        this._containerPosition();
-        this.options.onText = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.offText = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.offText;
-        }
-        this.$off.html(value);
-        this._width();
-        this._containerPosition();
-        this.options.offText = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.labelText = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.labelText;
-        }
-        this.$label.html(value);
-        this._width();
-        this.options.labelText = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.handleWidth = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.handleWidth;
-        }
-        this.options.handleWidth = value;
-        this._width();
-        this._containerPosition();
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.labelWidth = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.labelWidth;
-        }
-        this.options.labelWidth = value;
-        this._width();
-        this._containerPosition();
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.baseClass = function(value) {
-        return this.options.baseClass;
-      };
-
-      BootstrapSwitch.prototype.wrapperClass = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.wrapperClass;
-        }
-        if (!value) {
-          value = $.fn.bootstrapSwitch.defaults.wrapperClass;
-        }
-        this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" "));
-        this.$wrapper.addClass(this._getClasses(value).join(" "));
-        this.options.wrapperClass = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.radioAllOff = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.radioAllOff;
-        }
-        value = !!value;
-        if (value === this.options.radioAllOff) {
-          return this.$element;
-        }
-        this.options.radioAllOff = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onInit = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.onInit;
-        }
-        if (!value) {
-          value = $.fn.bootstrapSwitch.defaults.onInit;
-        }
-        this.options.onInit = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.onSwitchChange = function(value) {
-        if (typeof value === "undefined") {
-          return this.options.onSwitchChange;
-        }
-        if (!value) {
-          value = $.fn.bootstrapSwitch.defaults.onSwitchChange;
-        }
-        this.options.onSwitchChange = value;
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype.destroy = function() {
-        var $form;
-        $form = this.$element.closest("form");
-        if ($form.length) {
-          $form.off("reset.bootstrapSwitch").removeData("bootstrap-switch");
-        }
-        this.$container.children().not(this.$element).remove();
-        this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch");
-        return this.$element;
-      };
-
-      BootstrapSwitch.prototype._width = function() {
-        var $handles, handleWidth;
-        $handles = this.$on.add(this.$off);
-        $handles.add(this.$label).css("width", "");
-        handleWidth = this.options.handleWidth === "auto" ? Math.max(this.$on.width(), this.$off.width()) : this.options.handleWidth;
-        $handles.width(handleWidth);
-        this.$label.width((function(_this) {
-          return function(index, width) {
-            if (_this.options.labelWidth !== "auto") {
-              return _this.options.labelWidth;
-            }
-            if (width < handleWidth) {
-              return handleWidth;
-            } else {
-              return width;
-            }
-          };
-        })(this));
-        this._handleWidth = this.$on.outerWidth();
-        this._labelWidth = this.$label.outerWidth();
-        this.$container.width((this._handleWidth * 2) + this._labelWidth);
-        return this.$wrapper.width(this._handleWidth + this._labelWidth);
-      };
-
-      BootstrapSwitch.prototype._containerPosition = function(state, callback) {
-        if (state == null) {
-          state = this.options.state;
-        }
-        this.$container.css("margin-left", (function(_this) {
-          return function() {
-            var values;
-            values = [0, "-" + _this._handleWidth + "px"];
-            if (_this.options.indeterminate) {
-              return "-" + (_this._handleWidth / 2) + "px";
-            }
-            if (state) {
-              if (_this.options.inverse) {
-                return values[1];
-              } else {
-                return values[0];
-              }
-            } else {
-              if (_this.options.inverse) {
-                return values[0];
-              } else {
-                return values[1];
-              }
-            }
-          };
-        })(this));
-        if (!callback) {
-          return;
-        }
-        return setTimeout(function() {
-          return callback();
-        }, 50);
-      };
-
-      BootstrapSwitch.prototype._init = function() {
-        var init, initInterval;
-        init = (function(_this) {
-          return function() {
-            _this.setPrevOptions();
-            _this._width();
-            return _this._containerPosition(null, function() {
-              if (_this.options.animate) {
-                return _this.$wrapper.addClass(_this.options.baseClass + "-animate");
-              }
-            });
-          };
-        })(this);
-        if (this.$wrapper.is(":visible")) {
-          return init();
-        }
-        return initInterval = window.setInterval((function(_this) {
-          return function() {
-            if (_this.$wrapper.is(":visible")) {
-              init();
-              return window.clearInterval(initInterval);
-            }
-          };
-        })(this), 50);
-      };
-
-      BootstrapSwitch.prototype._elementHandlers = function() {
-        return this.$element.on({
-          "setPreviousOptions.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              return _this.setPrevOptions();
-            };
-          })(this),
-          "previousState.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              _this.options = _this.prevOptions;
-              if (_this.options.indeterminate) {
-                _this.$wrapper.addClass(_this.options.baseClass + "-indeterminate");
-              }
-              return _this.$element.prop("checked", _this.options.state).trigger("change.bootstrapSwitch", true);
-            };
-          })(this),
-          "change.bootstrapSwitch": (function(_this) {
-            return function(e, skip) {
-              var state;
-              e.preventDefault();
-              e.stopImmediatePropagation();
-              state = _this.$element.is(":checked");
-              _this._containerPosition(state);
-              if (state === _this.options.state) {
-                return;
-              }
-              _this.options.state = state;
-              _this.$wrapper.toggleClass(_this.options.baseClass + "-off").toggleClass(_this.options.baseClass + "-on");
-              if (!skip) {
-                if (_this.$element.is(":radio")) {
-                  $("[name='" + (_this.$element.attr('name')) + "']").not(_this.$element).prop("checked", false).trigger("change.bootstrapSwitch", true);
-                }
-                return _this.$element.trigger("switchChange.bootstrapSwitch", [state]);
-              }
-            };
-          })(this),
-          "focus.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              e.preventDefault();
-              return _this.$wrapper.addClass(_this.options.baseClass + "-focused");
-            };
-          })(this),
-          "blur.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              e.preventDefault();
-              return _this.$wrapper.removeClass(_this.options.baseClass + "-focused");
-            };
-          })(this),
-          "keydown.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              if (!e.which || _this.options.disabled || _this.options.readonly) {
-                return;
-              }
-              switch (e.which) {
-                case 37:
-                  e.preventDefault();
-                  e.stopImmediatePropagation();
-                  return _this.state(false);
-                case 39:
-                  e.preventDefault();
-                  e.stopImmediatePropagation();
-                  return _this.state(true);
-              }
-            };
-          })(this)
-        });
-      };
-
-      BootstrapSwitch.prototype._handleHandlers = function() {
-        this.$on.on("click.bootstrapSwitch", (function(_this) {
-          return function(event) {
-            event.preventDefault();
-            event.stopPropagation();
-            _this.state(false);
-            return _this.$element.trigger("focus.bootstrapSwitch");
-          };
-        })(this));
-        return this.$off.on("click.bootstrapSwitch", (function(_this) {
-          return function(event) {
-            event.preventDefault();
-            event.stopPropagation();
-            _this.state(true);
-            return _this.$element.trigger("focus.bootstrapSwitch");
-          };
-        })(this));
-      };
-
-      BootstrapSwitch.prototype._labelHandlers = function() {
-        return this.$label.on({
-          "click": function(e) {
-            return e.stopPropagation();
-          },
-          "mousedown.bootstrapSwitch touchstart.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              if (_this._dragStart || _this.options.disabled || _this.options.readonly) {
-                return;
-              }
-              e.preventDefault();
-              e.stopPropagation();
-              _this._dragStart = (e.pageX || e.originalEvent.touches[0].pageX) - parseInt(_this.$container.css("margin-left"), 10);
-              if (_this.options.animate) {
-                _this.$wrapper.removeClass(_this.options.baseClass + "-animate");
-              }
-              return _this.$element.trigger("focus.bootstrapSwitch");
-            };
-          })(this),
-          "mousemove.bootstrapSwitch touchmove.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              var difference;
-              if (_this._dragStart == null) {
-                return;
-              }
-              e.preventDefault();
-              difference = (e.pageX || e.originalEvent.touches[0].pageX) - _this._dragStart;
-              if (difference < -_this._handleWidth || difference > 0) {
-                return;
-              }
-              _this._dragEnd = difference;
-              return _this.$container.css("margin-left", _this._dragEnd + "px");
-            };
-          })(this),
-          "mouseup.bootstrapSwitch touchend.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              var state;
-              if (!_this._dragStart) {
-                return;
-              }
-              e.preventDefault();
-              if (_this.options.animate) {
-                _this.$wrapper.addClass(_this.options.baseClass + "-animate");
-              }
-              if (_this._dragEnd) {
-                state = _this._dragEnd > -(_this._handleWidth / 2);
-                _this._dragEnd = false;
-                _this.state(_this.options.inverse ? !state : state);
-              } else {
-                _this.state(!_this.options.state);
-              }
-              return _this._dragStart = false;
-            };
-          })(this),
-          "mouseleave.bootstrapSwitch": (function(_this) {
-            return function(e) {
-              return _this.$label.trigger("mouseup.bootstrapSwitch");
-            };
-          })(this)
-        });
-      };
-
-      BootstrapSwitch.prototype._externalLabelHandler = function() {
-        var $externalLabel;
-        $externalLabel = this.$element.closest("label");
-        return $externalLabel.on("click", (function(_this) {
-          return function(event) {
-            event.preventDefault();
-            event.stopImmediatePropagation();
-            if (event.target === $externalLabel[0]) {
-              return _this.toggleState();
-            }
-          };
-        })(this));
-      };
-
-      BootstrapSwitch.prototype._formHandler = function() {
-        var $form;
-        $form = this.$element.closest("form");
-        if ($form.data("bootstrap-switch")) {
-          return;
-        }
-        return $form.on("reset.bootstrapSwitch", function() {
-          return window.setTimeout(function() {
-            return $form.find("input").filter(function() {
-              return $(this).data("bootstrap-switch");
-            }).each(function() {
-              return $(this).bootstrapSwitch("state", this.checked);
-            });
-          }, 1);
-        }).data("bootstrap-switch", true);
-      };
-
-      BootstrapSwitch.prototype._getClasses = function(classes) {
-        var c, cls, i, len;
-        if (!$.isArray(classes)) {
-          return [this.options.baseClass + "-" + classes];
-        }
-        cls = [];
-        for (i = 0, len = classes.length; i < len; i++) {
-          c = classes[i];
-          cls.push(this.options.baseClass + "-" + c);
-        }
-        return cls;
-      };
-
-      return BootstrapSwitch;
-
-    })();
-    $.fn.bootstrapSwitch = function() {
-      var args, option, ret;
-      option = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
-      ret = this;
-      this.each(function() {
-        var $this, data;
-        $this = $(this);
-        data = $this.data("bootstrap-switch");
-        if (!data) {
-          $this.data("bootstrap-switch", data = new BootstrapSwitch(this, option));
-        }
-        if (typeof option === "string") {
-          return ret = data[option].apply(data, args);
-        }
-      });
-      return ret;
-    };
-    $.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
-    return $.fn.bootstrapSwitch.defaults = {
-      state: true,
-      size: null,
-      animate: true,
-      disabled: false,
-      readonly: false,
-      indeterminate: false,
-      inverse: false,
-      radioAllOff: false,
-      onColor: "primary",
-      offColor: "default",
-      onText: "ON",
-      offText: "OFF",
-      labelText: "&nbsp;",
-      handleWidth: "auto",
-      labelWidth: "auto",
-      baseClass: "bootstrap-switch",
-      wrapperClass: "wrapper",
-      onInit: function() {},
-      onSwitchChange: function() {}
-    };
-  })(window.jQuery, window);
-
-}).call(this);

+ 0 - 121
test/bootstrap-switch.tests.js

@@ -1,121 +0,0 @@
-(function() {
-  describe("Bootstrap Switch:", function() {
-    var createCheckbox, createRadio, getOptions;
-    beforeEach(function() {
-      $.support.transition = false;
-      return $.fx.off = true;
-    });
-    afterEach(function() {
-      return $("." + $.fn.bootstrapSwitch.defaults.baseClass).bootstrapSwitch("destroy");
-    });
-    createCheckbox = function() {
-      return $("<input>", {
-        type: "checkbox",
-        "class": "switch"
-      }).appendTo("body");
-    };
-    createRadio = function() {
-      return $("<input>", {
-        type: "radio",
-        name: "name",
-        "class": "switch"
-      }).appendTo("body");
-    };
-    getOptions = function($element) {
-      return $element.data("bootstrap-switch").options;
-    };
-    it("should set the default options as element options, except state", function() {
-      var $switch;
-      $switch = createCheckbox().prop("checked", true).bootstrapSwitch();
-      return expect(getOptions($switch)).toEqual($.fn.bootstrapSwitch.defaults);
-    });
-    it("should override default options with initialization ones", function() {
-      var $switch, $switch2;
-      $switch = createCheckbox().prop("checked", false).bootstrapSwitch();
-      $switch2 = createCheckbox().bootstrapSwitch({
-        state: false
-      });
-      expect(getOptions($switch).state).toBe(false);
-      return expect(getOptions($switch2).state).toBe(false);
-    });
-    it("should something", function() {
-      var $switch, eventDoc, eventElement;
-      eventDoc = eventElement = 0;
-      $switch = createCheckbox().bootstrapSwitch();
-      $(document).on("switchChange.bootstrapSwitch", ":checkbox", function(event, state) {
-        return eventDoc++;
-      });
-      $(":checkbox").on("switchChange.bootstrapSwitch", function(event, state) {
-        return eventElement++;
-      });
-      $switch.click();
-      expect(eventElement).toEqual(eventDoc);
-      return expect(eventElement).toEqual(1);
-    });
-    describe("The Checkbox Bootstrap Switch", function() {
-      it("should conserve its state if onSwitchChange returns false", function() {
-        var $indeterminateSwitch, $switch;
-        $switch = createCheckbox().bootstrapSwitch({
-          onSwitchChange: function(e, s) {
-            expect(s).toEqual(true);
-            return false;
-          }
-        });
-        $indeterminateSwitch = createCheckbox().data("indeterminate", true).bootstrapSwitch({
-          onSwitchChange: function(e, s) {
-            expect(s).toEqual(true);
-            return false;
-          }
-        });
-        $switch.click();
-        $indeterminateSwitch.click();
-        expect($switch.bootstrapSwitch('state')).toEqual(false);
-        return expect($indeterminateSwitch.bootstrapSwitch('state')).toEqual(false);
-      });
-      return it("should change its state if onSwitchChange not returns false", function() {
-        var $switch;
-        $switch = createCheckbox().bootstrapSwitch({
-          onSwitchChange: function(e, s) {
-            return expect(s).toEqual(true);
-          }
-        });
-        $switch.click();
-        return expect($switch.bootstrapSwitch('state')).toEqual(true);
-      });
-    });
-    return describe("The Radio Bootstrap Switch", function() {
-      it("should conserve its state if onSwitchChange returns false", function() {
-        var $radio1, $radio2, $radio3;
-        $radio1 = createRadio().prop("checked", true);
-        $radio2 = createRadio().prop("checked", false);
-        $radio3 = createRadio().prop("checked", false);
-        $('[name="name"]').bootstrapSwitch({
-          onSwitchChange: function(e, s) {
-            expect(s).toEqual(true);
-            return false;
-          }
-        });
-        $radio2.click();
-        expect($radio1.bootstrapSwitch('state')).toEqual(true);
-        expect($radio2.bootstrapSwitch('state')).toEqual(false);
-        return expect($radio3.bootstrapSwitch('state')).toEqual(false);
-      });
-      return it("should change its state if onSwitchChange not returns false", function() {
-        var $radio1, $radio2, $radio3;
-        $radio1 = createRadio().prop("checked", true);
-        $radio2 = createRadio().prop("checked", false);
-        $radio3 = createRadio().prop("checked", false);
-        $('[name="name"]').bootstrapSwitch({
-          onSwitchChange: function(e, s) {
-            return expect(s).toEqual(true);
-          }
-        });
-        $radio2.click();
-        expect($radio1.bootstrapSwitch('state')).toEqual(false);
-        expect($radio2.bootstrapSwitch('state')).toEqual(true);
-        return expect($radio3.bootstrapSwitch('state')).toEqual(false);
-      });
-    });
-  });
-
-}).call(this);

Some files were not shown because too many files changed in this diff