jquery.bootstrap-touchspin.min.js
8.93 KB
/* A mobile and touch friendly input spinner component for Bootstrap 3. It supports the mousewheel and the up/down keys. */
/* http://www.virtuosoft.eu/code/bootstrap-touchspin/ */
(function(e){"use strict";function n(e,t){return e+".touchspin_"+t}function r(t,r){return e.map(t,function(e){return n(e,r)})}var t=0;e.fn.TouchSpin=function(n){if(n==="destroy"){this.each(function(){var t=e(this),n=t.data();e(document).off(r(["mouseup","touchend","touchcancel","mousemove","touchmove","scroll","scrollstart"],n.spinnerid).join(" "))});return}var i={min:0,max:100,initval:"",step:1,decimals:0,stepinterval:100,forcestepdivisibility:"round",stepintervaldelay:500,verticalbuttons:false,verticalupclass:"fa fa-angle-up",verticaldownclass:"fa fa-angle-down",prefix:"",postfix:"",prefix_extraclass:"",postfix_extraclass:"",booster:true,boostat:10,maxboostedstep:false,mousewheel:true,buttondown_class:"btn btn-default",buttonup_class:"btn btn-default"};var s={min:"min",max:"max",initval:"init-val",step:"step",decimals:"decimals",stepinterval:"step-interval",verticalbuttons:"vertical-buttons",verticalupclass:"vertical-up-class",verticaldownclass:"vertical-down-class",forcestepdivisibility:"force-step-divisibility",stepintervaldelay:"step-interval-delay",prefix:"prefix",postfix:"postfix",prefix_extraclass:"prefix-extra-class",postfix_extraclass:"postfix-extra-class",booster:"booster",boostat:"boostat",maxboostedstep:"max-boosted-step",mousewheel:"mouse-wheel",buttondown_class:"button-down-class",buttonup_class:"button-up-class"};return this.each(function(){function y(){if(u.data("alreadyinitialized")){return}u.data("alreadyinitialized",true);t+=1;u.data("spinnerid",t);if(!u.is("input")){console.log("Must be an input.");return}E();b();_();T();k();L();A();O();l.input.css("display","block")}function b(){if(o.initval!==""&&u.val()===""){u.val(o.initval)}}function w(e){x(e);_();var t=l.input.val();if(t!==""){t=Number(l.input.val());l.input.val(t.toFixed(o.decimals))}}function E(){o=e.extend({},i,a,S(),n)}function S(){var t={};e.each(s,function(e,n){var r="bts-"+n+"";if(u.is("[data-"+r+"]")){t[e]=u.data(r)}});return t}function x(t){o=e.extend({},o,t)}function T(){var e=u.val(),t=u.parent();if(e!==""){e=Number(e).toFixed(o.decimals)}u.data("initvalue",e).val(e);u.addClass("form-control");if(t.hasClass("input-group")){N(t)}else{C()}}function N(t){t.addClass("bootstrap-touchspin");var n=u.prev(),r=u.next();var i,s,a='<span class="input-group-addon bootstrap-touchspin-prefix">'+o.prefix+"</span>",l='<span class="input-group-addon bootstrap-touchspin-postfix">'+o.postfix+"</span>";if(n.hasClass("input-group-btn")){i='<button class="'+o.buttondown_class+' bootstrap-touchspin-down" type="button">-</button>';n.append(i)}else{i='<span class="input-group-btn"><button class="'+o.buttondown_class+' bootstrap-touchspin-down" type="button">-</button></span>';e(i).insertBefore(u)}if(r.hasClass("input-group-btn")){s='<button class="'+o.buttonup_class+' bootstrap-touchspin-up" type="button">+</button>';r.prepend(s)}else{s='<span class="input-group-btn"><button class="'+o.buttonup_class+' bootstrap-touchspin-up" type="button">+</button></span>';e(s).insertAfter(u)}e(a).insertBefore(u);e(l).insertAfter(u);f=t}function C(){var t;if(o.verticalbuttons){t='<div class="input-group bootstrap-touchspin"><span class="input-group-addon bootstrap-touchspin-prefix">'+o.prefix+'</span><span class="input-group-addon bootstrap-touchspin-postfix">'+o.postfix+'</span><span class="input-group-btn-vertical"><button class="'+o.buttondown_class+' bootstrap-touchspin-up" type="button"><i class="'+o.verticalupclass+'"></i></button><button class="'+o.buttonup_class+' bootstrap-touchspin-down" type="button"><i class="'+o.verticaldownclass+'"></i></button></span></div>'}else{t='<div class="input-group bootstrap-touchspin"><span class="input-group-btn"><button class="'+o.buttondown_class+' bootstrap-touchspin-down" type="button">-</button></span><span class="input-group-addon bootstrap-touchspin-prefix">'+o.prefix+'</span><span class="input-group-addon bootstrap-touchspin-postfix">'+o.postfix+'</span><span class="input-group-btn"><button class="'+o.buttonup_class+' bootstrap-touchspin-up" type="button">+</button></span></div>'}f=e(t).insertBefore(u);e(".bootstrap-touchspin-prefix",f).after(u);if(u.hasClass("input-sm")){f.addClass("input-group-sm")}else if(u.hasClass("input-lg")){f.addClass("input-group-lg")}}function k(){l={down:e(".bootstrap-touchspin-down",f),up:e(".bootstrap-touchspin-up",f),input:e("input",f),prefix:e(".bootstrap-touchspin-prefix",f).addClass(o.prefix_extraclass),postfix:e(".bootstrap-touchspin-postfix",f).addClass(o.postfix_extraclass)}}function L(){if(o.prefix===""){l.prefix.hide()}if(o.postfix===""){l.postfix.hide()}}function A(){u.on("keydown",function(e){var t=e.keyCode||e.which;if(t===38){if(g!=="up"){P();j()}e.preventDefault()}else if(t===40){if(g!=="down"){H();B()}e.preventDefault()}});u.on("keyup",function(e){var t=e.keyCode||e.which;if(t===38){F()}else if(t===40){F()}});u.on("blur",function(){_()});l.down.on("keydown",function(e){var t=e.keyCode||e.which;if(t===32||t===13){if(g!=="down"){H();B()}e.preventDefault()}});l.down.on("keyup",function(e){var t=e.keyCode||e.which;if(t===32||t===13){F()}});l.up.on("keydown",function(e){var t=e.keyCode||e.which;if(t===32||t===13){if(g!=="up"){P();j()}e.preventDefault()}});l.up.on("keyup",function(e){var t=e.keyCode||e.which;if(t===32||t===13){F()}});l.down.on("mousedown.touchspin",function(e){l.down.off("touchstart.touchspin");if(u.is(":disabled")){return}H();B();e.preventDefault();e.stopPropagation()});l.down.on("touchstart.touchspin",function(e){l.down.off("mousedown.touchspin");if(u.is(":disabled")){return}H();B();e.preventDefault();e.stopPropagation()});l.up.on("mousedown.touchspin",function(e){l.up.off("touchstart.touchspin");if(u.is(":disabled")){return}P();j();e.preventDefault();e.stopPropagation()});l.up.on("touchstart.touchspin",function(e){l.up.off("mousedown.touchspin");if(u.is(":disabled")){return}P();j();e.preventDefault();e.stopPropagation()});l.up.on("mouseout touchleave touchend touchcancel",function(e){if(!g){return}e.stopPropagation();F()});l.down.on("mouseout touchleave touchend touchcancel",function(e){if(!g){return}e.stopPropagation();F()});l.down.on("mousemove touchmove",function(e){if(!g){return}e.stopPropagation();e.preventDefault()});l.up.on("mousemove touchmove",function(e){if(!g){return}e.stopPropagation();e.preventDefault()});e(document).on(r(["mouseup","touchend","touchcancel"],t).join(" "),function(e){if(!g){return}e.preventDefault();F()});e(document).on(r(["mousemove","touchmove","scroll","scrollstart"],t).join(" "),function(e){if(!g){return}e.preventDefault();F()});u.on("mousewheel DOMMouseScroll",function(e){if(!o.mousewheel||!u.is(":focus")){return}var t=e.originalEvent.wheelDelta||-e.originalEvent.deltaY||-e.originalEvent.detail;e.stopPropagation();e.preventDefault();if(t<0){H()}else{P()}})}function O(){u.on("touchspin.uponce",function(){F();P()});u.on("touchspin.downonce",function(){F();H()});u.on("touchspin.startupspin",function(){j()});u.on("touchspin.startdownspin",function(){B()});u.on("touchspin.stopspin",function(){F()});u.on("touchspin.updatesettings",function(e,t){w(t)})}function M(e){switch(o.forcestepdivisibility){case"round":return(Math.round(e/o.step)*o.step).toFixed(o.decimals);case"floor":return(Math.floor(e/o.step)*o.step).toFixed(o.decimals);case"ceil":return(Math.ceil(e/o.step)*o.step).toFixed(o.decimals);default:return e}}function _(){var e,t,n;e=u.val();if(e===""){return}if(o.decimals>0&&e==="."){return}t=parseFloat(e);if(isNaN(t)){t=0}n=t;if(t.toString()!==e){n=t}if(t<o.min){n=o.min}if(t>o.max){n=o.max}n=M(n);if(Number(e).toString()!==n.toString()){u.val(n);u.trigger("change")}}function D(){if(!o.booster){return o.step}else{var e=Math.pow(2,Math.floor(m/o.boostat))*o.step;if(o.maxboostedstep){if(e>o.maxboostedstep){e=o.maxboostedstep;c=Math.round(c/e)*e}}return Math.max(o.step,e)}}function P(){_();c=parseFloat(l.input.val());if(isNaN(c)){c=0}var e=c,t=D();c=c+t;if(c>o.max){c=o.max;u.trigger("touchspin.on.max");F()}l.input.val(Number(c).toFixed(o.decimals));if(e!==c){u.trigger("change")}}function H(){_();c=parseFloat(l.input.val());if(isNaN(c)){c=0}var e=c,t=D();c=c-t;if(c<o.min){c=o.min;u.trigger("touchspin.on.min");F()}l.input.val(c.toFixed(o.decimals));if(e!==c){u.trigger("change")}}function B(){F();m=0;g="down";u.trigger("touchspin.on.startspin");u.trigger("touchspin.on.startdownspin");d=setTimeout(function(){h=setInterval(function(){m++;H()},o.stepinterval)},o.stepintervaldelay)}function j(){F();m=0;g="up";u.trigger("touchspin.on.startspin");u.trigger("touchspin.on.startupspin");v=setTimeout(function(){p=setInterval(function(){m++;P()},o.stepinterval)},o.stepintervaldelay)}function F(){clearTimeout(d);clearTimeout(v);clearInterval(h);clearInterval(p);switch(g){case"up":u.trigger("touchspin.on.stopupspin");u.trigger("touchspin.on.stopspin");break;case"down":u.trigger("touchspin.on.stopdownspin");u.trigger("touchspin.on.stopspin");break}m=0;g=false}var o,u=e(this),a=u.data(),f,l,c,h,p,d,v,m=0,g=false;y()})}})(jQuery)