|
32 | 32 | methodInvoked = typeof query === 'string',
|
33 | 33 | queryArguments = [].slice.call(arguments, 1),
|
34 | 34 |
|
35 |
| - alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], |
36 |
| - |
37 | 35 | SINGLE_STEP = 1,
|
38 | 36 | BIG_STEP = 2,
|
39 | 37 | NO_STEP = 0,
|
|
82 | 80 | position,
|
83 | 81 | secondPos,
|
84 | 82 | offset,
|
85 |
| - precision, |
86 | 83 | gapRatio = 1,
|
87 | 84 | previousValue,
|
88 | 85 |
|
|
125 | 122 | clearInterval(instance.interval);
|
126 | 123 | module.unbind.events();
|
127 | 124 | module.unbind.slidingEvents();
|
| 125 | + delete module.cache; |
128 | 126 | $module.removeData(moduleNamespace);
|
129 | 127 | instance = undefined;
|
130 | 128 | },
|
|
141 | 139 | + '<div class="thumb"></div>'
|
142 | 140 | + '</div>');
|
143 | 141 | }
|
144 |
| - precision = module.get.precision(); |
| 142 | + module.clear.cache(); |
145 | 143 | $thumb = $module.find('.thumb:not(.second)');
|
146 | 144 | if (settings.showThumbTooltip) {
|
147 | 145 | $thumb
|
|
175 | 173 | module.setup.autoLabel();
|
176 | 174 | }
|
177 | 175 |
|
| 176 | + if (settings.highlightRange) { |
| 177 | + $labels.addClass(className.active); |
| 178 | + } |
| 179 | + |
178 | 180 | if (settings.showLabelTicks) {
|
179 | 181 | $module.addClass(className.ticked);
|
| 182 | + } else if ($module.hasClass(className.ticked)) { |
| 183 | + settings.showLabelTicks = 'always'; |
180 | 184 | }
|
181 | 185 | }
|
182 | 186 | },
|
|
211 | 215 | } else {
|
212 | 216 | $labels = $module.append('<ul class="auto labels"></ul>').find('.labels');
|
213 | 217 | }
|
214 |
| - for (var i = 0, len = module.get.numLabels(); i <= len; i++) { |
| 218 | + var step = module.get.step(), |
| 219 | + precision = module.get.precision(), |
| 220 | + len = module.get.numLabels(), |
| 221 | + ignoreLabels = len - (settings.autoAdjustLabels !== 'fixed' ? 0 : module.get.max().toString().length + 4) |
| 222 | + ; |
| 223 | + for (var i = 0; i <= len; i++) { |
215 | 224 | var
|
216 |
| - labelText = module.get.label(i), |
| 225 | + stepValue = Math.round(((i * (step === 0 ? 1 : step)) + module.get.min()) * precision) / precision, |
| 226 | + labelText = module.get.label(i, stepValue), |
217 | 227 | showLabel = settings.restrictedLabels.length === 0 || settings.restrictedLabels.indexOf(labelText) >= 0,
|
218 | 228 | $label = labelText !== '' && (showLabel || settings.showLabelTicks === 'always')
|
219 |
| - ? (!(i % module.get.gapRatio()) |
220 |
| - ? $('<li class="label">' + (showLabel ? labelText : '') + '</li>') |
221 |
| - : $('<li class="halftick label"></li>')) |
| 229 | + ? ((!(i % module.get.gapRatio()) && i < ignoreLabels) || i === len |
| 230 | + ? $('<li/>', { class: className.label, 'data-value': stepValue, html: showLabel ? labelText : '' }) |
| 231 | + : $('<li/>', { class: 'halftick label', 'data-value': stepValue })) |
222 | 232 | : null,
|
223 | 233 | ratio = i / len
|
224 | 234 | ;
|
|
489 | 499 | },
|
490 | 500 | },
|
491 | 501 |
|
| 502 | + clear: { |
| 503 | + cache: function () { |
| 504 | + module.cache = {}; |
| 505 | + }, |
| 506 | + }, |
| 507 | + |
492 | 508 | resync: function () {
|
493 | 509 | module.verbose('Resyncing thumb position based on value');
|
494 | 510 | if (module.is.range()) {
|
|
538 | 554 | },
|
539 | 555 |
|
540 | 556 | is: {
|
| 557 | + prime: function (n) { |
| 558 | + if (module.cache['prime' + n] === undefined) { |
| 559 | + var p = true; |
| 560 | + for (var i = 2, s = Math.sqrt(n); i <= s; i++) { |
| 561 | + if (n % i === 0) { |
| 562 | + p = false; |
| 563 | + |
| 564 | + break; |
| 565 | + } |
| 566 | + } |
| 567 | + if (p) { |
| 568 | + p = n > 1; |
| 569 | + } |
| 570 | + |
| 571 | + module.cache['prime' + n] = p; |
| 572 | + } |
| 573 | + |
| 574 | + return module.cache['prime' + n]; |
| 575 | + }, |
541 | 576 | range: function () {
|
542 | 577 | var isRange = $module.hasClass(className.range);
|
543 | 578 | if (!isRange && (settings.minRange || settings.maxRange)) {
|
|
652 | 687 | return margin || '0px';
|
653 | 688 | },
|
654 | 689 | precision: function () {
|
655 |
| - var |
656 |
| - decimalPlaces, |
657 |
| - step = module.get.step() |
658 |
| - ; |
659 |
| - if (step !== 0) { |
660 |
| - var split = String(step).split('.'); |
661 |
| - decimalPlaces = split.length === 2 ? split[1].length : 0; |
662 |
| - } else { |
663 |
| - decimalPlaces = settings.decimalPlaces; |
| 690 | + if (module.cache.precision === undefined) { |
| 691 | + var |
| 692 | + decimalPlaces, |
| 693 | + step = module.get.step() |
| 694 | + ; |
| 695 | + if (step !== 0) { |
| 696 | + var split = String(step).split('.'); |
| 697 | + decimalPlaces = split.length === 2 ? split[1].length : 0; |
| 698 | + } else { |
| 699 | + decimalPlaces = settings.decimalPlaces; |
| 700 | + } |
| 701 | + var precision = Math.pow(10, decimalPlaces); |
| 702 | + module.debug('Precision determined', precision); |
| 703 | + module.cache.precision = precision; |
664 | 704 | }
|
665 |
| - var precision = Math.pow(10, decimalPlaces); |
666 |
| - module.debug('Precision determined', precision); |
667 | 705 |
|
668 |
| - return precision; |
| 706 | + return module.cache.precision; |
669 | 707 | },
|
670 | 708 | min: function () {
|
671 | 709 | return settings.min;
|
672 | 710 | },
|
673 | 711 | max: function () {
|
674 |
| - var |
675 |
| - step = module.get.step(), |
676 |
| - min = module.get.min(), |
677 |
| - precision = module.get.precision(), |
678 |
| - quotient = step === 0 ? 0 : Math.floor(Math.round(((settings.max - min) / step) * precision) / precision), |
679 |
| - remainder = step === 0 ? 0 : (settings.max - min) % step |
680 |
| - ; |
| 712 | + if (module.cache.max === undefined) { |
| 713 | + var |
| 714 | + step = module.get.step(), |
| 715 | + min = module.get.min(), |
| 716 | + precision = module.get.precision(), |
| 717 | + quotient = step === 0 ? 0 : Math.floor(Math.round(((settings.max - min) / step) * precision) / precision), |
| 718 | + remainder = step === 0 ? 0 : (settings.max - min) % step |
| 719 | + ; |
| 720 | + if (remainder > 0) { |
| 721 | + module.debug('Max value not divisible by given step. Increasing max value.', settings.max, step); |
| 722 | + } |
| 723 | + module.cache.max = remainder === 0 ? settings.max : min + quotient * step; |
| 724 | + } |
681 | 725 |
|
682 |
| - return remainder === 0 ? settings.max : min + quotient * step; |
| 726 | + return module.cache.max; |
683 | 727 | },
|
684 | 728 | step: function () {
|
685 | 729 | return settings.step;
|
686 | 730 | },
|
687 | 731 | numLabels: function () {
|
688 |
| - var step = module.get.step(), |
689 |
| - precision = module.get.precision(), |
690 |
| - value = Math.round(((module.get.max() - module.get.min()) / (step === 0 ? 1 : step)) * precision) / precision; |
691 |
| - module.debug('Determined that there should be ' + value + ' labels'); |
| 732 | + if (module.cache.numLabels === undefined) { |
| 733 | + var step = module.get.step(), |
| 734 | + precision = module.get.precision(), |
| 735 | + value = Math.round(((module.get.max() - module.get.min()) / (step === 0 ? 1 : step)) * precision) / precision; |
| 736 | + module.debug('Determined that there should be ' + value + ' labels'); |
| 737 | + module.cache.numLabels = value; |
| 738 | + } |
692 | 739 |
|
693 |
| - return value; |
| 740 | + return module.cache.numLabels; |
694 | 741 | },
|
695 | 742 | labelType: function () {
|
696 | 743 | return settings.labelType;
|
697 | 744 | },
|
698 |
| - label: function (value) { |
699 |
| - if (interpretLabel) { |
700 |
| - return interpretLabel(value); |
| 745 | + label: function (value, stepValue) { |
| 746 | + if (isFunction(interpretLabel)) { |
| 747 | + return interpretLabel(value, stepValue, module); |
701 | 748 | }
|
702 | 749 |
|
703 | 750 | switch (settings.labelType) {
|
704 | 751 | case settings.labelTypes.number: {
|
705 |
| - var step = module.get.step(); |
706 |
| - |
707 |
| - return Math.round(((value * (step === 0 ? 1 : step)) + module.get.min()) * precision) / precision; |
| 752 | + return stepValue; |
708 | 753 | }
|
709 | 754 | case settings.labelTypes.letter: {
|
710 |
| - return alphabet[value % 26]; |
| 755 | + if (value < 0 || module.get.precision() > 1) { |
| 756 | + module.error(error.invalidLetterNumber, value); |
| 757 | + |
| 758 | + return value; |
| 759 | + } |
| 760 | + var letterLabel = '', |
| 761 | + letters = Array.isArray(settings.letters) ? settings.letters : String(settings.letters).split(''), |
| 762 | + lettersLen = letters.length |
| 763 | + ; |
| 764 | + |
| 765 | + while (stepValue >= 0) { |
| 766 | + letterLabel = letters[stepValue % lettersLen] + letterLabel; |
| 767 | + stepValue = Math.floor(stepValue / lettersLen) - 1; |
| 768 | + } |
| 769 | + |
| 770 | + return letterLabel; |
711 | 771 | }
|
712 | 772 | default: {
|
713 | 773 | return value;
|
|
717 | 777 | value: function () {
|
718 | 778 | return value;
|
719 | 779 | },
|
| 780 | + settings: function () { |
| 781 | + return settings; |
| 782 | + }, |
720 | 783 | currentThumbValue: function () {
|
721 | 784 | return $currThumb !== undefined && $currThumb.hasClass('second') ? module.secondThumbVal : module.thumbVal;
|
722 | 785 | },
|
|
761 | 824 | if (settings.autoAdjustLabels) {
|
762 | 825 | var
|
763 | 826 | numLabels = module.get.numLabels(),
|
| 827 | + primePlus = module.is.prime(numLabels) ? 1 : 0, |
764 | 828 | trackLength = module.get.trackLength(),
|
765 | 829 | gapCounter = 1
|
766 | 830 | ;
|
|
770 | 834 | // and apply only if the modulo of the operation is an odd number.
|
771 | 835 | if (trackLength > 0) {
|
772 | 836 | while ((trackLength / numLabels) * gapCounter < settings.labelDistance) {
|
773 |
| - if (!(numLabels % gapCounter)) { |
| 837 | + if (!((numLabels + primePlus) % gapCounter) || settings.autoAdjustLabels === 'fixed') { |
774 | 838 | gapRatio = gapCounter;
|
775 | 839 | }
|
776 | 840 | gapCounter += 1;
|
|
908 | 972 | },
|
909 | 973 | value: function (position) {
|
910 | 974 | var
|
| 975 | + precision = module.get.precision(), |
911 | 976 | startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(),
|
912 | 977 | endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(),
|
913 | 978 | ratio = (position - startPos) / (endPos - startPos),
|
|
976 | 1041 | },
|
977 | 1042 |
|
978 | 1043 | set: {
|
| 1044 | + active: function (thumbVal, secondThumbVal) { |
| 1045 | + if (settings.highlightRange) { |
| 1046 | + if (secondThumbVal < thumbVal) { |
| 1047 | + var tempVal = secondThumbVal; |
| 1048 | + secondThumbVal = thumbVal; |
| 1049 | + thumbVal = tempVal; |
| 1050 | + } |
| 1051 | + var $children = $labels.find('.label'); |
| 1052 | + $children.each(function (index) { |
| 1053 | + var |
| 1054 | + $child = $(this), |
| 1055 | + attrValue = $child.attr('data-value') |
| 1056 | + ; |
| 1057 | + if (attrValue) { |
| 1058 | + attrValue = parseInt(attrValue, 10); |
| 1059 | + if (attrValue >= thumbVal && attrValue <= secondThumbVal) { |
| 1060 | + $child.addClass(className.active); |
| 1061 | + } else { |
| 1062 | + $child.removeClass(className.active); |
| 1063 | + } |
| 1064 | + } |
| 1065 | + }); |
| 1066 | + } |
| 1067 | + }, |
979 | 1068 | value: function (newValue, fireChange) {
|
980 | 1069 | fireChange = fireChange !== false;
|
981 | 1070 | var toReset = previousValue === undefined;
|
|
1103 | 1192 | position = newPos;
|
1104 | 1193 | thumbVal = newValue;
|
1105 | 1194 | }
|
| 1195 | + module.set.active(thumbVal, secondThumbVal); |
1106 | 1196 | var
|
1107 | 1197 | trackPosValue,
|
1108 | 1198 | thumbPosValue,
|
|
1210 | 1300 | } else {
|
1211 | 1301 | return settings[name];
|
1212 | 1302 | }
|
| 1303 | + module.clear.cache(); |
1213 | 1304 | },
|
1214 | 1305 | internal: function (name, value) {
|
1215 | 1306 | if ($.isPlainObject(name)) {
|
|
1382 | 1473 | method: 'The method you called is not defined.',
|
1383 | 1474 | notrange: 'This slider is not a range slider',
|
1384 | 1475 | invalidRanges: 'Invalid range settings (start/end/minRange/maxRange)',
|
| 1476 | + invalidLetterNumber: 'Negative values or decimal places for labelType: "letter" are not supported', |
1385 | 1477 | },
|
1386 | 1478 |
|
1387 | 1479 | metadata: {
|
|
1404 | 1496 | preventCrossover: true,
|
1405 | 1497 | fireOnInit: false,
|
1406 | 1498 | interpretLabel: false,
|
| 1499 | + letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', |
1407 | 1500 |
|
1408 | 1501 | // the decimal place to round to if step is undefined
|
1409 | 1502 | decimalPlaces: 2,
|
|
1421 | 1514 | vertical: 'vertical',
|
1422 | 1515 | range: 'range',
|
1423 | 1516 | smooth: 'smooth',
|
| 1517 | + label: 'label', |
| 1518 | + active: 'active', |
1424 | 1519 | },
|
1425 | 1520 |
|
1426 | 1521 | keys: {
|
|
1433 | 1528 | },
|
1434 | 1529 |
|
1435 | 1530 | restrictedLabels: [],
|
| 1531 | + highlightRange: false, |
1436 | 1532 | showThumbTooltip: false,
|
1437 | 1533 | tooltipConfig: {
|
1438 | 1534 | position: 'top center',
|
|
0 commit comments