bootstrap-slider-rails 4.8.1 → 4.14.5

Sign up to get free protection for your applications and to get access to all the features.
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