bootstrap-slider-rails 4.8.1 → 4.14.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d98f6d9098949f6905bd100b53ecfee56601f18b
4
- data.tar.gz: 7390bda2d0b068b8cbb5f01c37f6ecdcd08a6e30
3
+ metadata.gz: dbf7091b715fc5a064f2eb170ab050fa5f61f034
4
+ data.tar.gz: 937a56a06aaeed44fccc69dde833da7eb5cd1ef0
5
5
  SHA512:
6
- metadata.gz: 7f158cdef06ad1faf262c14a3a1738d7c85878bc696dba44fd15874f18df9b2230952157f273f1f3fbc9770a73bcb0b31695bad03bd2fc88913a67b7abe09bde
7
- data.tar.gz: 91475175a91e23ece5dc5a57c095e913fdc858eb3b0eb459b79e1a1f004791668c26a6a632444d127efb626c30d5f20a4c3d2c18ffdb8c0a94e12db4cb3e9c61
6
+ metadata.gz: 6efbaf277b078213a985c58607076f37b47514a287e32dd04dbe21972b94594742b4aad8b6efd89b82fd45ed836c57aa280b26466aa7cf44f36e4eec2287b575
7
+ data.tar.gz: 76b3b73ac7cf7bf756a530cbc9c8675fbecd093ce3a8af090091159e798a51c2234cc7539b580a9cf256e388c27e16a872e4a33a291f872d6c231a7e21a6e304
@@ -8,14 +8,14 @@ Gem::Specification.new do |spec|
8
8
  spec.version = BootstrapSlider::Rails::VERSION
9
9
  spec.authors = ['Pedr Browne']
10
10
  spec.email = ['pedr.browne@gmail.com']
11
- spec.description = %q{Make Bootstrap Slider available to Rails}
12
- spec.summary = %q{This Gem integrates Seiyara's fork of Bootstrap Slider
13
- with Rails, exposing its JavaScript and CSS assets via
14
- a Rails Engine.}
11
+ spec.description = 'Make Bootstrap Slider available to Rails'
12
+ spec.summary = "This Gem integrates Seiyara's fork of Bootstrap " \
13
+ 'Slider with Rails, exposing its JavaScript and CSS ' \
14
+ 'assets via a Rails Engine.'
15
15
  spec.homepage = 'http://github.com/stationkeeping/bootstrap-slider-rails'
16
16
  spec.license = 'MIT'
17
17
 
18
- spec.files = `git ls-files`.split($/)
18
+ spec.files = `git ls-files`.split($RS)
19
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
@@ -1,5 +1,5 @@
1
1
  module BootstrapSlider
2
2
  module Rails
3
- VERSION = '4.8.1'
3
+ VERSION = '4.14.5'
4
4
  end
5
5
  end
@@ -304,6 +304,22 @@
304
304
 
