/** * Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui) * Copyright 2016 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function (f, define) { define('kendo.numerictextbox', [ 'kendo.core', 'kendo.userevents' ], f); }(function () { var __meta__ = { id: 'numerictextbox', name: 'NumericTextBox', category: 'web', description: 'The NumericTextBox widget can format and display numeric, percentage or currency textbox.', depends: [ 'core', 'userevents' ] }; (function ($, undefined) { var kendo = window.kendo, caret = kendo.caret, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, parse = kendo.parseFloat, placeholderSupported = kendo.support.placeholder, getCulture = kendo.getCulture, round = kendo._round, CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', INPUT = 'k-input', SPIN = 'spin', ns = '.kendoNumericTextBox', TOUCHEND = 'touchend', MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = 'mouseenter' + ns + ' ' + MOUSELEAVE, DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', FOCUS = 'focus', POINT = '.', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', ARIA_READONLY = 'aria-readonly', INTEGER_REGEXP = /^(-)?(\d*)$/, NULL = null, proxy = $.proxy, extend = $.extend; var NumericTextBox = Widget.extend({ init: function (element, options) { var that = this, isStep = options && options.step !== undefined, min, max, step, value, disabled; Widget.fn.init.call(that, element, options); options = that.options; element = that.element.on('focusout' + ns, proxy(that._focusout, that)).attr('role', 'spinbutton'); options.placeholder = options.placeholder || element.attr('placeholder'); that._initialOptions = extend({}, options); that._reset(); that._wrapper(); that._arrows(); that._input(); if (!kendo.support.mobileOS) { that._text.on(FOCUS + ns, proxy(that._click, that)); } else { that._text.on(TOUCHEND + ns + ' ' + FOCUS + ns, function () { that._toggleText(false); element.focus(); }); } min = that.min(element.attr('min')); max = that.max(element.attr('max')); step = that._parse(element.attr('step')); if (options.min === NULL && min !== NULL) { options.min = min; } if (options.max === NULL && max !== NULL) { options.max = max; } if (!isStep && step !== NULL) { options.step = step; } element.attr('aria-valuemin', options.min).attr('aria-valuemax', options.max); options.format = extractFormat(options.format); value = options.value; that.value(value !== NULL ? value : element.val()); disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled'); if (disabled) { that.enable(false); } else { that.readonly(element.is('[readonly]')); } kendo.notify(that); }, options: { name: 'NumericTextBox', decimals: NULL, min: NULL, max: NULL, value: NULL, step: 1, culture: '', format: 'n', spinners: true, placeholder: '', upArrowText: 'Increase value', downArrowText: 'Decrease value' }, events: [ CHANGE, SPIN ], _editable: function (options) { var that = this, element = that.element, disable = options.disable, readonly = options.readonly, text = that._text.add(element), wrapper = that._inputWrapper.off(HOVEREVENTS); that._toggleText(true); that._upArrowEventHandler.unbind('press'); that._downArrowEventHandler.unbind('press'); element.off('keydown' + ns).off('keypress' + ns).off('paste' + ns); if (!readonly && !disable) { wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover); text.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).attr(ARIA_READONLY, false); that._upArrowEventHandler.bind('press', function (e) { e.preventDefault(); that._spin(1); that._upArrow.addClass(SELECTED); }); that._downArrowEventHandler.bind('press', function (e) { e.preventDefault(); that._spin(-1); that._downArrow.addClass(SELECTED); }); that.element.on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('paste' + ns, proxy(that._paste, that)); } else { wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED); text.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable).attr(ARIA_READONLY, readonly); } }, readonly: function (readonly) { this._editable({ readonly: readonly === undefined ? true : readonly, disable: false }); }, enable: function (enable) { this._editable({ readonly: false, disable: !(enable = enable === undefined ? true : enable) }); }, destroy: function () { var that = this; that.element.add(that._text).add(that._upArrow).add(that._downArrow).add(that._inputWrapper).off(ns); that._upArrowEventHandler.destroy(); that._downArrowEventHandler.destroy(); if (that._form) { that._form.off('reset', that._resetHandler); } Widget.fn.destroy.call(that); }, min: function (value) { return this._option('min', value); }, max: function (value) { return this._option('max', value); }, step: function (value) { return this._option('step', value); }, value: function (value) { var that = this, adjusted; if (value === undefined) { return that._value; } value = that._parse(value); adjusted = that._adjust(value); if (value !== adjusted) { return; } that._update(value); that._old = that._value; }, focus: function () { this._focusin(); }, _adjust: function (value) { var that = this, options = that.options, min = options.min, max = options.max; if (value === NULL) { return value; } if (min !== NULL && value < min) { value = min; } else if (max !== NULL && value > max) { value = max; } return value; }, _arrows: function () { var that = this, arrows, _release = function () { clearTimeout(that._spinning); arrows.removeClass(SELECTED); }, options = that.options, spinners = options.spinners, element = that.element; arrows = element.siblings('.k-icon'); if (!arrows[0]) { arrows = $(buttonHtml('n', options.upArrowText) + buttonHtml('s', options.downArrowText)).insertAfter(element); arrows.wrapAll(''); } if (!spinners) { arrows.parent().toggle(spinners); that._inputWrapper.addClass('k-expand-padding'); } that._upArrow = arrows.eq(0); that._upArrowEventHandler = new kendo.UserEvents(that._upArrow, { release: _release }); that._downArrow = arrows.eq(1); that._downArrowEventHandler = new kendo.UserEvents(that._downArrow, { release: _release }); }, _blur: function () { var that = this; that._toggleText(true); that._change(that.element.val()); }, _click: function (e) { var that = this; clearTimeout(that._focusing); that._focusing = setTimeout(function () { var input = e.target, idx = caret(input)[0], value = input.value.substring(0, idx), format = that._format(that.options.format), group = format[','], result, groupRegExp, extractRegExp, caretPosition = 0; if (group) { groupRegExp = new RegExp('\\' + group, 'g'); extractRegExp = new RegExp('([\\d\\' + group + ']+)(\\' + format[POINT] + ')?(\\d+)?'); } if (extractRegExp) { result = extractRegExp.exec(value); } if (result) { caretPosition = result[0].replace(groupRegExp, '').length; if (value.indexOf('(') != -1 && that._value < 0) { caretPosition++; } } that._focusin(); caret(that.element[0], caretPosition); }); }, _change: function (value) { var that = this; that._update(value); value = that._value; if (that._old != value) { that._old = value; if (!that._typing) { that.element.trigger(CHANGE); } that.trigger(CHANGE); } that._typing = false; }, _culture: function (culture) { return culture || getCulture(this.options.culture); }, _focusin: function () { var that = this; that._inputWrapper.addClass(FOCUSED); that._toggleText(false); that.element[0].focus(); }, _focusout: function () { var that = this; clearTimeout(that._focusing); that._inputWrapper.removeClass(FOCUSED).removeClass(HOVER); that._blur(); }, _format: function (format, culture) { var numberFormat = this._culture(culture).numberFormat; format = format.toLowerCase(); if (format.indexOf('c') > -1) { numberFormat = numberFormat.currency; } else if (format.indexOf('p') > -1) { numberFormat = numberFormat.percent; } return numberFormat; }, _input: function () { var that = this, CLASSNAME = 'k-formatted-value', element = that.element.addClass(INPUT).show()[0], accessKey = element.accessKey, wrapper = that.wrapper, text; text = wrapper.find(POINT + CLASSNAME); if (!text[0]) { text = $('').insertBefore(element).addClass(CLASSNAME); } try { element.setAttribute('type', 'text'); } catch (e) { element.type = 'text'; } text[0].tabIndex = element.tabIndex; text[0].style.cssText = element.style.cssText; text[0].title = element.title; text.prop('placeholder', that.options.placeholder); if (accessKey) { text.attr('accesskey', accessKey); element.accessKey = ''; } that._text = text.addClass(element.className); }, _keydown: function (e) { var that = this, key = e.keyCode; that._key = key; if (key == keys.DOWN) { that._step(-1); } else if (key == keys.UP) { that._step(1); } else if (key == keys.ENTER) { that._change(that.element.val()); } else { that._typing = true; } }, _keypress: function (e) { if (e.which === 0 || e.metaKey || e.ctrlKey || e.keyCode === keys.BACKSPACE || e.keyCode === keys.ENTER) { return; } var that = this; var min = that.options.min; var element = that.element; var selection = caret(element); var selectionStart = selection[0]; var selectionEnd = selection[1]; var character = String.fromCharCode(e.which); var numberFormat = that._format(that.options.format); var isNumPadDecimal = that._key === keys.NUMPAD_DOT; var value = element.val(); var isValid; if (isNumPadDecimal) { character = numberFormat[POINT]; } value = value.substring(0, selectionStart) + character + value.substring(selectionEnd); isValid = that._numericRegex(numberFormat).test(value); if (isValid && isNumPadDecimal) { element.val(value); caret(element, selectionStart + character.length); e.preventDefault(); } else if (min !== null && min >= 0 && value.charAt(0) === '-' || !isValid) { e.preventDefault(); } that._key = 0; }, _numericRegex: function (numberFormat) { var that = this; var separator = numberFormat[POINT]; var precision = that.options.decimals; if (separator === POINT) { separator = '\\' + separator; } if (precision === NULL) { precision = numberFormat.decimals; } if (precision === 0) { return INTEGER_REGEXP; } if (that._separator !== separator) { that._separator = separator; that._floatRegExp = new RegExp('^(-)?(((\\d+(' + separator + '\\d*)?)|(' + separator + '\\d*)))?$'); } return that._floatRegExp; }, _paste: function (e) { var that = this, element = e.target, value = element.value; setTimeout(function () { if (that._parse(element.value) === NULL) { that._update(value); } }); }, _option: function (option, value) { var that = this, options = that.options; if (value === undefined) { return options[option]; } value = that._parse(value); if (!value && option === 'step') { return; } options[option] = value; that.element.attr('aria-value' + option, value).attr(option, value); }, _spin: function (step, timeout) { var that = this; timeout = timeout || 500; clearTimeout(that._spinning); that._spinning = setTimeout(function () { that._spin(step, 50); }, timeout); that._step(step); }, _step: function (step) { var that = this, element = that.element, value = that._parse(element.val()) || 0; if (activeElement() != element[0]) { that._focusin(); } value += that.options.step * step; that._update(that._adjust(value)); that._typing = false; that.trigger(SPIN); }, _toggleHover: function (e) { $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter'); }, _toggleText: function (toggle) { var that = this; that._text.toggle(toggle); that.element.toggle(!toggle); }, _parse: function (value, culture) { return parse(value, this._culture(culture), this.options.format); }, _update: function (value) { var that = this, options = that.options, format = options.format, decimals = options.decimals, culture = that._culture(), numberFormat = that._format(format, culture), isNotNull; if (decimals === NULL) { decimals = numberFormat.decimals; } value = that._parse(value, culture); isNotNull = value !== NULL; if (isNotNull) { value = parseFloat(round(value, decimals)); } that._value = value = that._adjust(value); that._placeholder(kendo.toString(value, format, culture)); if (isNotNull) { value = value.toString(); if (value.indexOf('e') !== -1) { value = round(+value, decimals); } value = value.replace(POINT, numberFormat[POINT]); } else { value = ''; } that.element.val(value).attr('aria-valuenow', value); }, _placeholder: function (value) { this._text.val(value); if (!placeholderSupported && !value) { this._text.val(this.options.placeholder); } }, _wrapper: function () { var that = this, element = that.element, DOMElement = element[0], wrapper; wrapper = element.parents('.k-numerictextbox'); if (!wrapper.is('span.k-numerictextbox')) { wrapper = element.hide().wrap('').parent(); wrapper = wrapper.wrap('').parent(); } wrapper[0].style.cssText = DOMElement.style.cssText; DOMElement.style.width = ''; that.wrapper = wrapper.addClass('k-widget k-numerictextbox').addClass(DOMElement.className).css('display', ''); that._inputWrapper = $(wrapper[0].firstChild); }, _reset: function () { var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form'); if (form[0]) { that._resetHandler = function () { setTimeout(function () { that.value(element[0].value); that.max(that._initialOptions.max); that.min(that._initialOptions.min); }); }; that._form = form.on('reset', that._resetHandler); } } }); function buttonHtml(className, text) { return '' + text + ''; } ui.plugin(NumericTextBox); }(window.kendo.jQuery)); return window.kendo; }, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) { (a3 || a2)(); }));