@devexpress/utils
Version:
DevExpress utils
1,336 lines (1,303 loc) • 321 kB
JavaScript
/*!
* DevExpress Utils (dx.utils)
* Version: 2.0.0
* Build date: Thu Sep 04 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExpress licensing here: https://www.devexpress.com/Support/EULAs
*/
var DevExpress;
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 125:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.AttrUtils = void 0;
var browser_1 = __webpack_require__(9246);
var AttrUtils = (function () {
function AttrUtils() {
}
AttrUtils.setElementAttribute = function (obj, attrName, value) {
if (obj.setAttribute) {
if (browser_1.Browser.IE && browser_1.Browser.MajorVersion >= 11 && attrName.toLowerCase() === 'src')
obj.setAttribute(attrName, '');
obj.setAttribute(attrName, value);
}
};
AttrUtils.setStyleAttribute = function (obj, attrName, value) {
if (obj.setProperty)
obj.setProperty(attrName, value, '');
};
AttrUtils.getElementAttribute = function (obj, attrName) {
return obj.getAttribute(attrName);
};
AttrUtils.getStyleAttribute = function (obj, attrName) {
if (obj.getPropertyValue) {
if (browser_1.Browser.Firefox) {
try {
return obj.getPropertyValue(attrName);
}
catch (e) {
return obj[attrName];
}
}
return obj.getPropertyValue(attrName);
}
return null;
};
AttrUtils.removeElementAttribute = function (obj, attrName) {
if (obj.removeAttribute)
obj.removeAttribute(attrName);
};
AttrUtils.removeStyleAttribute = function (obj, attrName) {
if (obj.removeProperty)
obj.removeProperty(attrName);
};
AttrUtils.changeElementStyleAttribute = function (obj, attrName, newValue) {
AttrUtils.saveStyleAttributeInElement(obj, attrName);
AttrUtils.setStyleAttribute(obj.style, attrName, newValue);
};
AttrUtils.restoreElementStyleAttribute = function (obj, attrName) {
var savedAttrName = "dxwu_saved" + attrName;
var style = obj.style;
if (AttrUtils.isExistsAttributeInElement(obj, savedAttrName)) {
var oldValue = AttrUtils.getElementAttribute(obj, savedAttrName);
if (oldValue === AttrUtils.emptyObject || oldValue === null)
AttrUtils.removeStyleAttribute(style, attrName);
else
AttrUtils.setStyleAttribute(style, attrName, oldValue);
AttrUtils.removeElementAttribute(obj, savedAttrName);
return true;
}
return false;
};
AttrUtils.saveStyleAttributeInElement = function (obj, attrName) {
var savedAttrName = "dxwu_saved" + attrName;
var style = obj.style;
if (!AttrUtils.isExistsAttributeInElement(obj, savedAttrName)) {
var oldValue = AttrUtils.getStyleAttribute(style, attrName);
AttrUtils.setElementAttribute(obj, savedAttrName, AttrUtils.isAttributeExists(oldValue) ? oldValue : AttrUtils.emptyObject);
}
};
AttrUtils.isExistsAttributeInElement = function (obj, attrName) {
var value = AttrUtils.getElementAttribute(obj, attrName);
return AttrUtils.isAttributeExists(value);
};
AttrUtils.isAttributeExists = function (attrValue) {
return attrValue !== null && attrValue !== '';
};
AttrUtils.emptyObject = 'DxEmptyValue';
return AttrUtils;
}());
exports.AttrUtils = AttrUtils;
/***/ }),
/***/ 335:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.SparseIntervalsCollector = void 0;
var intervals_1 = __webpack_require__(7626);
var SparseIntervalsCollector = (function () {
function SparseIntervalsCollector(template) {
this.intervals = [];
this.template = template;
}
SparseIntervalsCollector.prototype.add = function (index) {
if (this.curr && this.curr.end === index) {
this.curr.length++;
return;
}
this.curr = this.template.makeByStartLength(index, 1);
this.intervals.push(this.curr);
};
SparseIntervalsCollector.prototype.getIntervals = function () {
return new intervals_1.SparseIntervals(this.intervals);
};
return SparseIntervalsCollector;
}());
exports.SparseIntervalsCollector = SparseIntervalsCollector;
/***/ }),
/***/ 431:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.TouchUtils = void 0;
var browser_1 = __webpack_require__(9246);
var common_1 = __webpack_require__(4395);
var TouchUtils = (function () {
function TouchUtils() {
}
TouchUtils.onEventAttachingToDocument = function (eventName, func) {
if (browser_1.Browser.MacOSMobilePlatform && TouchUtils.isTouchEventName(eventName)) {
if (!TouchUtils.documentTouchHandlers[eventName])
TouchUtils.documentTouchHandlers[eventName] = [];
TouchUtils.documentTouchHandlers[eventName].push(func);
return TouchUtils.documentEventAttachingAllowed;
}
return true;
};
TouchUtils.isTouchEventName = function (eventName) {
return browser_1.Browser.WebKitTouchUI && (eventName.indexOf('touch') > -1 || eventName.indexOf('gesture') > -1);
};
TouchUtils.isTouchEvent = function (evt) {
return browser_1.Browser.WebKitTouchUI && common_1.isDefined(evt.changedTouches);
};
TouchUtils.getEventX = function (evt) {
return browser_1.Browser.IE ? evt.pageX : evt.changedTouches[0].pageX;
};
TouchUtils.getEventY = function (evt) {
return browser_1.Browser.IE ? evt.pageY : evt.changedTouches[0].pageY;
};
TouchUtils.touchMouseDownEventName = browser_1.Browser.WebKitTouchUI ? 'touchstart' : (browser_1.Browser.Edge && browser_1.Browser.MSTouchUI && window.PointerEvent ? 'pointerdown' : 'mousedown');
TouchUtils.touchMouseUpEventName = browser_1.Browser.WebKitTouchUI ? 'touchend' : (browser_1.Browser.Edge && browser_1.Browser.MSTouchUI && window.PointerEvent ? 'pointerup' : 'mouseup');
TouchUtils.touchMouseMoveEventName = browser_1.Browser.WebKitTouchUI ? 'touchmove' : (browser_1.Browser.Edge && browser_1.Browser.MSTouchUI && window.PointerEvent ? 'pointermove' : 'mousemove');
TouchUtils.msTouchDraggableClassName = 'dxMSTouchDraggable';
TouchUtils.documentTouchHandlers = {};
TouchUtils.documentEventAttachingAllowed = true;
return TouchUtils;
}());
exports.TouchUtils = TouchUtils;
/***/ }),
/***/ 441:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.PdfPluginHelper = void 0;
var browser_1 = __webpack_require__(9246);
var PdfPluginHelper = (function () {
function PdfPluginHelper() {
}
PdfPluginHelper.isInstalled = function () {
return !!PdfPluginHelper.getPdfPlugin();
};
PdfPluginHelper.getPdfPlugin = function () {
if (!PdfPluginHelper.plugin) {
PdfPluginHelper.plugin = browser_1.Browser.IE ?
PdfPluginHelper.getActiveXObject('AcroPDF.PDF') || PdfPluginHelper.getActiveXObject('PDF.PdfCtrl') :
PdfPluginHelper.getNavigatorPlugin('Adobe Acrobat') || PdfPluginHelper.getNavigatorPlugin('Chrome PDF Viewer') ||
PdfPluginHelper.getNavigatorPlugin('WebKit built-in PDF') || PdfPluginHelper.getNavigatorPlugin('Chromium PDF Viewer');
}
return PdfPluginHelper.plugin;
};
PdfPluginHelper.getActiveXObject = function (name) {
try {
return new ActiveXObject(name);
}
catch (e) {
return null;
}
};
PdfPluginHelper.getNavigatorPlugin = function (name) {
var plugins = navigator.plugins;
for (var key in plugins) {
if (!Object.prototype.hasOwnProperty.call(plugins, key))
continue;
var plugin = plugins[key];
if (plugin.name === name)
return plugin;
}
return null;
};
PdfPluginHelper.getVersion = function () {
try {
var plugin = PdfPluginHelper.getPdfPlugin();
if (browser_1.Browser.IE) {
var versions = plugin.GetVersions().split(',');
var latest = versions[0].split('=');
return parseFloat(latest[1]);
}
return plugin.version ? parseInt(plugin.version) : plugin.name;
}
catch (e) {
return null;
}
};
return PdfPluginHelper;
}());
exports.PdfPluginHelper = PdfPluginHelper;
/***/ }),
/***/ 443:
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.SequenceComparator = exports.SesElem = exports.SesType = void 0;
var SesType;
(function (SesType) {
SesType[SesType["Delete"] = -1] = "Delete";
SesType[SesType["Common"] = 0] = "Common";
SesType[SesType["Add"] = 1] = "Add";
})(SesType = exports.SesType || (exports.SesType = {}));
var SesElem = (function () {
function SesElem(elem, type) {
this.elem = elem;
this.type = type;
}
SesElem.prototype.toString = function () {
var sign;
switch (this.type) {
case SesType.Add:
sign = '+';
break;
case SesType.Delete:
sign = '-';
break;
case SesType.Common:
sign = ' ';
break;
}
return sign + this.elem.toString();
};
return SesElem;
}());
exports.SesElem = SesElem;
var SequenceComparator = (function () {
function SequenceComparator(a, b) {
this.editDistance = null;
this.lcs = '';
this.ses = [];
this.path = [];
this.pathposi = [];
this.a = a;
this.b = b;
this.m = this.a.length;
this.n = this.b.length;
this.reverse = this.m > this.n;
if (this.reverse) {
var tmpA = this.a;
this.a = this.b;
this.b = tmpA;
var tmpM = this.m;
this.m = this.n;
this.n = tmpM;
}
this.offset = this.m + 1;
this.comparer = this.a.getComparer();
}
SequenceComparator.prototype.calculate = function () {
var size = this.m + this.n + 3;
var fp = {};
for (var i = 0; i < size; ++i) {
fp[i] = -1;
this.path[i] = -1;
}
var delta = this.n - this.m;
var p = -1;
do {
++p;
for (var k = -p; k <= delta - 1; ++k)
fp[k + this.offset] = this.snake(k, fp[k - 1 + this.offset] + 1, fp[k + 1 + this.offset]);
for (var k = delta + p; k >= delta + 1; --k)
fp[k + this.offset] = this.snake(k, fp[k - 1 + this.offset] + 1, fp[k + 1 + this.offset]);
fp[delta + this.offset] = this.snake(delta, fp[delta - 1 + this.offset] + 1, fp[delta + 1 + this.offset]);
} while (fp[delta + this.offset] !== this.n);
this.editDistance = delta + 2 * p;
var r = this.path[delta + this.offset];
var epc = [];
while (r !== -1) {
var pos = this.pathposi[r];
epc.push(new PathElem(pos.x, pos.y, null));
r = pos.k;
}
this.recordSeq(epc);
return this.ses;
};
SequenceComparator.prototype.toString = function () {
var result = [];
for (var _i = 0, _a = this.ses; _i < _a.length; _i++) {
var elem = _a[_i];
result.push(elem.toString());
}
return result.join('\n');
};
SequenceComparator.prototype.snake = function (k, p, pp) {
var r = p > pp ?
this.path[k - 1 + this.offset] :
this.path[k + 1 + this.offset];
var y = Math.max(p, pp);
var x = y - k;
while (x < this.m && y < this.n && this.comparer(this.a.getByIndex(x), this.b.getByIndex(y))) {
++x;
++y;
}
var len = this.pathposi.push(new PathElem(x, y, r));
this.path[k + this.offset] = len - 1;
return y;
};
SequenceComparator.prototype.recordSeq = function (epc) {
var px_idx = 0;
var py_idx = 0;
var addTag = this.reverse ? SesType.Delete : SesType.Add;
var deleteTag = this.reverse ? SesType.Add : SesType.Delete;
for (var i = epc.length - 1; i >= 0; --i) {
var currEpc = epc[i];
while (px_idx < currEpc.x || py_idx < currEpc.y) {
var yxDiff = currEpc.y - currEpc.x;
var pypxDiff = py_idx - px_idx;
if (yxDiff > pypxDiff) {
this.ses.push(new SesElem(this.b.getByIndex(py_idx), addTag));
++py_idx;
}
else if (yxDiff < pypxDiff) {
this.ses.push(new SesElem(this.a.getByIndex(px_idx), deleteTag));
++px_idx;
}
else {
this.ses.push(new SesElem(this.a.getByIndex(px_idx), SesType.Common));
this.lcs += this.a.getByIndex(px_idx);
++px_idx;
++py_idx;
}
}
}
};
return SequenceComparator;
}());
exports.SequenceComparator = SequenceComparator;
var PathElem = (function () {
function PathElem(x, y, k) {
this.x = x;
this.y = y;
this.k = k;
}
return PathElem;
}());
/***/ }),
/***/ 567:
/***/ ((__unused_webpack_module, exports) => {
var _a, _b, _c;
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.MimeTypeUtils = exports.DxMimeType = exports.ImageWebpMimeType = exports.ImageWbmpMimeType = exports.ImageIcoMimeType = exports.ImageTiffMimeType = exports.ImageSvgMimeType = exports.ImagePjpegMimeType = exports.ImageJpegMimeType = exports.ImageGifMimeType = exports.ImagePngMimeType = exports.DocmMimeType = exports.HtmlMimeType = exports.PlainTextMimeType = exports.RtfMimeType = exports.OpenXmlMimeType = void 0;
exports.OpenXmlMimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
exports.RtfMimeType = 'application/rtf';
exports.PlainTextMimeType = 'text/plain';
exports.HtmlMimeType = 'text/html';
exports.DocmMimeType = 'application/vnd.ms-word.document.macroEnabled.12';
exports.ImagePngMimeType = 'image/png';
exports.ImageGifMimeType = 'image/gif';
exports.ImageJpegMimeType = 'image/jpeg';
exports.ImagePjpegMimeType = 'image/pjpeg';
exports.ImageSvgMimeType = 'image/svg+xml';
exports.ImageTiffMimeType = 'image/tiff';
exports.ImageIcoMimeType = 'image/vnd.microsoft.icon';
exports.ImageWbmpMimeType = 'image/vnd.wap.wbmp';
exports.ImageWebpMimeType = 'image/webp';
var DxMimeType;
(function (DxMimeType) {
DxMimeType[DxMimeType["Unknown"] = 0] = "Unknown";
DxMimeType[DxMimeType["OpenXml"] = 1] = "OpenXml";
DxMimeType[DxMimeType["Rtf"] = 2] = "Rtf";
DxMimeType[DxMimeType["PlainText"] = 3] = "PlainText";
DxMimeType[DxMimeType["Docm"] = 4] = "Docm";
DxMimeType[DxMimeType["Png"] = 5] = "Png";
DxMimeType[DxMimeType["Gif"] = 6] = "Gif";
DxMimeType[DxMimeType["Jpeg"] = 7] = "Jpeg";
DxMimeType[DxMimeType["Pjpeg"] = 8] = "Pjpeg";
DxMimeType[DxMimeType["Svg"] = 9] = "Svg";
DxMimeType[DxMimeType["Tiff"] = 10] = "Tiff";
DxMimeType[DxMimeType["Ico"] = 11] = "Ico";
DxMimeType[DxMimeType["Wbmp"] = 12] = "Wbmp";
DxMimeType[DxMimeType["Webp"] = 13] = "Webp";
DxMimeType[DxMimeType["Html"] = 14] = "Html";
})(DxMimeType = exports.DxMimeType || (exports.DxMimeType = {}));
var MimeTypeUtils = (function () {
function MimeTypeUtils() {
}
MimeTypeUtils.stringTypeToExtension = function (mimeTypeAsStr) {
var mimeType = MimeTypeUtils.stringTypeToTypeMap[mimeTypeAsStr];
return mimeType === undefined ? '' : MimeTypeUtils.typeToExtensionMap[mimeType];
};
MimeTypeUtils.typeToExtension = function (mimeType) {
var ext = MimeTypeUtils.typeToExtensionMap[mimeType];
return ext !== null && ext !== void 0 ? ext : '';
};
MimeTypeUtils.extensionToType = function (extension) {
extension = extension.toLowerCase();
if (extension[0] !== '.')
extension += '.';
var mimeType = MimeTypeUtils.extensionToTypeMap[extension];
return mimeType !== null && mimeType !== void 0 ? mimeType : DxMimeType.Unknown;
};
MimeTypeUtils.typeToStringType = function (mimeType) {
var str = MimeTypeUtils.typeToStringTypeMap[mimeType];
return str !== null && str !== void 0 ? str : '';
};
MimeTypeUtils.stringTypeToType = function (mimeTypeAsStr) {
var mimeType = MimeTypeUtils.stringTypeToTypeMap[mimeTypeAsStr];
return mimeType === undefined ? DxMimeType.Unknown : mimeType;
};
MimeTypeUtils.stringTypeToTypeMap = (_a = {},
_a[exports.OpenXmlMimeType] = DxMimeType.OpenXml,
_a[exports.RtfMimeType] = DxMimeType.Rtf,
_a[exports.PlainTextMimeType] = DxMimeType.PlainText,
_a[exports.DocmMimeType] = DxMimeType.Docm,
_a[exports.HtmlMimeType] = DxMimeType.Html,
_a[exports.ImagePngMimeType] = DxMimeType.Png,
_a[exports.ImageGifMimeType] = DxMimeType.Gif,
_a[exports.ImageJpegMimeType] = DxMimeType.Jpeg,
_a[exports.ImagePjpegMimeType] = DxMimeType.Pjpeg,
_a[exports.ImageSvgMimeType] = DxMimeType.Svg,
_a[exports.ImageTiffMimeType] = DxMimeType.Tiff,
_a[exports.ImageIcoMimeType] = DxMimeType.Ico,
_a[exports.ImageWbmpMimeType] = DxMimeType.Wbmp,
_a[exports.ImageWebpMimeType] = DxMimeType.Webp,
_a);
MimeTypeUtils.typeToStringTypeMap = (_b = {},
_b[DxMimeType.Unknown] = undefined,
_b[DxMimeType.OpenXml] = exports.OpenXmlMimeType,
_b[DxMimeType.Rtf] = exports.RtfMimeType,
_b[DxMimeType.PlainText] = exports.PlainTextMimeType,
_b[DxMimeType.Docm] = exports.DocmMimeType,
_b[DxMimeType.Html] = exports.HtmlMimeType,
_b[DxMimeType.Png] = exports.ImagePngMimeType,
_b[DxMimeType.Gif] = exports.ImageGifMimeType,
_b[DxMimeType.Jpeg] = exports.ImageJpegMimeType,
_b[DxMimeType.Pjpeg] = exports.ImagePjpegMimeType,
_b[DxMimeType.Svg] = exports.ImageSvgMimeType,
_b[DxMimeType.Tiff] = exports.ImageTiffMimeType,
_b[DxMimeType.Ico] = exports.ImageIcoMimeType,
_b[DxMimeType.Wbmp] = exports.ImageWbmpMimeType,
_b[DxMimeType.Webp] = exports.ImageWebpMimeType,
_b);
MimeTypeUtils.typeToExtensionMap = (_c = {},
_c[DxMimeType.Unknown] = undefined,
_c[DxMimeType.OpenXml] = '.docx',
_c[DxMimeType.Rtf] = '.rtf',
_c[DxMimeType.PlainText] = '.txt',
_c[DxMimeType.Docm] = '.docm',
_c[DxMimeType.Html] = '.html',
_c[DxMimeType.Png] = '.png',
_c[DxMimeType.Gif] = '.gif',
_c[DxMimeType.Jpeg] = '.jpeg',
_c[DxMimeType.Pjpeg] = '.pjpeg',
_c[DxMimeType.Svg] = '.svg',
_c[DxMimeType.Tiff] = '.tiff',
_c[DxMimeType.Ico] = '.ico',
_c[DxMimeType.Wbmp] = '.wbmp',
_c[DxMimeType.Webp] = '.webp',
_c);
MimeTypeUtils.extensionToTypeMap = {
'.docx': DxMimeType.OpenXml,
'.rtf': DxMimeType.Rtf,
'.txt': DxMimeType.PlainText,
'.docm': DxMimeType.Docm,
'.html': DxMimeType.Html,
'.htm': DxMimeType.Html,
'.png': DxMimeType.Png,
'.gif': DxMimeType.Gif,
'.jpeg': DxMimeType.Jpeg,
'.pjpeg': DxMimeType.Pjpeg,
'.svg': DxMimeType.Svg,
'.tiff': DxMimeType.Tiff,
'.ico': DxMimeType.Ico,
'.wbmp': DxMimeType.Wbmp,
'.webp': DxMimeType.Webp,
};
return MimeTypeUtils;
}());
exports.MimeTypeUtils = MimeTypeUtils;
/***/ }),
/***/ 575:
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.NumberFormatter = void 0;
var NumberFormatter = (function () {
function NumberFormatter(options) {
this.positive = true;
this.digits = [];
this.pointPos = 0;
this.spec = '';
this.prec = -1;
this.upper = true;
this.custom = false;
this.options = options;
}
NumberFormatter.prototype.format = function (format, value) {
if (isNaN(value))
return this.options.numNan;
if (!isFinite(value)) {
return value > 0 ?
this.options.numPosInf :
this.options.numNegInf;
}
this.fillFormatInfo(format);
if (this.spec === 'X')
return this.formatHex(value);
this.fillDigitInfo(value);
switch (this.spec) {
case 'C':
return this.formatCurrency();
case 'D':
return this.formatDecimal();
case 'E':
return this.formatExp();
case 'F':
return this.formatFixed();
case 'G':
return this.formatGeneral();
case 'N':
return this.formatNumber();
case 'P':
return this.formatPercent();
default:
if (this.custom)
return this.formatCustom(format);
return '?';
}
};
NumberFormatter.prototype.formatCurrency = function () {
if (this.prec < 0)
this.prec = this.options.currPrec;
this.round(this.prec);
var bag = [];
if (this.positive) {
switch (this.options.currPosPattern) {
case 0:
bag.push(this.options.currency);
break;
case 2:
bag.push(this.options.currency, ' ');
break;
}
}
else {
switch (this.options.currNegPattern) {
case 0:
bag.push('(', this.options.currency);
break;
case 1:
bag.push('-', this.options.currency);
break;
case 2:
bag.push(this.options.currency, '-');
break;
case 3:
bag.push(this.options.currency);
break;
case 4:
bag.push('(');
break;
case 5:
case 8:
bag.push('-');
break;
case 9:
bag.push('-', this.options.currency, ' ');
break;
case 11:
bag.push(this.options.currency, ' ');
break;
case 12:
bag.push(this.options.currency, ' -');
break;
case 14:
bag.push('(', this.options.currency, ' ');
break;
case 15:
bag.push('(');
break;
}
}
this.appendGroupedInteger(bag, this.options.currGroups, this.options.currGroupSeparator);
if (this.prec > 0) {
bag.push(this.options.currDecimalPoint);
this.appendDigits(bag, this.pointPos, this.pointPos + this.prec);
}
if (this.positive) {
switch (this.options.currPosPattern) {
case 1:
bag.push(this.options.currency);
break;
case 3:
bag.push(' ', this.options.currency);
break;
}
}
else {
switch (this.options.currNegPattern) {
case 0:
case 14:
bag.push(')');
break;
case 3:
bag.push('-');
break;
case 4:
bag.push(this.options.currency, ')');
break;
case 5:
bag.push(this.options.currency);
break;
case 6:
bag.push('-', this.options.currency);
break;
case 7:
bag.push(this.options.currency, '-');
break;
case 8:
bag.push(' ', this.options.currency);
break;
case 10:
bag.push(' ', this.options.currency, '-');
break;
case 11:
bag.push('-');
break;
case 13:
bag.push('- ', this.options.currency);
break;
case 15:
bag.push(' ', this.options.currency, ')');
break;
}
}
return bag.join('');
};
NumberFormatter.prototype.formatDecimal = function () {
if (this.prec < this.pointPos)
this.prec = this.pointPos;
if (this.prec < 1)
return '0';
var bag = [];
if (!this.positive)
bag.push('-');
this.appendDigits(bag, this.pointPos - this.prec, this.pointPos);
return bag.join('');
};
NumberFormatter.prototype.formatExp = function () {
if (this.prec < 0)
this.prec = 6;
this.round(1 - this.pointPos + this.prec);
return this.formatExpCore(3);
};
NumberFormatter.prototype.formatExpCore = function (minExpDigits) {
var bag = [];
if (!this.positive)
bag.push('-');
this.appendDigits(bag, 0, 1);
if (this.prec > 0) {
bag.push(this.options.numDecimalPoint);
this.appendDigits(bag, 1, 1 + this.prec);
}
bag.push(this.upper ? 'E' : 'e');
var order = this.pointPos - 1;
if (order >= 0)
bag.push('+');
else {
bag.push('-');
order = -order;
}
var orderStr = String(order);
for (var i = orderStr.length; i < minExpDigits; i++)
bag.push(0);
bag.push(orderStr);
return bag.join('');
};
NumberFormatter.prototype.formatFixed = function () {
if (this.prec < 0)
this.prec = this.options.numPrec;
this.round(this.prec);
var bag = [];
if (!this.positive)
bag.push('-');
if (this.pointPos < 1)
bag.push(0);
else
this.appendDigits(bag, 0, this.pointPos);
if (this.prec > 0) {
bag.push(this.options.numDecimalPoint);
this.appendDigits(bag, this.pointPos, this.pointPos + this.prec);
}
return bag.join('');
};
NumberFormatter.prototype.formatGeneral = function () {
var hasFrac = this.pointPos < this.digits.length;
var allowExp;
if (this.prec < 0) {
allowExp = hasFrac;
this.prec = hasFrac ? 15 : 10;
}
else {
allowExp = true;
if (this.prec < 1)
this.prec = hasFrac ? 15 : 10;
this.round(this.prec - this.pointPos);
}
if (allowExp) {
if (this.pointPos > this.prec || this.pointPos <= -4) {
this.prec = this.digits.length - 1;
return this.formatExpCore(2);
}
}
this.prec = Math.min(this.prec, Math.max(1, this.digits.length)) - this.pointPos;
return this.formatFixed();
};
NumberFormatter.prototype.formatNumber = function () {
if (this.prec < 0)
this.prec = this.options.numPrec;
this.round(this.prec);
var bag = [];
if (!this.positive) {
switch (this.options.numNegPattern) {
case 0:
bag.push('(');
break;
case 1:
bag.push('-');
break;
case 2:
bag.push('- ');
break;
}
}
this.appendGroupedInteger(bag, this.options.numGroups, this.options.numGroupSeparator);
if (this.prec > 0) {
bag.push(this.options.numDecimalPoint);
this.appendDigits(bag, this.pointPos, this.pointPos + this.prec);
}
if (!this.positive) {
switch (this.options.numNegPattern) {
case 0:
bag.push(')');
break;
case 3:
bag.push('-');
break;
case 4:
bag.push(' -');
break;
}
}
return bag.join('');
};
NumberFormatter.prototype.formatPercent = function () {
if (this.prec < 0)
this.prec = this.options.numPrec;
if (this.digits.length > 0)
this.pointPos += 2;
this.round(this.prec);
var bag = [];
if (!this.positive)
bag.push('-');
if (this.options.percentPattern === 2)
bag.push('%');
this.appendGroupedInteger(bag, this.options.numGroups, this.options.numGroupSeparator);
if (this.prec > 0) {
bag.push(this.options.numDecimalPoint);
this.appendDigits(bag, this.pointPos, this.pointPos + this.prec);
}
switch (this.options.percentPattern) {
case 0:
bag.push(' %');
break;
case 1:
bag.push('%');
break;
}
return bag.join('');
};
NumberFormatter.prototype.formatHex = function (value) {
var result = value.toString(16);
if (result.indexOf('(') > -1)
return result;
result = this.upper ? result.toUpperCase() : result.toLowerCase();
if (this.prec <= result.length)
return result;
var bag = [];
for (var i = result.length; i < this.prec; i++)
bag.push(0);
bag.push(result);
return bag.join('');
};
NumberFormatter.prototype.formatCustom = function (format) {
var sectionList = NumberFormatter.getCustomFormatSections(format);
var section = this.selectCustomFormatSection(sectionList);
if (section === '')
return this.positive ? '' : '-';
var info = NumberFormatter.parseCustomFormatSection(section);
var lists = this.createCustomFormatLists(info);
if (sectionList.length > 2 && section !== sectionList[2]) {
var zero = lists.i.concat(lists.f).join('').split('0').join('') === '';
if (zero) {
section = sectionList[2];
info = NumberFormatter.parseCustomFormatSection(section);
lists = this.createCustomFormatLists(info);
}
}
return this.formatCustomCore(section, info, lists);
};
NumberFormatter.getCustomFormatSections = function (format) {
var sections = [];
var escaping = false;
var quote = '';
var length = 0;
var prevPos = 0;
for (var i = 0; i < format.length; i++) {
var ch = format.charAt(i);
if (!escaping && quote === '' && ch === ';') {
sections.push(format.substr(prevPos, length));
length = 0;
prevPos = i + 1;
if (sections.length > 2)
break;
}
else {
if (escaping)
escaping = false;
else if (ch === quote)
quote = quote === '' ? ch : '';
else if (ch === '\\')
escaping = true;
else if (ch === '\'' || ch === '"')
quote = ch;
++length;
}
}
if (length > 0)
sections.push(format.substr(prevPos, length));
if (sections.length < 1)
sections.push(format);
return sections;
};
NumberFormatter.prototype.selectCustomFormatSection = function (sections) {
if (!this.positive && sections.length > 1 && sections[1] !== '') {
this.positive = true;
return sections[1];
}
if (this.digits.length < 1 && sections.length > 2 && sections[2] !== '')
return sections[2];
return sections[0];
};
NumberFormatter.createCustomFormatInfo = function () {
return {
pointPos: -1,
grouping: false,
exp: false,
expShowPlus: false,
percent: false,
scaling: 0,
intDigits: 0,
fracDigits: 0,
expDigits: 0,
intSharps: 0,
fracSharps: 0,
expSharps: 0
};
};
NumberFormatter.parseCustomFormatSection = function (section) {
var quote = '';
var area = 'i';
var canParseIntSharps = true;
var result = NumberFormatter.createCustomFormatInfo();
var groupSeparators = 0;
for (var i = 0; i < section.length; i++) {
var ch = section.charAt(i);
if (ch === quote) {
quote = '';
continue;
}
if (quote !== '')
continue;
if (area === 'e' && ch !== '0' && ch !== '#') {
area = result.pointPos < 0 ? 'i' : 'f';
i--;
continue;
}
switch (ch) {
case '\\':
i++;
continue;
case '\'':
case '"':
quote = ch;
continue;
case '#':
case '0':
if (ch === '#') {
switch (area) {
case 'i':
if (canParseIntSharps)
result.intSharps++;
break;
case 'f':
result.fracSharps++;
break;
case 'e':
result.expSharps++;
break;
}
}
else {
canParseIntSharps = false;
switch (area) {
case 'f':
result.fracSharps = 0;
break;
case 'e':
result.expSharps = 0;
break;
}
}
switch (area) {
case 'i':
result.intDigits++;
if (groupSeparators > 0)
result.grouping = true;
groupSeparators = 0;
break;
case 'f':
result.fracDigits++;
break;
case 'e':
result.expDigits++;
break;
}
break;
case 'e':
case 'E':
if (result.exp)
break;
result.exp = true;
area = 'e';
if (i < section.length - 1) {
var next = section.charAt(1 + i);
if (next === '+' || next === '-') {
if (next === '+')
result.expShowPlus = true;
i++;
}
else if (next !== '0' && next !== '#') {
result.exp = false;
if (result.pointPos < 0)
area = 'i';
}
}
break;
case '.':
area = 'f';
if (result.pointPos < 0)
result.pointPos = i;
break;
case '%':
result.percent = true;
break;
case ',':
if (area === 'i' && result.intDigits > 0)
groupSeparators++;
break;
default:
break;
}
}
if (result.expDigits < 1)
result.exp = false;
else
result.intSharps = 0;
if (result.fracDigits < 1)
result.pointPos = -1;
result.scaling = 3 * groupSeparators;
return result;
};
NumberFormatter.prototype.createCustomFormatLists = function (info) {
var intList = [];
var fracList = [];
var expList = [];
if (this.digits.length > 0) {
if (info.percent)
this.pointPos += 2;
this.pointPos -= info.scaling;
}
var expPositive = true;
if (info.exp && (info.intDigits > 0 || info.fracDigits > 0)) {
var diff = 0;
if (this.digits.length > 0) {
this.round(info.intDigits + info.fracDigits - this.pointPos);
diff -= this.pointPos - info.intDigits;
this.pointPos = info.intDigits;
}
expPositive = diff <= 0;
expList = String(diff < 0 ? -diff : diff).split('');
}
else
this.round(info.fracDigits);
if (this.digits.length < 1 || this.pointPos < 1)
intList = [0];
else
this.appendDigits(intList, 0, this.pointPos);
this.appendDigits(fracList, this.pointPos, this.digits.length);
if (info.exp) {
while (intList.length < info.intDigits)
intList.unshift(0);
while (expList.length < info.expDigits - info.expSharps)
expList.unshift(0);
if (expPositive && info.expShowPlus)
expList.unshift('+');
else if (!expPositive)
expList.unshift('-');
}
else {
while (intList.length < info.intDigits - info.intSharps)
intList.unshift(0);
if (info.intSharps >= info.intDigits) {
var zero = true;
for (var i = 0; i < intList.length; i++) {
if (intList[i] !== 0) {
zero = false;
break;
}
}
if (zero)
intList = [];
}
}
while (fracList.length < info.fracDigits - info.fracSharps)
fracList.push(0);
return {
i: intList,
f: fracList,
e: expList
};
};
NumberFormatter.prototype.formatCustomCore = function (section, info, lists) {
var intLen = 0;
var total = 0;
var groupIndex = 0;
var counter = 0;
var groupSize = 0;
if (info.grouping && this.options.numGroups.length > 0) {
intLen = lists.i.length;
for (var i = 0; i < this.options.numGroups.length; i++) {
if (total + this.options.numGroups[i] <= intLen) {
total += this.options.numGroups[i];
groupIndex = i;
}
}
groupSize = this.options.numGroups[groupIndex];
var fraction = intLen > total ? intLen - total : 0;
if (groupSize === 0) {
while (groupIndex >= 0 && this.options.numGroups[groupIndex] === 0)
groupIndex--;
groupSize = fraction > 0 ? fraction : this.options.numGroups[groupIndex];
}
if (fraction === 0)
counter = groupSize;
else {
groupIndex += Math.floor(fraction / groupSize);
counter = fraction % groupSize;
if (counter === 0)
counter = groupSize;
else
groupIndex++;
}
}
else
info.grouping = false;
var bag = [];
var area = 'i';
var intSharps = 0;
var intListIndex = 0;
var fracListIndex = 0;
var savedCh = '';
for (var i = 0; i < section.length; i++) {
var ch = section.charAt(i);
if (ch === savedCh) {
savedCh = '';
continue;
}
if (savedCh !== '') {
bag.push(ch);
continue;
}
switch (ch) {
case '\\':
++i;
if (i < section.length)
bag.push(section.charAt(i));
continue;
case '\'':
case '"':
savedCh = ch;
continue;
case '#':
case '0':
if (area === 'i') {
intSharps++;
if (ch === '0' || info.intDigits - intSharps < lists.i.length + intListIndex) {
while (info.intDigits - intSharps + intListIndex < lists.i.length) {
bag.push(lists.i[intListIndex].toString());
intListIndex++;
if (info.grouping && --intLen > 0 && --counter === 0) {
bag.push(this.options.numGroupSeparator);
if (--groupIndex < this.options.numGroups.length && groupIndex >= 0)
groupSize = this.options.numGroups[groupIndex];
counter = groupSize;
}
}
}
}
else if (area === 'f') {
if (fracListIndex < lists.f.length) {
bag.push(lists.f[fracListIndex].toString());
fracListIndex++;
}
}
break;
case 'e':
case 'E': {
if (lists.e == null || !info.exp) {
bag.push(ch);
break;
}
var q = i + 1;
for (; q < section.length; q++) {
if (q === i + 1 && (section.charAt(q) === '+' || section.charAt(q) === '-'))
continue;
if (section.charAt(q) === '0' || section.charAt(q) === '#')
continue;
break;
}
i = q - 1;
area = info.pointPos < 0 ? 'i' : 'f';
bag.push(ch);
bag = bag.concat(lists.e);
lists.e = null;
break;
}
case '.':
if (info.pointPos === i && lists.f.length > 0)
bag.push(this.options.numDecimalPoint);
area = 'f';
break;
case ',':
break;
default:
bag.push(ch);
break;
}
}
if (!this.positive)
bag.unshift('-');
return bag.join('');
};
NumberFormatter.prototype.fillDigitInfo = function (value) {
this.positive = true;
if (value < 0) {
value = -value;
this.positive = false;
}
this.digits = [];
this.pointPos = 0;
if (value === 0 || !isFinite(value) || isNaN(value)) {
this.pointPos = 1;
return;
}
var list = String(value).split('e');
var str = list[0];
if (list.length > 1)
this.pointPos = Number(list[1]);
var frac = false;
var decimalCount = 0;
for (var i = 0; i < str.length; i++) {
var ch = str.charAt(i);
if (ch === '.')
frac = true;
else {
if (frac)
decimalCount++;
if (ch !== '0' || this.digits.length > 0)
this.digits.push(Number(ch));
}
}
this.pointPos += this.digits.length - decimalCount;
};
NumberFormatter.prototype.fillFormatInfo = function (format) {
this.upper = true;
this.custom = false;
this.prec = -1;
var spec;
if (format == null || format.length < 1)
spec = 'G';
else
spec = format.charAt(0);
if (spec >= 'a' && spec <= 'z') {
spec = spec.toUpperCase();
this.upper = false;
}
if (spec >= 'A' && spec <= 'Z') {
if (format != null && format.length > 1) {
var prec = Number(format.substr(1));
if (!isNaN(prec))
this.prec = prec;
else
this.custom = true;
}
}
else
this.custom = true;
this.spec = this.custom ? '0' : spec;
};
NumberFormatter.prototype.round = function (shift) {
var amount = this.digits.length - this.pointPos - shift;
if (amount <= 0)
return;
var cutPos = this.pointPos + shift;
if (cutPos < 0) {
this.digits = [];
this.pointPos = 0;
return;
}
var digit = this.digits[cutPos];
if (digit > 4) {
for (var i = 0; i < amount; i++) {
var index = cutPos - 1 - i;
if (index < 0) {
this.digits.unshift(0);
this.pointPos++;
cutPos++;
index++;
}
digit = this.digits[index];
if (digit < 9) {
this.digits[index] = 1 + digit;
break;
}
else {
this.digits[index] = 0;
amount++;
}
}
}
for (var i = cutPos - 1; i >= 0; i--) {
if (this.digits[i] > 0)
break;
cutPos--;
}
this.digits.splice(cutPos, this.digits.length - cutPos);
};
NumberFormatter.prototype.appendGroupedInteger = function (list, groups, separator) {
if (this.pointPos < 1) {
list.push(0);
return;
}
var total = 0;
var groupIndex = 0;
for (var i = 0; i < groups.length; i++) {
if (total + groups[i] <= this.pointPos) {
total += groups[i];
groupIndex = i;
}
else
break;
}
if (groups.length > 0 && total > 0) {
var counter = void 0;
var groupSize = groups[groupIndex];
var fraction = this.pointPos > total ? this.pointPos - total : 0;
if (groupSize === 0) {
while (groupIndex >= 0 && groups[groupIndex] === 0)
groupIndex--;
groupSize = fraction > 0 ? fraction : groups[groupIndex];
}
if (fraction === 0)
counter = groupSize;
else {
groupIndex += Math.floor(fraction / groupSize);
counter = fraction % groupSize;
if (counter === 0)
counter = groupSi