305
305
  function createNewSlider(element, options) {
306
306
 
307
+ /*
308
+ The internal state object is used to store data about the current 'state' of slider.
309
+
310
+ This includes values such as the `value`, `enabled`, etc...
311
+ */
312
+ this._state = {
313
+ value: null,
314
+ enabled: null,
315
+ offset: null,
316
+ size: null,
317
+ percentage: null,
318
+ inDrag: null,
319
+ over: null
320
+ };
321
+
322
+
307
323
  if(typeof element === "string") {
308
324
  this.element = document.querySelector(element);
309
325
  } else if(element instanceof HTMLElement) {
@@ -335,6 +351,23 @@
335
351
  this.options[optName] = val;
336
352
  }
337
353
 
354
+ /*
355
+ Validate `tooltip_position` against 'orientation`
356
+ - if `tooltip_position` is incompatible with orientation, swith it to a default compatible with specified `orientation`
357
+ -- default for "vertical" -> "right"
358
+ -- default for "horizontal" -> "left"
359
+ */
360
+ if(this.options.orientation === "vertical" && (this.options.tooltip_position === "top" || this.options.tooltip_position === "bottom")) {
361
+
362
+ this.options.tooltip_position = "right";
363
+
364
+ }
365
+ else if(this.options.orientation === "horizontal" && (this.options.tooltip_position === "left" || this.options.tooltip_position === "right")) {
366
+
367
+ this.options.tooltip_position = "top";
368
+
369
+ }
370
+
338
371
  function getDataAttrib(element, optName) {
339
372
  var dataName = "data-slider-" + optName.replace(/_/g, '-');
340
373
  var dataValString = element.getAttribute(dataName);
@@ -530,38 +563,19 @@
530
563
 
531
564
  if(this.options.orientation === 'vertical') {
532
565
  this._addClass(this.sliderElem,'slider-vertical');
533
-
534
566
  this.stylePos = 'top';
535
567
  this.mousePos = 'pageY';
536
568
  this.sizePos = 'offsetHeight';
537
-
538
- this._addClass(this.tooltip, 'right');
539
- this.tooltip.style.left = '100%';
540
-
541
- this._addClass(this.tooltip_min, 'right');
542
- this.tooltip_min.style.left = '100%';
543
-
544
- this._addClass(this.tooltip_max, 'right');
545
- this.tooltip_max.style.left = '100%';
546
569
  } else {
547
570
  this._addClass(this.sliderElem, 'slider-horizontal');
548
571
  this.sliderElem.style.width = origWidth;
549
-
550
572
  this.options.orientation = 'horizontal';
551
573
  this.stylePos = 'left';
552
574
  this.mousePos = 'pageX';
553
575
  this.sizePos = 'offsetWidth';
554
576
 
555
- this._addClass(this.tooltip, 'top');
556
- this.tooltip.style.top = -this.tooltip.outerHeight - 14 + 'px';
557
-
558
- this._addClass(this.tooltip_min, 'top');
559
- this.tooltip_min.style.top = -this.tooltip_min.outerHeight - 14 + 'px';
560
-
561
- this._addClass(this.tooltip_max, 'top');
562
- this.tooltip_max.style.top = -this.tooltip_max.outerHeight - 14 + 'px';
563
577
  }
564
-
578
+ this._setTooltipPosition();
565
579
  /* In case ticks are specified, overwrite the min and max bounds */
566
580
  if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {
567
581
  this.options.max = Math.max.apply(Math, this.options.ticks);
@@ -570,9 +584,14 @@
570
584
 
571
585
  if (Array.isArray(this.options.value)) {
572
586
  this.options.range = true;
573
- } else if (this.options.range) {
587
+ this._state.value = this.options.value;
588
+ }
589
+ else if (this.options.range) {
574
590
  // User wants a range, but value is not an array
575
- this.options.value = [this.options.value, this.options.max];
591
+ this._state.value = [this.options.value, this.options.max];
592
+ }
593
+ else {
594
+ this._state.value = this.options.value;
576
595
  }
577
596
 
578
597
  this.trackLow = sliderTrackLow || this.trackLow;
@@ -609,9 +628,9 @@
609
628
  }
610
629
  }
611
630
 
612
- this.offset = this._offset(this.sliderElem);
613
- this.size = this.sliderElem[this.sizePos];
614
- this.setValue(this.options.value);
631
+ this._state.offset = this._offset(this.sliderElem);
632
+ this._state.size = this.sliderElem[this.sizePos];
633
+ this.setValue(this._state.value);
615
634
 
616
635
  /******************************************
617
636
 
@@ -639,10 +658,12 @@
639
658
  this._addClass(this.tooltip, 'hide');
640
659
  this._addClass(this.tooltip_min, 'hide');
641
660
  this._addClass(this.tooltip_max, 'hide');
642
- } else if(this.options.tooltip === 'always') {
661
+ }
662
+ else if(this.options.tooltip === 'always') {
643
663
  this._showTooltip();
644
664
  this._alwaysShowTooltip = true;
645
- } else {
665
+ }
666
+ else {
646
667
  this.showTooltip = this._showTooltip.bind(this);
647
668
  this.hideTooltip = this._hideTooltip.bind(this);
648
669
 
@@ -680,7 +701,7 @@
680
701
 
681
702
  defaultOptions: {
682
703
  id: "",
683
- min: 0,
704
+ min: 0,
684
705
  max: 10,
685
706
  step: 1,
686
707
  precision: 0,
@@ -706,18 +727,21 @@
706
727
  ticks_labels: [],
707
728
  ticks_snap_bounds: 0,
708
729
  scale: 'linear',
709
- focus: false
730
+ focus: false,
731
+ tooltip_position: null
710
732
  },
711
733
 
712
- over: false,
713
-
714
- inDrag: false,
734
+ getElement: function() {
735
+ return this.sliderElem;
736
+ },
715
737
 
716
738
  getValue: function() {
717
739
  if (this.options.range) {
718
- return this.options.value;
740
+ return this._state.value;
741
+ }
742
+ else {
743
+ return this._state.value[0];
719
744
  }
720
- return this.options.value[0];
721
745
  },
722
746
 
723
747
  setValue: function(val, triggerSlideEvent, triggerChangeEvent) {
@@ -725,38 +749,39 @@
725
749
  val = 0;
726
750
  }
727
751
  var oldValue = this.getValue();
728
- this.options.value = this._validateInputValue(val);
752
+ this._state.value = this._validateInputValue(val);
729
753
  var applyPrecision = this._applyPrecision.bind(this);
730
754
 
731
755
  if (this.options.range) {
732
- this.options.value[0] = applyPrecision(this.options.value[0]);
733
- this.options.value[1] = applyPrecision(this.options.value[1]);
756
+ this._state.value[0] = applyPrecision(this._state.value[0]);
757
+ this._state.value[1] = applyPrecision(this._state.value[1]);
734
758
 
735
- this.options.value[0] = Math.max(this.options.min, Math.min(this.options.max, this.options.value[0]));
736
- this.options.value[1] = Math.max(this.options.min, Math.min(this.options.max, this.options.value[1]));
737
- } else {
738
- this.options.value = applyPrecision(this.options.value);
739
- this.options.value = [ Math.max(this.options.min, Math.min(this.options.max, this.options.value))];
759
+ this._state.value[0] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[0]));
760
+ this._state.value[1] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[1]));
761
+ }
762
+ else {
763
+ this._state.value = applyPrecision(this._state.value);
764
+ this._state.value = [ Math.max(this.options.min, Math.min(this.options.max, this._state.value))];
740
765
  this._addClass(this.handle2, 'hide');
741
766
  if (this.options.selection === 'after') {
742
- this.options.value[1] = this.options.max;
767
+ this._state.value[1] = this.options.max;
743
768
  } else {
744
- this.options.value[1] = this.options.min;
769
+ this._state.value[1] = this.options.min;
745
770
  }
746
771
  }
747
772
 
748
773
  if (this.options.max > this.options.min) {
749
- this.percentage = [
750
- this._toPercentage(this.options.value[0]),
751
- this._toPercentage(this.options.value[1]),
774
+ this._state.percentage = [
775
+ this._toPercentage(this._state.value[0]),
776
+ this._toPercentage(this._state.value[1]),
752
777
  this.options.step * 100 / (this.options.max - this.options.min)
753
778
  ];
754
779
  } else {
755
- this.percentage = [0, 0, 100];
780
+ this._state.percentage = [0, 0, 100];
756
781
  }
757
782
 
758
783
  this._layout();
759
- var newValue = this.options.range ? this.options.value : this.options.value[0];
784
+ var newValue = this.options.range ? this._state.value : this._state.value[0];
760
785
 
761
786
  if(triggerSlideEvent === true) {
762
787
  this._trigger('slide', newValue);
@@ -795,7 +820,7 @@
795
820
  },
796
821
 
797
822
  disable: function() {
798
- this.options.enabled = false;
823
+ this._state.enabled = false;
799
824
  this.handle1.removeAttribute("tabindex");
800
825
  this.handle2.removeAttribute("tabindex");
801
826
  this._addClass(this.sliderElem, 'slider-disabled');
@@ -805,7 +830,7 @@
805
830
  },
806
831
 
807
832
  enable: function() {
808
- this.options.enabled = true;
833
+ this._state.enabled = true;
809
834
  this.handle1.setAttribute("tabindex", 0);
810
835
  this.handle2.setAttribute("tabindex", 0);
811
836
  this._removeClass(this.sliderElem, 'slider-disabled');
@@ -815,7 +840,7 @@
815
840
  },
816
841
 
817
842
  toggle: function() {
818
- if(this.options.enabled) {
843
+ if(this._state.enabled) {
819
844
  this.disable();
820
845
  } else {
821
846
  this.enable();
@@ -824,7 +849,7 @@
824
849
  },
825
850
 
826
851
  isEnabled: function() {
827
- return this.options.enabled;
852
+ return this._state.enabled;
828
853
  },
829
854
 
830
855
  on: function(evt, callback) {
@@ -832,6 +857,15 @@
832
857
  return this;
833
858
  },
834
859
 
860
+ off: function(evt, callback) {
861
+ if($) {
862
+ this.$element.off(evt, callback);
863
+ this.$sliderElem.off(evt, callback);
864
+ } else {
865
+ this._unbindNonQueryEventHandler(evt, callback);
866
+ }
867
+ },
868
+
835
869
  getAttribute: function(attribute) {
836
870
  if(attribute) {
837
871
  return this.options[attribute];
@@ -888,11 +922,22 @@
888
922
  this.sliderElem.removeEventListener("mousedown", this.mousedown, false);
889
923
  },
890
924
  _bindNonQueryEventHandler: function(evt, callback) {
891
- if(this.eventToCallbackMap[evt]===undefined) {
925
+ if(this.eventToCallbackMap[evt] === undefined) {
892
926
  this.eventToCallbackMap[evt] = [];
893
927
  }
894
928
  this.eventToCallbackMap[evt].push(callback);
895
929
  },
930
+ _unbindNonQueryEventHandler: function(evt, callback) {
931
+ var callbacks = this.eventToCallbackMap[evt];
932
+ if(callbacks !== undefined) {
933
+ for (var i = 0; i < callbacks.length; i++) {
934
+ if (callbacks[i] === callback) {
935
+ callbacks.splice(i, 1);
936
+ break;
937
+ }
938
+ }
939
+ }
940
+ },
896
941
  _cleanUpEventCallbacksMap: function() {
897
942
  var eventNames = Object.keys(this.eventToCallbackMap);
898
943
  for(var i = 0; i < eventNames.length; i++) {
@@ -902,28 +947,32 @@
902
947
  },
903
948
  _showTooltip: function() {
904
949
  if (this.options.tooltip_split === false ){
905
- this._addClass(this.tooltip, 'in');
906
- } else {
907
- this._addClass(this.tooltip_min, 'in');
908
- this._addClass(this.tooltip_max, 'in');
909
- }
910
- this.over = true;
950
+ this._addClass(this.tooltip, 'in');
951
+ this.tooltip_min.style.display = 'none';
952
+ this.tooltip_max.style.display = 'none';
953
+ } else {
954
+ this._addClass(this.tooltip_min, 'in');
955
+ this._addClass(this.tooltip_max, 'in');
956
+ this.tooltip.style.display = 'none';
957
+ }
958
+ this._state.over = true;
911
959
  },
912
960
  _hideTooltip: function() {
913
- if (this.inDrag === false && this.alwaysShowTooltip !== true) {
961
+ if (this._state.inDrag === false && this.alwaysShowTooltip !== true) {
914
962
  this._removeClass(this.tooltip, 'in');
915
963
  this._removeClass(this.tooltip_min, 'in');
916
964
  this._removeClass(this.tooltip_max, 'in');
917
965
  }
918
- this.over = false;
966
+ this._state.over = false;
919
967
  },
920
968
  _layout: function() {
921
969
  var positionPercentages;
922
970
 
923
971
  if(this.options.reversed) {
924
- positionPercentages = [ 100 - this.percentage[0], this.percentage[1] ];
925
- } else {
926
- positionPercentages = [ this.percentage[0], this.percentage[1] ];
972
+ positionPercentages = [ 100 - this._state.percentage[0], this.options.range ? 100 - this._state.percentage[1] : this._state.percentage[1]];
973
+ }
974
+ else {
975
+ positionPercentages = [ this._state.percentage[0], this._state.percentage[1] ];
927
976
  }
928
977
 
929
978
  this.handle1.style[this.stylePos] = positionPercentages[0]+'%';
@@ -936,7 +985,7 @@
936
985
 
937
986
  var styleSize = this.options.orientation === 'vertical' ? 'height' : 'width';
938
987
  var styleMargin = this.options.orientation === 'vertical' ? 'marginTop' : 'marginLeft';
939
- var labelSize = this.size / (this.options.ticks.length - 1);
988
+ var labelSize = this._state.size / (this.options.ticks.length - 1);
940
989
 
941
990
  if (this.tickLabelContainer) {
942
991
  var extraMargin = 0;
@@ -995,7 +1044,8 @@
995
1044
 
996
1045
  this.trackHigh.style.bottom = '0';
997
1046
  this.trackHigh.style.height = (100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1])) +'%';
998
- } else {
1047
+ }
1048
+ else {
999
1049
  this.trackLow.style.left = '0';
1000
1050
  this.trackLow.style.width = Math.min(positionPercentages[0], positionPercentages[1]) +'%';
1001
1051
 
@@ -1022,7 +1072,7 @@
1022
1072
  var formattedTooltipVal;
1023
1073
 
1024
1074
  if (this.options.range) {
1025
- formattedTooltipVal = this.options.formatter(this.options.value);
1075
+ formattedTooltipVal = this.options.formatter(this._state.value);
1026
1076
  this._setText(this.tooltipInner, formattedTooltipVal);
1027
1077
  this.tooltip.style[this.stylePos] = (positionPercentages[1] + positionPercentages[0])/2 + '%';
1028
1078
 
@@ -1038,10 +1088,10 @@
1038
1088
  this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px');
1039
1089
  }
1040
1090
 
1041
- var innerTooltipMinText = this.options.formatter(this.options.value[0]);
1091
+ var innerTooltipMinText = this.options.formatter(this._state.value[0]);
1042
1092
  this._setText(this.tooltipInner_min, innerTooltipMinText);
1043
1093
 
1044
- var innerTooltipMaxText = this.options.formatter(this.options.value[1]);
1094
+ var innerTooltipMaxText = this.options.formatter(this._state.value[1]);
1045
1095
  this._setText(this.tooltipInner_max, innerTooltipMaxText);
1046
1096
 
1047
1097
  this.tooltip_min.style[this.stylePos] = positionPercentages[0] + '%';
@@ -1060,7 +1110,7 @@
1060
1110
  this._css(this.tooltip_max, 'margin-left', -this.tooltip_max.offsetWidth / 2 + 'px');
1061
1111
  }
1062
1112
  } else {
1063
- formattedTooltipVal = this.options.formatter(this.options.value[0]);
1113
+ formattedTooltipVal = this.options.formatter(this._state.value[0]);
1064
1114
  this._setText(this.tooltipInner, formattedTooltipVal);
1065
1115
 
1066
1116
  this.tooltip.style[this.stylePos] = positionPercentages[0] + '%';
@@ -1079,24 +1129,24 @@
1079
1129
  }
1080
1130
  },
1081
1131
  _mousedown: function(ev) {
1082
- if(!this.options.enabled) {
1132
+ if(!this._state.enabled) {
1083
1133
  return false;
1084
1134
  }
1085
1135
 
1086
- this.offset = this._offset(this.sliderElem);
1087
- this.size = this.sliderElem[this.sizePos];
1136
+ this._state.offset = this._offset(this.sliderElem);
1137
+ this._state.size = this.sliderElem[this.sizePos];
1088
1138
 
1089
1139
  var percentage = this._getPercentage(ev);
1090
1140
 
1091
1141
  if (this.options.range) {
1092
- var diff1 = Math.abs(this.percentage[0] - percentage);
1093
- var diff2 = Math.abs(this.percentage[1] - percentage);
1094
- this.dragged = (diff1 < diff2) ? 0 : 1;
1142
+ var diff1 = Math.abs(this._state.percentage[0] - percentage);
1143
+ var diff2 = Math.abs(this._state.percentage[1] - percentage);
1144
+ this._state.dragged = (diff1 < diff2) ? 0 : 1;
1095
1145
  } else {
1096
- this.dragged = 0;
1146
+ this._state.dragged = 0;
1097
1147
  }
1098
1148
 
1099
- this.percentage[this.dragged] = this.options.reversed ? 100 - percentage : percentage;
1149
+ this._state.percentage[this._state.dragged] = percentage;
1100
1150
  this._layout();
1101
1151
 
1102
1152
  if (this.touchCapable) {
@@ -1123,7 +1173,7 @@
1123
1173
  document.addEventListener("mousemove", this.mousemove, false);
1124
1174
  document.addEventListener("mouseup", this.mouseup, false);
1125
1175
 
1126
- this.inDrag = true;
1176
+ this._state.inDrag = true;
1127
1177
  var newValue = this._calculateValue();
1128
1178
 
1129
1179
  this._trigger('slideStart', newValue);
@@ -1134,7 +1184,7 @@
1134
1184
  this._pauseEvent(ev);
1135
1185
 
1136
1186
  if (this.options.focus) {
1137
- this._triggerFocusOnHandle(this.dragged);
1187
+ this._triggerFocusOnHandle(this._state.dragged);
1138
1188
  }
1139
1189
 
1140
1190
  return true;
@@ -1148,7 +1198,7 @@
1148
1198
  }
1149
1199
  },
1150
1200
  _keydown: function(handleIdx, ev) {
1151
- if(!this.options.enabled) {
1201
+ if(!this._state.enabled) {
1152
1202
  return false;
1153
1203
  }
1154
1204
 
@@ -1177,18 +1227,18 @@
1177
1227
  }
1178
1228
  }
1179
1229
 
1180
- var val = this.options.value[handleIdx] + dir * this.options.step;
1230
+ var val = this._state.value[handleIdx] + dir * this.options.step;
1181
1231
  if (this.options.range) {
1182
- val = [ (!handleIdx) ? val : this.options.value[0],
1183
- ( handleIdx) ? val : this.options.value[1]];
1232
+ val = [ (!handleIdx) ? val : this._state.value[0],
1233
+ ( handleIdx) ? val : this._state.value[1]];
1184
1234
  }
1185
1235
 
1186
1236
  this._trigger('slideStart', val);
1187
1237
  this._setDataVal(val);
1188
1238
  this.setValue(val, true, true);
1189
1239
 
1190
- this._trigger('slideStop', val);
1191
1240
  this._setDataVal(val);
1241
+ this._trigger('slideStop', val);
1192
1242
  this._layout();
1193
1243
 
1194
1244
  this._pauseEvent(ev);
@@ -1206,13 +1256,13 @@
1206
1256
  ev.returnValue=false;
1207
1257
  },
1208
1258
  _mousemove: function(ev) {
1209
- if(!this.options.enabled) {
1259
+ if(!this._state.enabled) {
1210
1260
  return false;
1211
1261
  }
1212
1262
 
1213
1263
  var percentage = this._getPercentage(ev);
1214
1264
  this._adjustPercentageForRangeSliders(percentage);
1215
- this.percentage[this.dragged] = this.options.reversed ? 100 - percentage : percentage;
1265
+ this._state.percentage[this._state.dragged] = percentage;
1216
1266
  this._layout();
1217
1267
 
1218
1268
  var val = this._calculateValue(true);
@@ -1222,17 +1272,20 @@
1222
1272
  },
1223
1273
  _adjustPercentageForRangeSliders: function(percentage) {
1224
1274
  if (this.options.range) {
1225
- if (this.dragged === 0 && this.percentage[1] < percentage) {
1226
- this.percentage[0] = this.percentage[1];
1227
- this.dragged = 1;
1228
- } else if (this.dragged === 1 && this.percentage[0] > percentage) {
1229
- this.percentage[1] = this.percentage[0];
1230
- this.dragged = 0;
1275
+ var precision = this._getNumDigitsAfterDecimalPlace(percentage);
1276
+ precision = precision ? precision - 1 : 0;
1277
+ var percentageWithAdjustedPrecision = this._applyToFixedAndParseFloat(percentage, precision);
1278
+ if (this._state.dragged === 0 && this._applyToFixedAndParseFloat(this._state.percentage[1], precision) < percentageWithAdjustedPrecision) {
1279
+ this._state.percentage[0] = this._state.percentage[1];
1280
+ this._state.dragged = 1;
1281
+ } else if (this._state.dragged === 1 && this._applyToFixedAndParseFloat(this._state.percentage[0], precision) > percentageWithAdjustedPrecision) {
1282
+ this._state.percentage[1] = this._state.percentage[0];
1283
+ this._state.dragged = 0;
1231
1284
  }
1232
1285
  }
1233
1286
  },
1234
1287
  _mouseup: function() {
1235
- if(!this.options.enabled) {
1288
+ if(!this._state.enabled) {
1236
1289
  return false;
1237
1290
  }
1238
1291
  if (this.touchCapable) {
@@ -1244,15 +1297,15 @@
1244
1297
  document.removeEventListener("mousemove", this.mousemove, false);
1245
1298
  document.removeEventListener("mouseup", this.mouseup, false);
1246
1299
 
1247
- this.inDrag = false;
1248
- if (this.over === false) {
1300
+ this._state.inDrag = false;
1301
+ if (this._state.over === false) {
1249
1302
  this._hideTooltip();
1250
1303
  }
1251
1304
  var val = this._calculateValue(true);
1252
1305
 
1253
1306
  this._layout();
1254
- this._trigger('slideStop', val);
1255
1307
  this._setDataVal(val);
1308
+ this._trigger('slideStop', val);
1256
1309
 
1257
1310
  return false;
1258
1311
  },
@@ -1260,16 +1313,16 @@
1260
1313
  var val;
1261
1314
  if (this.options.range) {
1262
1315
  val = [this.options.min,this.options.max];
1263
- if (this.percentage[0] !== 0){
1264
- val[0] = this._toValue(this.percentage[0]);
1316
+ if (this._state.percentage[0] !== 0){
1317
+ val[0] = this._toValue(this._state.percentage[0]);
1265
1318
  val[0] = this._applyPrecision(val[0]);
1266
1319
  }
1267
- if (this.percentage[1] !== 100){
1268
- val[1] = this._toValue(this.percentage[1]);
1320
+ if (this._state.percentage[1] !== 100){
1321
+ val[1] = this._toValue(this._state.percentage[1]);
1269
1322
  val[1] = this._applyPrecision(val[1]);
1270
1323
  }
1271
1324
  } else {
1272
- val = this._toValue(this.percentage[0]);
1325
+ val = this._toValue(this._state.percentage[0]);
1273
1326
  val = parseFloat(val);
1274
1327
  val = this._applyPrecision(val);
1275
1328
  }
@@ -1312,11 +1365,14 @@
1312
1365
  }
1313
1366
 
1314
1367
  var eventPosition = ev[this.mousePos];
1315
- var sliderOffset = this.offset[this.stylePos];
1368
+ var sliderOffset = this._state.offset[this.stylePos];
1316
1369
  var distanceToSlide = eventPosition - sliderOffset;
1317
1370
  // Calculate what percent of the length the slider handle has slid
1318
- var percentage = (distanceToSlide / this.size) * 100;
1319
- percentage = Math.round(percentage / this.percentage[2]) * this.percentage[2];
1371
+ var percentage = (distanceToSlide / this._state.size) * 100;
1372
+ percentage = Math.round(percentage / this._state.percentage[2]) * this._state.percentage[2];
1373
+ if (this.options.reversed) {
1374
+ percentage = 100 - percentage;
1375
+ }
1320
1376
 
1321
1377
  // Make sure the percent is within the bounds of the slider.
1322
1378
  // 0% corresponds to the 'min' value of the slide
@@ -1343,7 +1399,7 @@
1343
1399
  var value = "value: '" + val + "'";
1344
1400
  this.element.setAttribute('data', value);
1345
1401
  this.element.setAttribute('value', val);
1346
- this.element.value = val;
1402
+ this.element.value = val;
1347
1403
  },
1348
1404
  _trigger: function(evt, val) {
1349
1405
  val = (val || val === 0) ? val : undefined;
@@ -1409,11 +1465,7 @@
1409
1465
  element.className = newClasses.trim();
1410
1466
  },
1411
1467
  _offsetLeft: function(obj){
1412
- var offsetLeft = obj.offsetLeft;
1413
- while((obj = obj.offsetParent) && !isNaN(obj.offsetLeft)){
1414
- offsetLeft += obj.offsetLeft;
1415
- }
1416
- return offsetLeft;
1468
+ return obj.getBoundingClientRect().left;
1417
1469
  },
1418
1470
  _offsetTop: function(obj){
1419
1471
  var offsetTop = obj.offsetTop;
@@ -1443,8 +1495,28 @@
1443
1495
  },
1444
1496
  _toPercentage: function(value) {
1445
1497
  return this.options.scale.toPercentage.apply(this, [value]);
1498
+ },
1499
+ _setTooltipPosition: function(){
1500
+ var tooltips = [this.tooltip, this.tooltip_min, this.tooltip_max];
1501
+ if (this.options.orientation === 'vertical'){
1502
+ var tooltipPos = this.options.tooltip_position || 'right';
1503
+ var oppositeSide = (tooltipPos === 'left') ? 'right' : 'left';
1504
+ tooltips.forEach(function(tooltip){
1505
+ this._addClass(tooltip, tooltipPos);
1506
+ tooltip.style[oppositeSide] = '100%';
1507
+ }.bind(this));
1508
+ } else if(this.options.tooltip_position === 'bottom') {
1509
+ tooltips.forEach(function(tooltip){
1510
+ this._addClass(tooltip, 'bottom');
1511
+ tooltip.style.top = 22 + 'px';
1512
+ }.bind(this));
1513
+ } else {
1514
+ tooltips.forEach(function(tooltip){
1515
+ this._addClass(tooltip, 'top');
1516
+ tooltip.style.top = -this.tooltip.outerHeight - 14 + 'px';
1517
+ }.bind(this));
1518
+ }
1446
1519
  }
1447
-
1448
1520
  };
1449
1521
 
1450
1522
  /*********************************
@@ -1,5 +1,5 @@
1
1
  /*! =======================================================
2
- VERSION 4.8.1
2
+ VERSION 4.14.5
3
3
  ========================================================= */
4
4
  /*! =========================================================
5
5
  * bootstrap-slider.js
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap-slider-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.8.1
4
+ version: 4.14.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedr Browne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-03 00:00:00.000000000 Z
11
+ date: 2015-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties