PageSourceSearch

https://www.redfunnel.co.uk/themes/custom/redfunnel/assets/js/touchspin.js?tltf0s

js redfunnel.co.uk collected 2026-09-24 18:17:23 UTC 28,074 bytes, 686 lines download raw bytes

vendor: 1,627 bytes, lines 1-48
1"use strict";
2
3function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4/*
5 *  Bootstrap Touchspin - v4.7.3
6 *  A mobile and touch friendly input spinner component for Bootstrap 3 & 4.
7 *  https://www.virtuosoft.eu/code/bootstrap-touchspin/
8 *
9 *  Made by István Ujj-Mészáros
10 *  Under MIT License
11 */
12(function (factory) {
13  if (typeof define === 'function' && define.amd) {
14    define(['jquery'], factory);
15  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) === 'object' && module.exports) {
16    module.exports = function (root, jQuery) {
17      if (jQuery === undefined) {
18        if (typeof window !== 'undefined') {
19          jQuery = require('jquery');
20        } else {
21          jQuery = require('jquery')(root);
22        }
23      }
24      factory(jQuery);
25      return jQuery;
26    };
27  } else {
28    factory(jQuery);
29  }
30})(function ($) {
31  'use strict';
32
33  var _currentSpinnerId = 0;
34  $.fn.TouchSpin = function (options) {
35    var defaults = {
36      min: 0,
37      // If null, there is no minimum enforced
38      max: 100,
39      // If null, there is no maximum enforced
40      initval: '',
41      replacementval: '',
42      firstclickvalueifempty: null,
43      step: 1,
44      decimals: 0,
45      stepinterval: 100,
46      forcestepdivisibility: 'round',
47      // none | floor | round | ceil
48      stepintervaldelay: 500,
49      verticalbuttons: false,
50      verticalup: '+',
51      verticaldown: '−',
52      verticalupclass: '',
53      verticaldownclass: '',
54      prefix: '',
55      postfix: '',
56      prefix_extraclass: '',
57      postfix_extraclass: '',
58      booster: true,
59      boostat: 10,
60      maxboostedstep: false,
61      mousewheel: true,
62      buttondown_class: 'btn btn-primary',
63      buttonup_class: 'btn btn-primary',
64      buttondown_txt: '−',
65      buttonup_txt: '+',
66      callback_before_calculation: function callback_before_calculation(value) {
67        return value;
68      },
69      callback_after_calculation: function callback_after_calculation(value) {
70        return value;
71      }
72    };
73    var attributeMap = {
74      min: 'min',
75      max: 'max',
76      initval: 'init-val',
77      replacementval: 'replacement-val',
78      firstclickvalueifempty: 'first-click-value-if-empty',
79      step: 'step',
80      decimals: 'decimals',
81      stepinterval: 'step-interval',
82      verticalbuttons: 'vertical-buttons',
83      verticalupclass: 'vertical-up-class',
84      verticaldownclass: 'vertical-down-class',
85      forcestepdivisibility: 'force-step-divisibility',
86      stepintervaldelay: 'step-interval-delay',
87      prefix: 'prefix',
88      postfix: 'postfix',
89      prefix_extraclass: 'prefix-extra-class',
90      postfix_extraclass: 'postfix-extra-class',
91      booster: 'booster',
92      boostat: 'boostat',
93      maxboostedstep: 'max-boosted-step',
94      mousewheel: 'mouse-wheel',
95      buttondown_class: 'button-down-class',
96      buttonup_class: 'button-up-class',
97      buttondown_txt: 'button-down-txt',
98      buttonup_txt: 'button-up-txt'
99    };
100    return this.each(function () {
101      var settings,
102        originalinput = $(this),
103        originalinput_data = originalinput.data(),
104        _detached_prefix,
105        _detached_postfix,
106        container,
107        elements,
108        verticalbuttons_html,
109        value,
110        downSpinTimer,
111        upSpinTimer,
112        downDelayTimeout,
113        upDelayTimeout,
114        spincount = 0,
115        spinning = false;
116      init();
117      function init() {
118        if (originalinput.data('alreadyinitialized')) {
119          return;
120        }
121        originalinput.data('alreadyinitialized', true);
122        _currentSpinnerId += 1;
123        originalinput.data('spinnerid', _currentSpinnerId);
124        if (!originalinput.is('input')) {
125          console.log('Must be an input.');
126          return;
127        }
128        _initSettings();
129        _setInitval();
130        _checkValue();
131        _buildHtml();
132        _initElements();
133        _updateButtonDisabledState();
134        _hideEmptyPrefixPostfix();
135        _setupMutationObservers();
136        _bindEvents();
137        _bindEventsInterface();
138      }
139      function _setInitval() {
140        if (settings.initval !== '' && originalinput.val() === '') {
141          originalinput.val(settings.initval);
142        }
143      }
144      function changeSettings(newsettings) {
145        _updateSettings(newsettings);
146        _checkValue();
147        var value = elements.input.val();
148        if (value !== '') {
149          value = parseFloat(settings.callback_before_calculation(elements.input.val()));
150          elements.input.val(settings.callback_after_calculation(parseFloat(value).toFixed(settings.decimals)));
151        }
152      }
153      function _initSettings() {
154        settings = $.extend({}, defaults, originalinput_data, _parseAttributes(), options);
155        if (parseFloat(settings.step) !== 1) {
156          var remainder;
157
158          // Modify settings.max to be divisible by step
159          remainder = settings.max % settings.step;
160          if (remainder !== 0) {
161            settings.max = parseFloat(settings.max) - remainder;
162          }
163
164          // Do the same with min, should work with negative numbers too
165          remainder = settings.min % settings.step;
166          if (remainder !== 0) {
167            settings.min = parseFloat(settings.min) + (parseFloat(settings.step) - remainder);
168          }
169        }
170      }
171      function _parseAttributes() {
172        var data = {};
173
174        // Setting up based on data attributes
175        $.each(attributeMap, function (key, value) {
176          var attrName = 'bts-' + value + '';
177          if (originalinput.is('[data-' + attrName + ']')) {
178            data[key] = originalinput.data(attrName);
179          }
180        });
181
182        // Setting up based on input attributes if specified (input attributes have precedence)
183        $.each(['min', 'max', 'step'], function (i, key) {
184          if (originalinput.is('[' + key + ']')) {
185            if (data[key] !== undefined) {
186              console.warn('Both the "data-bts-' + key + '" data attribute and the "' + key + '" individual attribute were specified, the individual attribute will take precedence on: ', originalinput);
187            }
188            data[key] = originalinput.attr(key);
189          }
190        });
191        return data;
192      }
193      function _destroy() {
194        var $parent = originalinput.parent();
195        stopSpin();
196        originalinput.off('.touchspin');
197        if ($parent.hasClass('bootstrap-touchspin-injected')) {
198          originalinput.siblings().remove();
199          originalinput.unwrap();
200        } else {
201          $('.bootstrap-touchspin-injected', $parent).remove();
202          $parent.removeClass('bootstrap-touchspin');
203        }
204        originalinput.data('alreadyinitialized', false);
205      }
206      function _updateSettings(newsettings) {
207        settings = $.extend({}, settings, newsettings);
208
209        // Update postfix and prefix texts if those settings were changed.
210        if (newsettings.postfix) {
211          var $postfix = originalinput.parent().find('.bootstrap-touchspin-postfix');
212          if ($postfix.length === 0) {
213            _detached_postfix.insertAfter(originalinput);
214          }
215          originalinput.parent().find('.bootstrap-touchspin-postfix .input-group-text').text(newsettings.postfix);
216        }
217        if (newsettings.prefix) {
218          var $prefix = originalinput.parent().find('.bootstrap-touchspin-prefix');
219          if ($prefix.length === 0) {
220            _detached_prefix.insertBefore(originalinput);
221          }
222          originalinput.parent().find('.bootstrap-touchspin-prefix .input-group-text').text(newsettings.prefix);
223        }
224        _hideEmptyPrefixPostfix();
225      }
226      function _buildHtml() {
227        var initval = originalinput.val(),
228          parentelement = originalinput.parent();
229        if (initval !== '') {
230          // initval may not be parsable as a number (callback_after_calculation() may decorate it so it cant be parsed).  Use the callbacks if provided.
231          initval = settings.callback_before_calculation(initval);
232          initval = settings.callback_after_calculation(parseFloat(initval).toFixed(settings.decimals));
233        }
234        originalinput.data('initvalue', initval).val(initval);
235        originalinput.addClass('form-control');
236        verticalbuttons_html = "\n          <span class=\"input-group-addon bootstrap-touchspin-vertical-button-wrapper\">\n            <span class=\"input-group-btn-vertical\">\n              <button tabindex=\"-1\" class=\"".concat(settings.buttondown_class, " bootstrap-touchspin-up ").concat(settings.verticalupclass, "\" type=\"button\">").concat(settings.verticalup, "</button>\n              <button tabindex=\"-1\" class=\"").concat(settings.buttonup_class, " bootstrap-touchspin-down ").concat(settings.verticaldownclass, "\" type=\"button\">").concat(settings.verticaldown, "</button>\n            </span>\n          </span>\n       ");
237        if (parentelement.hasClass('input-group')) {
238          _advanceInputGroup(parentelement);
239        } else {
240          _buildInputGroup();
241        }
242      }
243      function _advanceInputGroup(parentelement) {
244        parentelement.addClass('bootstrap-touchspin');
245        var prev = originalinput.prev(),
246          next = originalinput.next();
247        var downhtml,
248          uphtml,
249          prefixhtml = "\n            <span class=\"input-group-addon input-group-prepend bootstrap-touchspin-prefix input-group-prepend bootstrap-touchspin-injected\">\n              <span class=\"input-group-text\">".concat(settings.prefix, "</span>\n            </span>\n          "),
250          postfixhtml = "\n            <span class=\"input-group-addon input-group-append bootstrap-touchspin-postfix input-group-append bootstrap-touchspin-injected\">\n              <span class=\"input-group-text\">".concat(settings.postfix, "</span>\n            </span>\n          ");
251        if (settings.verticalbuttons) {
252          $(verticalbuttons_html).insertAfter(originalinput);
253        } else {
254          if (prev.hasClass('input-group-btn') || prev.hasClass('input-group-prepend')) {
255            downhtml = "\n              <button tabindex=\"-1\" class=\"".concat(settings.buttondown_class, " bootstrap-touchspin-down bootstrap-touchspin-injected\" type=\"button\">").concat(settings.buttondown_txt, "</button>\n            ");
256            prev.append(downhtml);
257          } else {
258            downhtml = "\n              <span class=\"input-group-btn input-group-prepend bootstrap-touchspin-injected\">\n                <button tabindex=\"-1\" class=\"".concat(settings.buttondown_class, " bootstrap-touchspin-down\" type=\"button\">").concat(settings.buttondown_txt, "</button>\n              </span>\n            ");
259            $(downhtml).insertBefore(originalinput);
260          }
261          if (next.hasClass('input-group-btn') || next.hasClass('input-group-append')) {
262            uphtml = "\n            <button tabindex=\"-1\" class=\"".concat(settings.buttonup_class, " bootstrap-touchspin-up bootstrap-touchspin-injected\" type=\"button\">").concat(settings.buttonup_txt, "</button>\n          ");
263            next.prepend(uphtml);
264          } else {
265            uphtml = "\n            <span class=\"input-group-btn input-group-append bootstrap-touchspin-injected\">\n              <button tabindex=\"-1\" class=\"".concat(settings.buttonup_class, " bootstrap-touchspin-up\" type=\"button\">").concat(settings.buttonup_txt, "</button>\n            </span>\n          ");
266            $(uphtml).insertAfter(originalinput);
267          }
268        }
269        $(prefixhtml).insertBefore(originalinput);
270        $(postfixhtml).insertAfter(originalinput);
271        container = parentelement;
272      }
273      function _buildInputGroup() {
274        var html;
275        var inputGroupSize = '';
276        if (originalinput.hasClass('input-sm') || originalinput.hasClass('form-control-sm')) {
277          inputGroupSize = 'input-group-sm';
278        } else if (originalinput.hasClass('input-lg') || originalinput.hasClass('form-control-lg')) {
279          inputGroupSize = 'input-group-lg';
280        }
281        if (settings.verticalbuttons) {
282          html = "\n            <div class=\"input-group ".concat(inputGroupSize, " bootstrap-touchspin bootstrap-touchspin-injected\">\n              <span class=\"input-group-addon input-group-prepend bootstrap-touchspin-prefix\">
282\n                <span class=\"input-group-text\">").concat(settings.prefix, "</span>\n              </span>\n              <span class=\"input-group-addon bootstrap-touchspin-postfix input-group-append\">\n                <span class=\"input-group-text\">").concat(settings.postfix, "</span>\n              </span>\n              ").concat(verticalbuttons_html, "\n            </div>\n          ");
283        } else {
284          html = "\n            <div class=\"input-group bootstrap-touchspin bootstrap-touchspin-injected\">\n              <span class=\"input-group-btn input-group-prepend\">\n                <button tabindex=\"-1\" class=\"".concat(settings.buttondown_class, " bootstrap-touchspin-down\" type=\"button\">").concat(settings.buttondown_txt, "</button>\n              </span>\n              <span class=\"input-group-addon bootstrap-touchspin-prefix input-group-prepend\">\n                <span class=\"input-group-text\">").concat(settings.prefix, "</span>\n              </span>\n              <span class=\"input-group-addon bootstrap-touchspin-postfix input-group-append\">\n                <span class=\"input-group-text\">").concat(settings.postfix, "</span>\n              </span>\n              <span class=\"input-group-btn input-group-append\">\n                <button tabindex=\"-1\" class=\"").concat(settings.buttonup_class, " bootstrap-touchspin-up\" type=\"button\">").concat(settings.buttonup_txt, "</button>\n              </span>\n            </div>");
285        }
286        container = $(html).insertBefore(originalinput);
287        $('.bootstrap-touchspin-prefix', container).after(originalinput);
288        if (originalinput.hasClass('input-sm') || originalinput.hasClass('form-control-sm')) {
289          container.addClass('input-group-sm');
290        } else if (originalinput.hasClass('input-lg') || originalinput.hasClass('form-control-lg')) {
291          container.addClass('input-group-lg');
292        }
293      }
294      function _initElements() {
295        elements = {
296          down: $('.bootstrap-touchspin-down', container),
297          up: $('.bootstrap-touchspin-up', container),
298          input: $('input', container),
299          prefix: $('.bootstrap-touchspin-prefix', container).addClass(settings.prefix_extraclass),
300          postfix: $('.bootstrap-touchspin-postfix', container).addClass(settings.postfix_extraclass)
301        };
302      }
303      function _hideEmptyPrefixPostfix() {
304        if (settings.prefix === '') {
305          _detached_prefix = elements.prefix.detach();
306        }
307        if (settings.postfix === '') {
308          _detached_postfix = elements.postfix.detach();
309        }
310      }
311      function _bindEvents() {
312        originalinput.on('keydown.touchspin', function (ev) {
313          var code = ev.keyCode || ev.which;
314          if (code === 38) {
315            if (spinning !== 'up') {
316              upOnce();
317              startUpSpin();
318            }
319            ev.preventDefault();
320          } else if (code === 40) {
321            if (spinning !== 'down') {
322              downOnce();
323              startDownSpin();
324            }
325            ev.preventDefault();
326          } else if (code === 9 || code === 13) {
327            _checkValue();
328          }
329        });
330        originalinput.on('keyup.touchspin', function (ev) {
331          var code = ev.keyCode || ev.which;
332          if (code === 38) {
333            stopSpin();
334          } else if (code === 40) {
335            stopSpin();
336          }
337        });
338
339        // change is fired before blur, so we need to work around that
340        $(document).on('mousedown touchstart', function (event) {
341          if ($(event.target).is(originalinput)) {
342            return;
343          }
344          _checkValue();
345        });
346        originalinput.on('blur.touchspin', function () {
347          _checkValue();
348        });
349        elements.down.on('keydown', function (ev) {
350          var code = ev.keyCode || ev.which;
351          if (code === 32 || code === 13) {
352            if (spinning !== 'down') {
353              downOnce();
354              startDownSpin();
355            }
356            ev.preventDefault();
357          }
358        });
359        elements.down.on('keyup.touchspin', function (ev) {
360          var code = ev.keyCode || ev.which;
361          if (code === 32 || code === 13) {
362            stopSpin();
363          }
364        });
365        elements.up.on('keydown.touchspin', function (ev) {
366          var code = ev.keyCode || ev.which;
367          if (code === 32 || code === 13) {
368            if (spinning !== 'up') {
369              upOnce();
370              startUpSpin();
371            }
372            ev.preventDefault();
373          }
374        });
375        elements.up.on('keyup.touchspin', function (ev) {
376          var code = ev.keyCode || ev.which;
377          if (code === 32 || code === 13) {
378            stopSpin();
379          }
380        });
381        elements.down.on('mousedown.touchspin', function (ev) {
382          elements.down.off('touchstart.touchspin'); // android 4 workaround
383
384          if (originalinput.is(':disabled,[readonly]')) {
385            return;
386          }
387          downOnce();
388          startDownSpin();
389          ev.preventDefault();
390          ev.stopPropagation();
391        });
392        elements.down.on('touchstart.touchspin', function (ev) {
393          elements.down.off('mousedown.touchspin'); // android 4 workaround
394
395          if (originalinput.is(':disabled,[readonly]')) {
396            return;
397          }
398          downOnce();
399          startDownSpin();
400          ev.preventDefault();
401          ev.stopPropagation();
402        });
403        elements.up.on('mousedown.touchspin', function (ev) {
404          elements.up.off('touchstart.touchspin'); // android 4 workaround
405
406          if (originalinput.is(':disabled,[readonly]')) {
407            return;
408          }
409          upOnce();
410          startUpSpin();
411          ev.preventDefault();
412          ev.stopPropagation();
413        });
414        elements.up.on('touchstart.touchspin', function (ev) {
415          elements.up.off('mousedown.touchspin'); // android 4 workaround
416
417          if (originalinput.is(':disabled,[readonly]')) {
418            return;
419          }
420          upOnce();
421          startUpSpin();
422          ev.preventDefault();
423          ev.stopPropagation();
424        });
425        elements.up.on('mouseup.touchspin mouseout.touchspin touchleave.touchspin touchend.touchspin touchcancel.touchspin', function (ev) {
426          if (!spinning) {
427            return;
428          }
429          ev.stopPropagation();
430          stopSpin();
431        });
432        elements.down.on('mouseup.touchspin mouseout.touchspin touchleave.touchspin touchend.touchspin touchcancel.touchspin', function (ev) {
433          if (!spinning) {
434            return;
435          }
436          ev.stopPropagation();
437          stopSpin();
438        });
439        elements.down.on('mousemove.touchspin touchmove.touchspin', function (ev) {
440          if (!spinning) {
441            return;
442          }
443          ev.stopPropagation();
444          ev.preventDefault();
445        });
446        elements.up.on('mousemove.touchspin touchmove.touchspin', function (ev) {
447          if (!spinning) {
448            return;
449          }
450          ev.stopPropagation();
451          ev.preventDefault();
452        });
453        originalinput.on('mousewheel.touchspin DOMMouseScroll.touchspin', function (ev) {
454          if (!settings.mousewheel || !originalinput.is(':focus')) {
455            return;
456          }
457          var delta = ev.originalEvent.wheelDelta || -ev.originalEvent.deltaY || -ev.originalEvent.detail;
458          ev.stopPropagation();
459          ev.preventDefault();
460          if (delta < 0) {
461            downOnce();
462          } else {
463            upOnce();
464          }
465        });
466      }
467      function _bindEventsInterface() {
468        originalinput.on('touchspin.destroy', function () {
469          _destroy();
470        });
471        originalinput.on('touchspin.uponce', function () {
472          stopSpin();
473          upOnce();
474        });
475        originalinput.on('touchspin.downonce', function () {
476          stopSpin();
477          downOnce();
478        });
479        originalinput.on('touchspin.startupspin', function () {
480          startUpSpin();
481        });
482        originalinput.on('touchspin.startdownspin', function () {
483          startDownSpin();
484        });
485        originalinput.on('touchspin.stopspin', function () {
486          stopSpin();
487        });
488        originalinput.on('touchspin.updatesettings', function (e, newsettings) {
489          changeSettings(newsettings);
490        });
491      }
492      function _setupMutationObservers() {
493        if (typeof MutationObserver !== 'undefined') {
494          // MutationObserver is available
495          var observer = new MutationObserver(function (mutations) {
496            mutations.forEach(function (mutation) {
497              if (mutation.type === 'attributes' && (mutation.attributeName === 'disabled' || mutation.attributeName === 'readonly')) {
498                _updateButtonDisabledState();
499              }
500            });
501          });
502          observer.observe(originalinput[0], {
503            attributes: true
504          });
505        }
506      }
507      function _forcestepdivisibility(value) {
508        switch (settings.forcestepdivisibility) {
509          case 'round':
510            return (Math.round(value / settings.step) * settings.step).toFixed(settings.decimals);
511          case 'floor':
512            return (Math.floor(value / settings.step) * settings.step).toFixed(settings.decimals);
513          case 'ceil':
514            return (Math.ceil(value / settings.step) * settings.step).toFixed(settings.decimals);
515          default:
516            return value.toFixed(settings.decimals);
517        }
518      }
519      function _checkValue() {
520        var val, parsedval, returnval;
521        val = settings.callback_before_calculation(originalinput.val());
522        if (val === '') {
523          if (settings.replacementval !== '') {
524            originalinput.val(settings.replacementval);
525            originalinput.trigger('change');
526          }
527          return;
528        }
529        if (settings.decimals > 0 && val === '.') {
530          return;
531        }
532        parsedval = parseFloat(val);
533        if (isNaN(parsedval)) {
534          if (settings.replacementval !== '') {
535            parsedval = settings.replacementval;
536          } else {
537            parsedval = 0;
538          }
539        }
540        returnval = parsedval;
541        if (parsedval.toString() !== val) {
542          returnval = parsedval;
543        }
544        returnval = _forcestepdivisibility(parsedval);
545        if (settings.min !== null && parsedval < settings.min) {
546          returnval = settings.min;
547        }
548        if (settings.max !== null && parsedval > settings.max) {
549          returnval = settings.max;
550        }
551        if (parseFloat(parsedval).toString() !== parseFloat(returnval).toString()) {
552          originalinput.val(returnval);
553        }
554        originalinput.val(settings.callback_after_calculation(parseFloat(returnval).toFixed(settings.decimals)));
555      }
556      function _getBoostedStep() {
557        if (!settings.booster) {
558          return settings.step;
559        } else {
560          var boosted = Math.pow(2, Math.floor(spincount / settings.boostat)) * settings.step;
561          if (settings.maxboostedstep) {
562            if (boosted > settings.maxboostedstep) {
563              boosted = settings.maxboostedstep;
564              value = Math.round(value / boosted) * boosted;
565            }
566          }
567          return Math.max(settings.step, boosted);
568        }
569      }
570      function valueIfIsNaN() {
571        if (typeof settings.firstclickvalueifempty === 'number') {
572          return settings.firstclickvalueifempty;
573        } else {
574          return (settings.min + settings.max) / 2;
575        }
576      }
577      function _updateButtonDisabledState() {
578        var isDisabled = originalinput.is(':disabled,[readonly]');
579        elements.up.prop('disabled', isDisabled);
580        elements.down.prop('disabled', isDisabled);
581        if (isDisabled) {
582          stopSpin();
583        }
584      }
585      function upOnce() {
586        if (originalinput.is(':disabled,[readonly]')) {
587          return;
588        }
589        _checkValue();
590        value = parseFloat(settings.callback_before_calculation(elements.input.val()));
591        var initvalue = value;
592        var boostedstep;
593        if (isNaN(value)) {
594          value = valueIfIsNaN();
595        } else {
596          boostedstep = _getBoostedStep();
597          value = value + boostedstep;
598        }
599        if (settings.max !== null && value >= settings.max) {
600          value = settings.max;
601          originalinput.trigger('touchspin.on.max');
602          stopSpin();
603        }
604        elements.input.val(settings.callback_after_calculation(parseFloat(value).toFixed(settings.decimals)));
605        if (initvalue !== value) {
606          originalinput.trigger('change');
607        }
608      }
609      function downOnce() {
610        if (originalinput.is(':disabled,[readonly]')) {
611          return;
612        }
613        _checkValue();
614        value = parseFloat(settings.callback_before_calculation(elements.input.val()));
615        var initvalue = value;
616        var boostedstep;
617        if (isNaN(value)) {
618          value = valueIfIsNaN();
619        } else {
620          boostedstep = _getBoostedStep();
621          value = value - boostedstep;
622        }
623        if (settings.min !== null && value <= settings.min) {
624          value = settings.min;
625          originalinput.trigger('touchspin.on.min');
626          stopSpin();
627        }
628        elements.input.val(settings.callback_after_calculation(parseFloat(value).toFixed(settings.decimals)));
629        if (initvalue !== value) {
630          originalinput.trigger('change');
631        }
632      }
633      function startDownSpin() {
634        if (originalinput.is(':disabled,[readonly]')) {
635          return;
636        }
637        stopSpin();
638        spincount = 0;
639        spinning = 'down';
640        originalinput.trigger('touchspin.on.startspin');
641        originalinput.trigger('touchspin.on.startdownspin');
642        downDelayTimeout = setTimeout(function () {
643          downSpinTimer = setInterval(function () {
644            spincount++;
645            downOnce();
646          }, settings.stepinterval);
647        }, settings.stepintervaldelay);
648      }
649      function startUpSpin() {
650        if (originalinput.is(':disabled,[readonly]')) {
651          return;
652        }
653        stopSpin();
654        spincount = 0;
655        spinning = 'up';
656        originalinput.trigger('touchspin.on.startspin');
657        originalinput.trigger('touchspin.on.startupspin');
658        upDelayTimeout = setTimeout(function () {
659          upSpinTimer = setInterval(function () {
660            spincount++;
661            upOnce();
662          }, settings.stepinterval);
663        }, settings.stepintervaldelay);
664      }
665      function stopSpin() {
666        clearTimeout(downDelayTimeout);
667        clearTimeout(upDelayTimeout);
668        clearInterval(downSpinTimer);
669        clearInterval(upSpinTimer);
670        switch (spinning) {
671          case 'up':
672            originalinput.trigger('touchspin.on.stopupspin');
673            originalinput.trigger('touchspin.on.stopspin');
674            break;
675          case 'down':
676            originalinput.trigger('touchspin.on.stopdownspin');
677            originalinput.trigger('touchspin.on.stopspin');
678            break;
679        }
680        spincount = 0;
681        spinning = false;
682      }
683    });
684  };
685});
686//# sourceMappingURL=jquery.bootstrap-touchspin.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.