(function (factory){ if (typeof define === "function" && define.amd) { define(["jquery", "./core", "./widget", "./button"] , factory); } else { factory(jQuery); } } (function ($){ function spinner_modifier(fn){ return function (){ var previous = this.element.val(); fn.apply(this, arguments); this._refresh(); if (previous !== this.element.val()) { this._trigger("change"); } } ; } return $.widget("ui.spinner", { version: "@VERSION", defaultElement: "", widgetEventPrefix: "spin", options: { culture: null , icons: { down: "ui-icon-triangle-1-s", up: "ui-icon-triangle-1-n"} , incremental: true , max: null , min: null , numberFormat: null , page: 10, step: 1, change: null , spin: null , start: null , stop: null } , _create: function (){ this._setOption("max", this.options.max); this._setOption("min", this.options.min); this._setOption("step", this.options.step); if (this.value() !== "") { this._value(this.element.val(), true ); } this._draw(); this._on(this._events); this._refresh(); this._on(this.window, { beforeunload: function (){ this.element.removeAttr("autocomplete"); } } ); } , _getCreateOptions: function (){ var options = { } , element = this.element; $.each(["min", "max", "step"] , function (i, option){ var value = element.attr(option); if (value !== undefined && _AN_Read_length("length", value)) { options[option] = value; } } ); return options; } , _events: { keydown: function (event){ if (this._start(event) && this._keydown(event)) { event.preventDefault(); } } , keyup: "_stop", focus: function (){ this.previous = this.element.val(); } , blur: function (event){ if (this.cancelBlur) { delete this.cancelBlur; return ; } this._stop(); this._refresh(); if (this.previous !== this.element.val()) { this._trigger("change", event); } } , mousewheel: function (event, delta){ if (!delta) { return ; } if (!this.spinning && !this._start(event)) { return false ; } this._spin((delta > 0? 1: -1) * this.options.step, event); clearTimeout(this.mousewheelTimer); this.mousewheelTimer = this._delay(function (){ if (this.spinning) { this._stop(event); } } , 100); event.preventDefault(); } , "mousedown .ui-spinner-button": function (event){ var previous; previous = this.element[0] === this.document[0].activeElement? this.previous: this.element.val(); function checkFocus(){ var isActive = this.element[0] === this.document[0].activeElement; if (!isActive) { this.element.focus(); this.previous = previous; this._delay(function (){ this.previous = previous; } ); } } event.preventDefault(); checkFocus.call(this); this.cancelBlur = true ; this._delay(function (){ delete this.cancelBlur; checkFocus.call(this); } ); if (this._start(event) === false ) { return ; } this._repeat(null , $(event.currentTarget).hasClass("ui-spinner-up")? 1: -1, event); } , "mouseup .ui-spinner-button": "_stop", "mouseenter .ui-spinner-button": function (event){ if (!$(event.currentTarget).hasClass("ui-state-active")) { return ; } if (this._start(event) === false ) { return false ; } this._repeat(null , $(event.currentTarget).hasClass("ui-spinner-up")? 1: -1, event); } , "mouseleave .ui-spinner-button": "_stop"} , _draw: function (){ var uiSpinner = this.uiSpinner = this.element.addClass("ui-spinner-input").attr("autocomplete", "off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml()); this.element.attr("role", "spinbutton"); this.buttons = uiSpinner.find(".ui-spinner-button").attr("tabIndex", -1).button().removeClass("ui-corner-all"); if (this.buttons.height() > Math.ceil(uiSpinner.height() * 0.5) && uiSpinner.height() > 0) { uiSpinner.height(uiSpinner.height()); } if (this.options.disabled) { this.disable(); } } , _keydown: function (event){ var options = this.options, keyCode = $.ui.keyCode; switch (event.keyCode){ case keyCode.UP: this._repeat(null , 1, event); return true ; case keyCode.DOWN: this._repeat(null , -1, event); return true ; case keyCode.PAGE_UP: this._repeat(null , options.page, event); return true ; case keyCode.PAGE_DOWN: this._repeat(null , - options.page, event); return true ; } return false ; } , _uiSpinnerHtml: function (){ return ""; } , _buttonHtml: function (){ return "" + "" + "" + "" + "" + "" + ""; } , _start: function (event){ if (!this.spinning && this._trigger("start", event) === false ) { return false ; } if (!this.counter) { this.counter = 1; } this.spinning = true ; return true ; } , _repeat: function (i, steps, event){ i = i || 500; clearTimeout(this.timer); this.timer = this._delay(function (){ this._repeat(40, steps, event); } , i); this._spin(steps * this.options.step, event); } , _spin: function (step, event){ var value = this.value() || 0; if (!this.counter) { this.counter = 1; } value = this._adjustValue(value + step * this._increment(this.counter)); if (!this.spinning || this._trigger("spin", event, { value: value} ) !== false ) { this._value(value); this.counter++ ; } } , _increment: function (i){ var incremental = this.options.incremental; if (incremental) { return $.isFunction(incremental)? incremental(i): Math.floor(i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1); } return 1; } , _precision: function (){ var precision = this._precisionOf(this.options.step); if (this.options.min !== null ) { precision = Math.max(precision, this._precisionOf(this.options.min)); } return precision; } , _precisionOf: function (num){ var str = num.toString(), decimal = str.indexOf("."); return decimal === -1? 0: _AN_Read_length("length", str) - decimal - 1; } , _adjustValue: function (value){ var base, aboveMin, options = this.options; base = options.min !== null ? options.min: 0; aboveMin = value - base; aboveMin = Math.round(aboveMin / options.step) * options.step; value = base + aboveMin; value = parseFloat(value.toFixed(this._precision())); if (options.max !== null && value > options.max) { return options.max; } if (options.min !== null && value < options.min) { return options.min; } return value; } , _stop: function (event){ if (!this.spinning) { return ; } clearTimeout(this.timer); clearTimeout(this.mousewheelTimer); this.counter = 0; this.spinning = false ; this._trigger("stop", event); } , _setOption: function (key, value){ if (key === "culture" || key === "numberFormat") { var prevValue = this._parse(this.element.val()); this.options[key] = value; this.element.val(this._format(prevValue)); return ; } if (key === "max" || key === "min" || key === "step") { if (typeof value === "string") { value = this._parse(value); } } if (key === "icons") { this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(value.up); this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(value.down); } this._super(key, value); if (key === "disabled") { this.widget().toggleClass("ui-state-disabled", !!value); this.element.prop("disabled", !!value); this.buttons.button(value? "disable": "enable"); } } , _setOptions: spinner_modifier(function (options){ this._super(options); this._value(this.element.val()); } ), _parse: function (val){ if (typeof val === "string" && val !== "") { val = window.Globalize && this.options.numberFormat? Globalize.parseFloat(val, 10, this.options.culture): + val; } return val === "" || isNaN(val)? null : val; } , _format: function (value){ if (value === "") { return ""; } return window.Globalize && this.options.numberFormat? Globalize.format(value, this.options.numberFormat, this.options.culture): value; } , _refresh: function (){ this.element.attr({ "aria-valuemin": this.options.min, "aria-valuemax": this.options.max, "aria-valuenow": this._parse(this.element.val())} ); } , isValid: function (){ var value = this.value(); if (value === null ) { return false ; } return value === this._adjustValue(value); } , _value: function (value, allowAny){ var parsed; if (value !== "") { parsed = this._parse(value); if (parsed !== null ) { if (!allowAny) { parsed = this._adjustValue(parsed); } value = this._format(parsed); } } this.element.val(value); this._refresh(); } , _destroy: function (){ this.element.removeClass("ui-spinner-input").prop("disabled", false ).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); this.uiSpinner.replaceWith(this.element); } , stepUp: spinner_modifier(function (steps){ this._stepUp(steps); } ), _stepUp: function (steps){ if (this._start()) { this._spin((steps || 1) * this.options.step); this._stop(); } } , stepDown: spinner_modifier(function (steps){ this._stepDown(steps); } ), _stepDown: function (steps){ if (this._start()) { this._spin((steps || 1) * - this.options.step); this._stop(); } } , pageUp: spinner_modifier(function (pages){ this._stepUp((pages || 1) * this.options.page); } ), pageDown: spinner_modifier(function (pages){ this._stepDown((pages || 1) * this.options.page); } ), value: function (newVal){ if (!_AN_Read_length("length", arguments)) { return this._parse(this.element.val()); } spinner_modifier(this._value).call(this, newVal); } , widget: function (){ return this.uiSpinner; } } ); } ));