{"version":3,"sources":["stepper.js"],"names":["$","fn","stepper","options","timeout","debounce","func","wait","immediate","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","is_touch_device","document","createEvent","e","findDecimals","num","split","length","getValue","val","bindEvents","spinner","closest","events","_this","find","on","type","attr","increase","call","decrease","data","setInterval","settings","mouseup","clearInterval","current","parseFloat","decimals","step","newValue","toFixed","currentValue","updateValue","max","min","focus","triggerChange","trigger","each","extend","is","undefined","parseInt","init","jQuery"],"mappings":"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","file":"stepper.js","sourcesContent":["/*jshint esversion: 6 */\r\n(function ($) {\r\n\r\n \"use strict\";\r\n\r\n\r\n $.fn.stepper = function (options) {\r\n\r\n let timeout;\r\n\r\n /**\r\n * Debounce\r\n *\r\n * @returns {Function}\r\n * @param func\r\n * @param wait\r\n * @param immediate\r\n *\r\n * Source: https://davidwalsh.name/javascript-debounce-function\r\n */\r\n const debounce = function (func, wait, immediate) {\r\n let timeout;\r\n return function () {\r\n let context = this, args = arguments;\r\n let later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n let callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n };\r\n\r\n /**\r\n * Check if its a touch base device\r\n *\r\n * @returns {boolean}\r\n */\r\n const is_touch_device = function() {\r\n try {\r\n document.createEvent(\"TouchEvent\");\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Find the amount of decimals in a number\r\n *\r\n * @param num\r\n * @returns {Number}\r\n *\r\n * Source: http://stackoverflow.com/a/10454534\r\n */\r\n const findDecimals = function (num) {\r\n return (num.split('.')[1] || []).length;\r\n };\r\n\r\n /**\r\n * Get current value\r\n *\r\n * @returns {number}\r\n */\r\n const getValue = function () {\r\n return $(this).val() === '' ? 0 : $(this).val();\r\n };\r\n\r\n /**\r\n * bindEvents\r\n */\r\n const bindEvents = function () {\r\n const spinner = $(this).closest('.js-spinner');\r\n const events = is_touch_device() ? 'touchstart' : 'mousedown';\r\n var _this = this;\r\n\r\n spinner.find('[spinner-button]')\r\n .on(events, function () {\r\n const type = $(this).attr('spinner-button');\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n })\r\n .on('mousedown', function () {\r\n const type = $(this).attr('spinner-button');\r\n $(this).data('timer', setTimeout(() => {\r\n timeout = setInterval(() => {\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n }, 60);\r\n }, _this.settings.debounce));\r\n })\r\n .on('mouseup', function () {\r\n clearTimeout($(this).data('timer'));\r\n });\r\n\r\n $(document).mouseup(function () {\r\n clearInterval(timeout);\r\n });\r\n };\r\n\r\n /**\r\n * Increase\r\n */\r\n $.fn.stepper.increase = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current + parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Decrease\r\n */\r\n $.fn.stepper.decrease = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current - parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Update stepper element\r\n * @param newValue\r\n * @param currentValue\r\n */\r\n const updateValue = function (newValue, currentValue) {\r\n if ((newValue <= this.settings.max || typeof this.settings.max === \"undefined\") && (newValue >= this.settings.min || typeof this.settings.min === \"undefined\")) {\r\n if(!is_touch_device()){\r\n $(this).val(newValue).focus();\r\n }else{\r\n $(this).val(newValue);\r\n }\r\n triggerChange.call(this);\r\n }else if(currentValue > this.settings.max){\r\n $(this).val(this.settings.max);\r\n }else if(currentValue < this.settings.min){\r\n $(this).val(this.settings.min);\r\n }\r\n };\r\n\r\n /**\r\n * Trigger change event on number field for third party hooks\r\n *\r\n * @type {Function}\r\n */\r\n const triggerChange = debounce(function () {\r\n $(this).trigger('change');\r\n }, 400);\r\n\r\n /**\r\n * Loop every instance\r\n */\r\n return this.each(function () {\r\n\r\n /**\r\n * Default settings merged with user settings\r\n * Can be set trough data attributes or as parameter.\r\n * @type {*}\r\n */\r\n this.settings = $.extend({\r\n step: $(this).is('[step]') ? $(this).attr('step') : '1',\r\n min: $(this).is('[min]') ? parseFloat($(this).attr('min')) : undefined,\r\n max: $(this).is('[max]') ? parseFloat($(this).attr('max')) : undefined,\r\n debounce: $(this).is('[data-stepper-debounce]') ? parseInt($(this).attr('data-stepper-debounce')) : 400,\r\n }, options);\r\n\r\n\r\n this.init = () => {\r\n // Store settings\r\n $(this).data('settings', this.settings);\r\n\r\n // Bind events\r\n bindEvents.call(this);\r\n };\r\n\r\n // Init\r\n this.init();\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Auto load\r\n */\r\n $('input[type=\"number\"]').stepper();\r\n\r\n}(jQuery));"]}