DocumentServer/OfficeWeb/sdk/Common/NumFormat.js

2816 lines
128 KiB
JavaScript
Raw Normal View History

2014-07-05 18:22:49 +00:00
/*
* (c) Copyright Ascensio System SIA 2010-2014
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
var numFormat_Text = 0;
var numFormat_TextPlaceholder = 1;
var numFormat_Bracket = 2;
var numFormat_Digit = 3;
var numFormat_DigitNoDisp = 4;
var numFormat_DigitSpace = 5;
var numFormat_DecimalPoint = 6;
var numFormat_DecimalFrac = 7;
var numFormat_Thousand = 8;
var numFormat_Scientific = 9;
var numFormat_Repeat = 10;
var numFormat_Skip = 11;
var numFormat_Year = 12;
var numFormat_Month = 13;
var numFormat_Minute = 14;
var numFormat_Hour = 15;
var numFormat_Day = 16;
var numFormat_Second = 17;
var numFormat_Milliseconds = 18;
var numFormat_AmPm = 19;
var numFormat_MonthMinute = 101;
var numFormat_Percent = 102;
var oNumFormatCache;
var FormatStates = {
Decimal: 1,
Frac: 2,
Scientific: 3,
Slash: 4
};
var SignType = {
Positive: 1,
Negative: 2,
Null: 3
};
var monthCut = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var monthShort = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"];
var month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var day = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var dayShort = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var gc_nMaxDigCount = 15;
var gc_nMaxDigCountView = 11;
var gc_nMaxMantissa = Math.pow(10, gc_nMaxDigCount);
var NumComporationOperators = {
equal: 1,
greater: 2,
less: 3,
greaterorequal: 4,
lessorequal: 5,
notequal: 6
};
function getNumberParts(x) {
var sig = SignType.Null;
if (x > 0) {
sig = SignType.Positive;
} else {
if (x < 0) {
sig = SignType.Negative;
x = Math.abs(x);
}
}
var exp = Math.floor(Math.log(x) * Math.LOG10E) - gc_nMaxDigCount + 1;
var man = Math.round(x / Math.pow(10, exp));
if (man >= gc_nMaxMantissa) {
exp++;
man /= 10;
}
return {
mantissa: man,
exponent: exp,
sign: sig
};
}
function FormatObj(type, val) {
this.type = type;
this.val = val;
}
function FormatObjScientific(val, format, sign) {
this.type = numFormat_Scientific;
this.val = val;
this.format = format;
this.sign = sign;
}
function FormatObjDecimalFrac(aLeft, aRight) {
this.type = numFormat_DecimalFrac;
this.aLeft = aLeft;
this.aRight = aRight;
this.bNumRight = false;
}
function FormatObjDateVal(type, nCount, bElapsed) {
this.type = type;
this.val = nCount;
this.bElapsed = bElapsed;
}
function FormatObjDateAmPm(sAm, sPm) {
this.type = numFormat_AmPm;
this.sAm = sAm;
this.sPm = sPm;
}
function FormatObjBracket(sData) {
this.type = numFormat_Bracket;
this.val = sData;
this.parse = function (data) {
var length = data.length;
if (length > 0) {
var first = data[0];
if ("$" == first) {
var aParams = data.substring(1).split("-");
if (2 == aParams.length) {
var sFirstParam = aParams[0];
var sSecondParam = aParams[1];
if (null != sFirstParam && sFirstParam.length > 0 && null != sSecondParam && sSecondParam.length > 0) {
this.CurrencyString = sFirstParam;
this.Lid = sSecondParam;
}
}
} else {
if ("y" == first || "m" == first || "d" == first || "h" == first || "s" == first || "Y" == first || "M" == first || "D" == first || "H" == first || "S" == first) {
var bSame = true;
var nCount = 1;
for (var i = 1; i < length; ++i) {
if (first != data[i]) {
bSame = false;
break;
}
nCount++;
}
if (true == bSame) {
switch (first) {
case "Y":
case "y":
this.dataObj = new FormatObjDateVal(numFormat_Year, nCount, true);
break;
case "M":
case "m":
this.dataObj = new FormatObjDateVal(numFormat_MonthMinute, nCount, true);
break;
case "D":
case "d":
this.dataObj = new FormatObjDateVal(numFormat_Day, nCount, true);
break;
case "H":
case "h":
this.dataObj = new FormatObjDateVal(numFormat_Hour, nCount, true);
break;
case "S":
case "s":
this.dataObj = new FormatObjDateVal(numFormat_Second, nCount, true);
break;
}
}
} else {
if ("=" == first || ">" == first || "<" == first) {
var nIndex = 1;
var sOperator = first;
if (length > 1 && (">" == first || "<" == first)) {
var second = data[1];
if ("=" == second || (">" == second && "<" == first)) {
sOperator += second;
nIndex = 2;
}
}
switch (sOperator) {
case "=":
this.operator = NumComporationOperators.equal;
break;
case ">":
this.operator = NumComporationOperators.greater;
break;
case "<":
this.operator = NumComporationOperators.less;
break;
case ">=":
this.operator = NumComporationOperators.greaterorequal;
break;
case "<=":
this.operator = NumComporationOperators.lessorequal;
break;
case "<>":
this.operator = NumComporationOperators.notequal;
break;
}
this.operatorValue = parseInt(data.substring(nIndex));
} else {
var sLowerColor = data.toLowerCase();
if ("black" == sLowerColor) {
this.color = 0;
} else {
if ("blue" == sLowerColor) {
this.color = 255;
} else {
if ("cyan" == sLowerColor) {
this.color = 65535;
} else {
if ("green" == sLowerColor) {
this.color = 65280;
} else {
if ("magenta" == sLowerColor) {
this.color = 16711935;
} else {
if ("red" == sLowerColor) {
this.color = 16711680;
} else {
if ("white" == sLowerColor) {
this.color = 16777215;
} else {
if ("yellow" == sLowerColor) {
this.color = 16776960;
}
}
}
}
}
}
}
}
}
}
}
}
};
this.parse(sData);
}
function NumFormat(bAddMinusIfNes) {
this.formatString = "";
this.length = this.formatString.length;
this.index = 0;
this.EOF = -1;
this.aRawFormat = new Array();
this.aDecFormat = new Array();
this.aFracFormat = new Array();
this.bDateTime = false;
this.bDate = false;
this.bTime = false;
this.nPercent = 0;
this.bScientific = false;
this.bThousandSep = false;
this.nThousandScale = 0;
this.bTextFormat = false;
this.bTimePeriod = false;
this.bMillisec = false;
this.bSlash = false;
this.bWhole = false;
this.bCurrency = false;
this.bNumber = false;
this.bInteger = false;
this.Color = -1;
this.ComporationOperator = null;
this.bGeneral = false;
this.bAddMinusIfNes = bAddMinusIfNes;
}
NumFormat.prototype = {
_getChar: function () {
if (this.index < this.length) {
return this.formatString[this.index];
}
return this.EOF;
},
_readChar: function () {
var curChar = this._getChar();
if (this.index < this.length) {
this.index++;
}
return curChar;
},
_skip: function (val) {
var nNewIndex = this.index + val;
if (nNewIndex >= 0 && nNewIndex < this.length) {
this.index = nNewIndex;
}
},
_addToFormat: function (type, val) {
var oFormatObj = new FormatObj(type, val);
this.aRawFormat.push(oFormatObj);
},
_addToFormat2: function (oFormatObj) {
this.aRawFormat.push(oFormatObj);
},
_ReadText: function () {
var sText = "";
while (true) {
var next = this._readChar();
if (this.EOF == next || '"' == next) {
break;
} else {
sText += next;
}
}
this._addToFormat(numFormat_Text, sText);
},
_ReadChar: function () {
var next = this._readChar();
if (this.EOF != next) {
this._addToFormat(numFormat_Text, next);
}
},
_ReadBracket: function () {
var sBracket = "";
while (true) {
var next = this._readChar();
if (this.EOF == next || "]" == next) {
break;
} else {
sBracket += next;
}
}
var oFormatObjBracket = new FormatObjBracket(sBracket);
if (null != oFormatObjBracket.operator) {
this.ComporationOperator = oFormatObjBracket;
}
this._addToFormat2(oFormatObjBracket);
},
_ReadAmPm: function (next) {
var sAm = next;
var sPm = "";
var bAm = true;
while (true) {
next = this._readChar();
if (this.EOF == next) {
break;
} else {
if ("/" == next) {
bAm = false;
} else {
if ("A" == next || "a" == next || "P" == next || "p" == next || "M" == next || "m" == next) {
if (true == bAm) {
sAm += next;
} else {
sPm += next;
}
} else {
this._skip(-1);
break;
}
}
}
}
if ("" != sAm && "" != sPm) {
this._addToFormat2(new FormatObjDateAmPm(sAm, sPm));
this.bTimePeriod = true;
this.bDateTime = true;
}
},
_parseFormat: function (format) {
while (true) {
var next = this._readChar();
if (this.EOF == next) {
break;
} else {
if ("[" == next) {
this._ReadBracket();
} else {
if ('"' == next) {
this._ReadText();
} else {
if ("\\" == next) {
this._ReadChar();
} else {
if ("%" == next) {
this._addToFormat(numFormat_Percent);
} else {
if ("$" == next || "+" == next || "-" == next || "(" == next || ")" == next || " " == next || ":" == next) {
this._addToFormat(numFormat_Text, next);
} else {
if (0 <= next && next <= 9) {
this._addToFormat(numFormat_Digit, next - 0);
} else {
if ("#" == next) {
this._addToFormat(numFormat_DigitNoDisp);
} else {
if ("?" == next) {
this._addToFormat(numFormat_DigitSpace);
} else {
if ("." == next) {
this._addToFormat(numFormat_DecimalPoint);
} else {
if ("/" == next) {
this._addToFormat2(new FormatObjDecimalFrac(new Array(), new Array()));
} else {
if ("," == next) {
this._addToFormat(numFormat_Thousand, 1);
} else {
if ("E" == next || "e" == next) {
var nextnext = this._readChar();
if (this.EOF != nextnext && "+" == nextnext || "-" == nextnext) {
var sign = ("+" == nextnext) ? SignType.Positive : SignType.Negative;
this._addToFormat2(new FormatObjScientific(next, "", sign));
}
} else {
if ("*" == next) {
var nextnext = this._readChar();
if (this.EOF != nextnext) {
this._addToFormat(numFormat_Repeat, nextnext);
}
} else {
if ("_" == next) {
var nextnext = this._readChar();
if (this.EOF != nextnext) {
this._addToFormat(numFormat_Skip, nextnext);
}
} else {
if ("@" == next) {
this._addToFormat(numFormat_TextPlaceholder);
} else {
if ("Y" == next || "y" == next) {
this._addToFormat2(new FormatObjDateVal(numFormat_Year, 1, false));
} else {
if ("M" == next || "m" == next) {
this._addToFormat2(new FormatObjDateVal(numFormat_MonthMinute, 1, false));
} else {
if ("D" == next || "d" == next) {
this._addToFormat2(new FormatObjDateVal(numFormat_Day, 1, false));
} else {
if ("H" == next || "h" == next) {
this._addToFormat2(new FormatObjDateVal(numFormat_Hour, 1, false));
} else {
if ("S" == next || "s" == next) {
this._addToFormat2(new FormatObjDateVal(numFormat_Second, 1, false));
} else {
if ("A" == next || "a" == next) {
this._ReadAmPm(next);
} else {
this._addToFormat(numFormat_Text, next);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return true;
},
_getDateTimeBracket: function (val) {
var res = null;
var length = val.length;
if (length > 0) {
var first = val[0];
if ("y" == first || "m" == first || "d" == first || "h" == first || "s" == first) {
var bSame = true;
var nCount = 1;
for (var i = 1; i < length; ++i) {
if (first != val[i]) {
bSame = false;
break;
}
nCount++;
}
if (true == bSame) {
switch (first) {
case "y":
res = new FormatObjDateVal(numFormat_Year, nCount, true);
break;
case "m":
res = new FormatObjDateVal(numFormat_MonthMinute, nCount, true);
break;
case "d":
res = new FormatObjDateVal(numFormat_Day, nCount, true);
break;
case "h":
res = new FormatObjDateVal(numFormat_Hour, nCount, true);
break;
case "s":
res = new FormatObjDateVal(numFormat_Second, nCount, true);
break;
}
}
}
}
return res;
},
_prepareFormat: function () {
for (var i = 0, length = this.aRawFormat.length; i < length; ++i) {
var oCurItem = this.aRawFormat[i];
if (numFormat_Bracket == oCurItem.type && null != oCurItem.color) {
this.Color = oCurItem.color;
}
}
var bRepeat = false;
var nFormatLength = this.aRawFormat.length;
for (var i = 0; i < nFormatLength; ++i) {
var item = this.aRawFormat[i];
if (numFormat_Repeat == item.type) {
if (false == bRepeat) {
bRepeat = true;
} else {
this.aRawFormat.splice(i, 1);
nFormatLength--;
}
} else {
if (numFormat_Bracket == item.type) {
var oNewObj = item.dataObj;
if (null != oNewObj) {
this.aRawFormat.splice(i, 1, oNewObj);
this.bDateTime = true;
if (numFormat_Hour == oNewObj.type || numFormat_Minute == oNewObj.type || numFormat_Second == oNewObj.type || numFormat_Milliseconds == oNewObj.type) {
this.bTime = true;
} else {
if (numFormat_Year == oNewObj.type || numFormat_Month == oNewObj.type || numFormat_Day == oNewObj.type) {
this.bDate = true;
}
}
}
} else {
if (numFormat_Year == item.type || numFormat_MonthMinute == item.type || numFormat_Day == item.type || numFormat_Hour == item.type || numFormat_Second == item.type || numFormat_Thousand == item.type) {
var nStartType = item.type;
var nEndIndex = i;
for (var j = i + 1; j < nFormatLength; ++j) {
if (nStartType == this.aRawFormat[j].type) {
nEndIndex = j;
} else {
break;
}
}
if (i != nEndIndex) {
item.val = nEndIndex - i + 1;
var nDelCount = item.val - 1;
this.aRawFormat.splice(i + 1, nDelCount);
nFormatLength -= nDelCount;
}
if (numFormat_Thousand != item.type) {
this.bDateTime = true;
if (numFormat_Hour == item.type || numFormat_Minute == item.type || numFormat_Second == item.type || numFormat_Milliseconds == item.type) {
this.bTime = true;
} else {
if (numFormat_Year == item.type || numFormat_Month == item.type || numFormat_Day == item.type) {
this.bDate = true;
}
}
}
} else {
if (numFormat_Scientific == item.type) {
var bAsText = false;
if (true == this.bScientific) {
bAsText = true;
} else {
var aDigitArray = new Array();
for (var j = i + 1; j < nFormatLength; ++j) {
var nextItem = this.aRawFormat[j];
if (numFormat_Digit == nextItem.type || numFormat_DigitNoDisp == nextItem.type || numFormat_DigitSpace == nextItem.type) {
aDigitArray.push(nextItem);
}
}
if (aDigitArray.length > 0) {
item.format = aDigitArray;
this.bScientific = true;
} else {
bAsText = true;
}
}
if (false != bAsText) {
item.type = numFormat_Text;
item.val = item.val + "+";
}
} else {
if (numFormat_DecimalFrac == item.type) {
var bValid = false;
var nLeft = i;
for (var j = i - 1; j >= 0; --j) {
var subitem = this.aRawFormat[j];
if (numFormat_Digit == subitem.type || numFormat_DigitNoDisp == subitem.type || numFormat_DigitSpace == subitem.type) {
nLeft = j;
} else {
break;
}
}
var nRight = i;
if (nLeft < i) {
for (var j = i + 1; j < nFormatLength; ++j) {
var subitem = this.aRawFormat[j];
if (numFormat_Digit == subitem.type || numFormat_DigitNoDisp == subitem.type || numFormat_DigitSpace == subitem.type) {
nRight = j;
} else {
break;
}
}
if (nRight > i) {
bValid = true;
item.aRight = this.aRawFormat.splice(i + 1, nRight - i);
item.aLeft = this.aRawFormat.splice(nLeft, i - nLeft);
nFormatLength -= nRight - nLeft;
i -= i - nLeft;
this.bSlash = true;
var flag = (item.aRight.length > 0) && (item.aRight[0].type == numFormat_Digit) && (item.aRight[0].val > 0);
if (flag) {
var rPart = 0;
for (var j = 0; j < item.aRight.length; j++) {
if (item.aRight[j].type == numFormat_Digit) {
rPart = rPart * 10 + item.aRight[j].val;
} else {
bValid = false;
this.bSlash = false;
break;
}
}
if (bValid == true) {
item.aRight = [];
item.aRight.push(new FormatObj(numFormat_Digit, rPart));
item.bNumRight = true;
}
}
}
}
if (false == bValid) {
item.type = numFormat_Text;
item.val = "/";
}
}
}
}
}
}
}
var nReadState = FormatStates.Decimal;
var bDecimal = true;
nFormatLength = this.aRawFormat.length;
for (var i = 0; i < nFormatLength; ++i) {
var item = this.aRawFormat[i];
if (numFormat_DecimalPoint == item.type) {
if (this.bDateTime) {
var nStartIndex = i;
var nEndIndex = nStartIndex;
for (var j = i + 1; j < nFormatLength; ++j) {
var subItem = this.aRawFormat[j];
if (numFormat_Digit == subItem.type) {
nEndIndex = j;
} else {
break;
}
}
if (nStartIndex < nEndIndex) {
var nDigCount = nEndIndex - nStartIndex;
var oNewItem = new FormatObjDateVal(numFormat_Milliseconds, nDigCount, false);
var nDelCount = nDigCount;
oNewItem.format = this.aRawFormat.splice(i + 1, nDelCount, oNewItem);
nFormatLength -= (nDigCount - 1);
i++;
this.bMillisec = true;
}
item.type = numFormat_Text;
item.val = ".";
} else {
if (FormatStates.Decimal == nReadState) {
nReadState = FormatStates.Frac;
}
}
} else {
if (numFormat_MonthMinute == item.type) {
var bRightCond = false;
for (var j = i + 1; j < nFormatLength; ++j) {
var subItem = this.aRawFormat[j];
if (numFormat_Year == subItem.type || numFormat_Month == subItem.type || numFormat_Day == subItem.type || numFormat_MonthMinute == subItem.type || numFormat_Hour == subItem.type || numFormat_Minute == subItem.type || numFormat_Second == subItem.type || numFormat_Milliseconds == subItem.type) {
if (numFormat_Second == subItem.type) {
bRightCond = true;
}
break;
}
}
var bLeftCond = false;
if (false == bRightCond) {
var bFindSec = false;
for (var j = i - 1; j >= 0; --j) {
var subItem = this.aRawFormat[j];
if (numFormat_Hour == subItem.type) {
bLeftCond = true;
break;
} else {
if (numFormat_Second == subItem.type) {
bFindSec = true;
} else {
if (numFormat_Minute == subItem.type || numFormat_Month == subItem.type || numFormat_MonthMinute == subItem.type) {
if (true == bFindSec && numFormat_Minute == subItem.type) {
bFindSec = false;
}
break;
} else {
if (numFormat_Year == subItem.type || numFormat_Day == subItem.type || numFormat_Hour == subItem.type || numFormat_Second == subItem.type || numFormat_Milliseconds == subItem.type) {
if (true == bFindSec) {
break;
}
}
}
}
}
}
if (true == bFindSec) {
bLeftCond = true;
}
}
if (true == bLeftCond || true == bRightCond) {
item.type = numFormat_Minute;
this.bTime = true;
} else {
item.type = numFormat_Month;
this.bDate = true;
}
} else {
if (numFormat_Percent == item.type) {
this.nPercent++;
item.type = numFormat_Text;
item.val = "%";
} else {
if (numFormat_Thousand == item.type) {
if (FormatStates.Decimal == nReadState) {
var bStartCondition = false;
if (i > 0) {
var prevItem = this.aRawFormat[i - 1];
if (numFormat_Digit == prevItem.type || numFormat_DigitNoDisp == prevItem.type || numFormat_DigitSpace == prevItem.type) {
bStartCondition = true;
}
}
var bEndCondition = false;
if (i + 1 < nFormatLength) {
var nextItem = this.aRawFormat[i + 1];
if (numFormat_Digit == nextItem.type || numFormat_DigitNoDisp == nextItem.type || numFormat_DigitSpace == nextItem.type) {
bEndCondition = true;
}
}
if (true == bStartCondition && true == bEndCondition) {
this.bThousandSep = true;
} else {
if (bEndCondition == true) {
item.type = numFormat_Text;
item.val = ",";
}
}
}
var bStartCondition = false;
if (i > 0) {
var prevItem = this.aRawFormat[i - 1];
if (numFormat_Digit == prevItem.type || numFormat_DigitNoDisp == prevItem.type || numFormat_DigitSpace == prevItem.type) {
bStartCondition = true;
}
}
var bEndCondition = true;
for (var j = i + 1; j < nFormatLength; ++j) {
var nextItem = this.aRawFormat[j];
if (numFormat_Digit == nextItem.type || numFormat_DigitNoDisp == nextItem.type || numFormat_DigitSpace == nextItem.type || numFormat_DecimalPoint == nextItem.type) {
bEndCondition = false;
break;
}
}
if (true == bStartCondition && true == bEndCondition) {
this.nThousandScale = item.val;
}
} else {
if (numFormat_Digit == item.type || numFormat_DigitNoDisp == item.type || numFormat_DigitSpace == item.type) {
if (FormatStates.Decimal == nReadState) {
this.aDecFormat.push(item);
if (this.bSlash === true) {
this.bWhole = true;
}
} else {
if (FormatStates.Frac == nReadState) {
this.aFracFormat.push(item);
}
}
} else {
if (numFormat_Scientific == item.type) {
nReadState = FormatStates.Scientific;
} else {
if (numFormat_TextPlaceholder == item.type) {
this.bTextFormat = true;
}
}
}
}
}
}
}
}
return true;
},
_calsScientific: function (nDecLen, nRealExp) {
var nKoef = 0;
if (true == this.bThousandSep) {
nKoef = 4;
}
if (nDecLen > nKoef) {
nKoef = nDecLen;
}
if (nRealExp > 0 && nKoef > 0) {
var nTemp = nRealExp % nKoef;
if (0 == nTemp) {
nTemp = nKoef;
}
nKoef = nTemp;
}
return nKoef;
},
_parseNumber: function (number, aDecFormat, nFracLen, nValType) {
var res = {
bDigit: false,
dec: 0,
frac: 0,
exponent: 0,
exponentFrac: 0,
scientific: 0,
sign: SignType.Positive,
date: new Object()
};
if (CellValueType.String != nValType) {
res.bDigit = (number == number - 0);
}
if (res.bDigit) {
var parts = getNumberParts(number);
res.sign = parts.sign;
var nRealExp = gc_nMaxDigCount + parts.exponent;
if (SignType.Null != parts.sign) {
if (true == this.bScientific) {
var nKoef = this._calsScientific(aDecFormat.length, nRealExp);
res.scientific = nRealExp - nKoef;
nRealExp = nKoef;
} else {
for (var i = 0; i < this.nPercent; ++i) {
nRealExp += 2;
}
for (var i = 0; i < this.nThousandScale; ++i) {
nRealExp -= 3;
}
}
if (false == this.bSlash) {
var nOldRealExp = nRealExp;
var dTemp = parts.mantissa * Math.pow(10, nFracLen + nRealExp - gc_nMaxDigCount);
dTemp = Math.round(dTemp);
dTemp /= Math.pow(10, nFracLen);
parts = getNumberParts(dTemp);
if (SignType.Null != parts.sign) {
nRealExp = gc_nMaxDigCount + parts.exponent;
if (nOldRealExp != nRealExp && true == this.bScientific) {
var nKoef = this._calsScientific(aDecFormat.length, nRealExp);
res.scientific += nRealExp - nOldRealExp;
nRealExp = nKoef;
}
}
}
res.exponent = nRealExp;
res.exponentFrac = nRealExp;
if (nRealExp > 0 && nRealExp < gc_nMaxDigCount) {
var sNumber = parts.mantissa.toString();
var nExponentFrac = 0;
for (var i = nRealExp, length = sNumber.length; i < length; ++i) {
if ("0" == sNumber[i]) {
nExponentFrac++;
} else {
break;
}
}
if (nRealExp + nExponentFrac < sNumber.length) {
res.exponentFrac = -nExponentFrac;
}
}
if (SignType.Null != parts.sign) {
if (nRealExp <= 0) {
if (this.bSlash == true) {
res.dec = 0;
res.frac = parts.mantissa;
} else {
if (nFracLen > 0) {
res.dec = 0;
res.frac = 0;
if (nFracLen + nRealExp > 0) {
var sTemp = parts.mantissa.toString();
res.frac = sTemp.substring(0, nFracLen + nRealExp) - 0;
}
} else {
res.dec = 0;
res.frac = 0;
}
}
} else {
if (nRealExp >= gc_nMaxDigCount) {
res.dec = parts.mantissa;
res.frac = 0;
} else {
var sTemp = parts.mantissa.toString();
if (this.bSlash == true) {
res.dec = sTemp.substring(0, nRealExp) - 0;
if (nRealExp < sTemp.length) {
res.frac = sTemp.substring(nRealExp) - 0;
} else {
res.frac = 0;
}
} else {
if (nFracLen > 0) {
res.dec = sTemp.substring(0, nRealExp) - 0;
res.frac = 0;
var nStart = nRealExp;
var nEnd = nRealExp + nFracLen;
if (nStart < sTemp.length) {
res.frac = sTemp.substring(nStart, nEnd) - 0;
}
} else {
res.dec = sTemp.substring(0, nRealExp) - 0;
res.frac = 0;
}
}
}
}
}
if (0 == res.frac && 0 == res.dec) {
res.sign = SignType.Null;
}
}
if (this.bDateTime === true) {
res.date = this.parseDate(number);
}
}
return res;
},
parseDate: function (number) {
var d = {
val: 0,
coeff: 1
},
h = {
val: 0,
coeff: 24
},
min = {
val: 0,
coeff: 60
},
s = {
val: 0,
coeff: 60
},
ms = {
val: 0,
coeff: 1000
};
var tmp = +number;
var ttimes = [d, h, min, s, ms];
for (var i = 0; i < 4; i++) {
var v = tmp * ttimes[i].coeff;
ttimes[i].val = Math.floor(v);
tmp = v - ttimes[i].val;
}
ms.val = Math.round(tmp * 1000);
for (i = 4; i > 0 && (ttimes[i].val === ttimes[i].coeff); i--) {
ttimes[i].val = 0;
ttimes[i - 1].val++;
}
var stDate, day, month, year, dayWeek;
if (g_bDate1904) {
stDate = new Date(Date.UTC(1904, 0, 1, 0, 0, 0));
if (d.val) {
stDate.setUTCDate(stDate.getUTCDate() + d.val);
}
day = stDate.getUTCDate();
dayWeek = (stDate.getUTCDay() > 0) ? stDate.getUTCDay() - 1 : 6;
month = stDate.getUTCMonth();
year = stDate.getUTCFullYear();
} else {
if (number === 60) {
day = 29;
month = 1;
year = 1900;
dayWeek = 3;
} else {
if (number < 60) {
stDate = new Date(Date.UTC(1899, 11, 31, 0, 0, 0));
if (d.val) {
stDate.setUTCDate(stDate.getUTCDate() + d.val);
}
day = stDate.getUTCDate();
dayWeek = (stDate.getUTCDay() > 0) ? stDate.getUTCDay() - 1 : 6;
month = stDate.getUTCMonth();
year = stDate.getUTCFullYear();
} else {
stDate = new Date(Date.UTC(1899, 11, 30, 0, 0, 0));
if (d.val) {
stDate.setUTCDate(stDate.getUTCDate() + d.val);
}
day = stDate.getUTCDate();
dayWeek = stDate.getUTCDay();
month = stDate.getUTCMonth();
year = stDate.getUTCFullYear();
}
}
}
return {
d: day,
month: month,
year: year,
dayWeek: dayWeek,
hour: h.val,
min: min.val,
sec: s.val,
ms: ms.val,
countDay: d.val
};
},
_FormatNumber: function (number, exponent, format, nReadState) {
var aRes = new Array();
var aNoDisplay = new Array();
var nFormatLen = format.length;
if (nFormatLen > 0) {
if (FormatStates.Frac != nReadState) {
var sNumber = number + "";
var nNumberLen = sNumber.length;
if (exponent > nNumberLen) {
for (var i = 0; i < exponent - nNumberLen; ++i) {
sNumber += "0";
}
nNumberLen = sNumber.length;
}
var bIsNUll = false;
if ("0" == sNumber) {
bIsNUll = true;
}
if (nNumberLen > nFormatLen) {
if (false == bIsNUll) {
var nSplitIndex = nNumberLen - nFormatLen + 1;
aRes.push(new FormatObj(numFormat_Text, sNumber.slice(0, nSplitIndex)));
sNumber = sNumber.substring(nSplitIndex);
format.shift();
}
} else {
if (nNumberLen < nFormatLen) {
for (var i = 0, length = nFormatLen - nNumberLen; i < length; ++i) {
var item = format.shift();
aRes.push(new FormatObj(item.type));
}
}
}
var bFirstNotNull = false;
for (var i = 0, length = sNumber.length; i < length; ++i) {
var sCurNumber = sNumber[i];
var item = format.shift();
if (true == bIsNUll && null != item && numFormat_DigitNoDisp == item.type && FormatStates.Scientific != nReadState) {
sCurNumber = "";
}
aRes.push(new FormatObj(numFormat_Text, sCurNumber));
}
if (true == this.bThousandSep && FormatStates.Slash != nReadState) {
var nIndex = 0;
for (var i = aRes.length - 1; i >= 0; --i) {
var item = aRes[i];
if (numFormat_Text == item.type) {
var aNewText = new Array();
var nTextLength = item.val.length;
for (var j = nTextLength - 1; j >= 0; --j) {
if (3 == nIndex) {
aNewText.push(",");
nTextLength++;
}
aNewText.push(item.val[j]);
if (0 != j) {
nIndex++;
if (4 == nIndex) {
nIndex = 1;
}
}
}
if (nTextLength > 1) {
aNewText.reverse();
}
item.val = aNewText.join("");
} else {
if (numFormat_DigitNoDisp != item.type) {
if (3 == nIndex) {
item.val = ",";
aRes[i] = item;
}
}
}
nIndex++;
if (4 == nIndex) {
nIndex = 1;
}
}
}
} else {
var val = number;
var exp = exponent;
var nStartNulls = 0;
if (exp < 0) {
nStartNulls = Math.abs(exp);
}
var sNumber = val.toString();
var nNumberLen = sNumber.length;
var nLastNoNull = nNumberLen;
for (var i = nNumberLen - 1; i >= 0; --i) {
if ("0" != sNumber[i]) {
break;
}
nLastNoNull = i;
}
if (nLastNoNull < nNumberLen) {
sNumber = sNumber.substring(0, nLastNoNull);
nNumberLen = sNumber.length;
}
for (var i = 0; i < nStartNulls; ++i) {
aRes.push(new FormatObj(numFormat_Text, "0"));
}
for (var i = 0, length = nNumberLen; i < length; ++i) {
aRes.push(new FormatObj(numFormat_Text, sNumber[i]));
}
for (var i = nNumberLen + nStartNulls; i < nFormatLen; ++i) {
var item = format[i];
aRes.push(new FormatObj(item.type));
}
}
}
return aRes;
},
_AddDigItem: function (res, oCurText, item) {
if (numFormat_Text == item.type) {
oCurText.text += item.val;
} else {
if (numFormat_Digit == item.type) {
oCurText.text += "0";
if (null != item.val) {
oCurText.text += item.val;
}
} else {
if (numFormat_DigitNoDisp == item.type) {
oCurText.text += "";
if (null != item.val) {
oCurText.text += item.val;
}
} else {
if (numFormat_DigitSpace == item.type) {
var oNewFont = new Font();
oNewFont.clean();
oNewFont.skip = true;
this._CommitText(res, oCurText, "0", oNewFont);
if (null != item.val) {
oCurText.text += item.val;
}
}
}
}
}
},
_ZeroPad: function (n) {
return (n < 10) ? "0" + n : n;
},
_CommitText: function (res, oCurText, textVal, format) {
if (null != oCurText && oCurText.text.length > 0) {
this._CommitText(res, null, oCurText.text, null);
oCurText.text = "";
}
if (null != textVal && textVal.length > 0) {
var length = res.length;
var prev = null;
if (length > 0) {
prev = res[length - 1];
}
if (-1 != this.Color) {
if (null == format) {
format = new Font();
format.clean();
}
format.c = new RgbColor(this.Color);
}
if (null != prev && ((null == prev.format && null == format) || (null != prev.format && null != format && format.isEqual(prev.format)))) {
prev.text += textVal;
} else {
if (null == format) {
prev = {
text: textVal
};
} else {
prev = {
text: textVal,
format: format
};
}
res.push(prev);
}
}
},
setFormat: function (format) {
this.formatString = format;
this.length = this.formatString.length;
if ("general" == this.formatString.toLowerCase()) {
this.valid = true;
this.bGeneral = true;
return true;
} else {
this.valid = this._parseFormat();
if (true == this.valid) {
this.valid = this._prepareFormat();
if (this.valid) {
var aCurrencySymbols = ["$", "€", "£", "¥", "р."];
var sText = "";
for (var i = 0, length = this.aRawFormat.length; i < length; ++i) {
var item = this.aRawFormat[i];
if (numFormat_Text == item.type) {
sText += item.val;
} else {
if (numFormat_Bracket == item.type) {
if (null != item.CurrencyString) {
sText += item.CurrencyString;
}
} else {
if (numFormat_DecimalPoint == item.type) {
sText += ".";
}
}
}
}
if ("" != sText) {
for (var i = 0, length = aCurrencySymbols.length; i < length; ++i) {
if (-1 != sText.indexOf(aCurrencySymbols[i])) {
this.bCurrency = true;
break;
}
}
}
var rxNumber = new RegExp("^[0#?]+(.[0#?]+)?$");
var match = this.formatString.match(rxNumber);
if (null != match) {
if (null != match[1]) {
this.bNumber = true;
} else {
this.bInteger = true;
}
}
}
}
return this.valid;
}
},
isInvalidDateValue: function (number) {
return (number == number - 0) && ((number < 0 && false == g_bDate1904) || number > 2958465.9999884);
},
format: function (number, nValType, dDigitsCount, oAdditionalResult) {
if (null == nValType) {
nValType = CellValueType.Number;
}
var res = new Array();
var oCurText = {
text: ""
};
if (true == this.valid) {
if (true === this.bDateTime) {
if (this.isInvalidDateValue(number)) {
var oNewFont = new Font();
oNewFont.clean();
oNewFont.repeat = true;
this._CommitText(res, null, "#", oNewFont);
return res;
}
}
var oParsedNumber = this._parseNumber(number, this.aDecFormat, this.aFracFormat.length, nValType);
if (true == this.bGeneral || (true == oParsedNumber.bDigit && true == this.bTextFormat) || (false == oParsedNumber.bDigit && false == this.bTextFormat)) {
if (null != oAdditionalResult) {
oAdditionalResult.bGeneral = true;
}
var sGeneral = DecodeGeneralFormat(number, nValType, dDigitsCount);
if (null != sGeneral) {
numFormat = oNumFormatCache.get(sGeneral);
if (null != numFormat) {
return numFormat.format(number, nValType, dDigitsCount, oAdditionalResult);
}
}
return [{
text: number
}];
}
var aDec = new Array();
var aFrac = new Array();
var aScientific = new Array();
if (true == oParsedNumber.bDigit) {
aDec = this._FormatNumber(oParsedNumber.dec, oParsedNumber.exponent, this.aDecFormat.concat(), FormatStates.Decimal);
aFrac = this._FormatNumber(oParsedNumber.frac, oParsedNumber.exponentFrac, this.aFracFormat.concat(), FormatStates.Frac);
}
if (true == this.bAddMinusIfNes && SignType.Negative == oParsedNumber.sign) {
oCurText.text += "-";
}
var bNoDecFormat = false;
if (null == aDec || 0 == aDec.length && 0 != oParsedNumber.dec) {
bNoDecFormat = true;
}
var nReadState = FormatStates.Decimal;
var nFormatLength = this.aRawFormat.length;
for (var i = 0; i < nFormatLength; ++i) {
var item = this.aRawFormat[i];
if (numFormat_Bracket == item.type) {
if (null != item.CurrencyString) {
oCurText.text += item.CurrencyString;
}
} else {
if (numFormat_DecimalPoint == item.type) {
if (bNoDecFormat && null != oParsedNumber.dec && FormatStates.Decimal == nReadState) {
oCurText.text += oParsedNumber.dec;
}
oCurText.text += ".";
nReadState = FormatStates.Frac;
} else {
if (numFormat_Digit == item.type || numFormat_DigitNoDisp == item.type || numFormat_DigitSpace == item.type) {
var text = null;
if (nReadState == FormatStates.Decimal) {
text = aDec.shift();
} else {
if (nReadState == FormatStates.Frac) {
text = aFrac.shift();
} else {
if (nReadState == FormatStates.Scientific) {
text = aScientific.shift();
}
}
}
if (null != text) {
this._AddDigItem(res, oCurText, text);
}
} else {
if (numFormat_Text == item.type) {
oCurText.text += item.val;
} else {
if (numFormat_TextPlaceholder == item.type) {
oCurText.text += number;
} else {
if (numFormat_Scientific == item.type) {
if (null != item.format) {
oCurText.text += item.val;
if (oParsedNumber.scientific < 0) {
oCurText.text += "-";
} else {
if (item.sign == SignType.Positive) {
oCurText.text += "+";
}
}
aScientific = this._FormatNumber(Math.abs(oParsedNumber.scientific), 0, item.format.concat(), FormatStates.Scientific);
nReadState = FormatStates.Scientific;
}
} else {
if (numFormat_DecimalFrac == item.type) {
if (oParsedNumber.frac !== 0 || this.bWhole === false) {
var frac = oParsedNumber.frac;
var fracExp = -frac.toString().length;
if (oParsedNumber.exponent < 0) {
fracExp -= oParsedNumber.exponent;
}
frac *= Math.pow(10, fracExp);
var numerator;
var denominator;
if (item.bNumRight === true) {
denominator = item.aRight[0].val;
numerator = Math.round(denominator * frac);
if (this.bWhole === false) {
numerator += denominator * oParsedNumber.dec;
}
} else {
if (frac == 0) {
numerator = oParsedNumber.dec;
denominator = 1;
} else {
var d = n = frac;
var a0 = 0,
a1 = 1;
var b0 = 1,
b1 = 0;
var eps = Math.pow(10, -15),
arr = Math.pow(10, item.aRight.length),
delta = 1,
a = 0,
b = 0;
while ((b < arr) && (delta > eps)) {
N = Math.floor(d);
a = N * a1 + a0;
b = N * b1 + b0;
a0 = a1;
a1 = a;
b0 = b1;
b1 = b;
d = 1 / (d - N);
delta = Math.abs(n - a / b);
}
if (b > arr || b == arr) {
numerator = a0;
denominator = b0;
} else {
numerator = a;
denominator = b;
}
if (this.bWhole === false) {
numerator += denominator * oParsedNumber.dec;
}
}
}
var aLeft = this._FormatNumber(numerator, 0, item.aLeft.concat(), FormatStates.Slash);
for (var j = 0, length = aLeft.length; j < length; ++j) {
var subitem = aLeft[j];
if (numFormat_Text == subitem.type) {
oCurText.text += subitem.val;
} else {
this._AddDigItem(res, oCurText, subitem);
}
}
oCurText.text += "/";
if (item.bNumRight === true) {
oCurText.text += item.aRight[0].val;
} else {
var aRight = this._FormatNumber(denominator, 0, item.aRight.concat(), FormatStates.Slash);
for (var j = 0, length = aRight.length; j < length; ++j) {
var subitem = aRight[j];
if (numFormat_Text == subitem.type) {
oCurText.text += subitem.val;
} else {
this._AddDigItem(res, oCurText, subitem);
}
}
}
}
} else {
if (numFormat_Repeat == item.type) {
var oNewFont = new Font();
oNewFont.clean();
oNewFont.repeat = true;
this._CommitText(res, oCurText, item.val, oNewFont);
} else {
if (numFormat_Skip == item.type) {
var oNewFont = new Font();
oNewFont.clean();
oNewFont.skip = true;
this._CommitText(res, oCurText, item.val, oNewFont);
} else {
if (numFormat_Year == item.type) {
if (item.val == 2) {
oCurText.text += (oParsedNumber.date.year + "").substring(2);
} else {
if (item.val == 4) {
oCurText.text += oParsedNumber.date.year;
}
}
} else {
if (numFormat_Month == item.type) {
var m = oParsedNumber.date.month;
if (item.val == 1) {
oCurText.text += m + 1;
} else {
if (item.val == 2) {
oCurText.text += this._ZeroPad(m + 1);
} else {
if (item.val == 3) {
oCurText.text += monthCut[m];
} else {
if (item.val == 4) {
oCurText.text += month[m];
} else {
if (item.val == 5) {
oCurText.text += monthShort[m];
}
}
}
}
}
} else {
if (numFormat_Day == item.type) {
if (item.val == 1) {
oCurText.text += oParsedNumber.date.d;
} else {
if (item.val == 2) {
oCurText.text += this._ZeroPad(oParsedNumber.date.d);
} else {
if (item.val == 3) {
oCurText.text += dayShort[oParsedNumber.date.dayWeek];
} else {
if (item.val == 4) {
oCurText.text += day[oParsedNumber.date.dayWeek];
}
}
}
}
} else {
if (numFormat_Hour == item.type) {
var h = oParsedNumber.date.hour;
if (item.bElapsed === true) {
h = oParsedNumber.date.countDay * 24 + oParsedNumber.date.hour;
}
if (this.bTimePeriod === true) {
h = h % 12 || 12;
}
if (item.val == 1) {
oCurText.text += h;
} else {
if (item.val == 2) {
oCurText.text += this._ZeroPad(h);
}
}
} else {
if (numFormat_Minute == item.type) {
var min = oParsedNumber.date.min;
if (item.bElapsed === true) {
min = oParsedNumber.date.countDay * 24 * 60 + oParsedNumber.date.hour * 60 + oParsedNumber.date.min;
}
if (item.val == 1) {
oCurText.text += min;
} else {
if (item.val == 2) {
oCurText.text += this._ZeroPad(min);
}
}
} else {
if (numFormat_Second == item.type) {
var s = oParsedNumber.date.sec;
if (this.bMillisec === false) {
s = oParsedNumber.date.sec + Math.round(oParsedNumber.date.ms / 1000);
}
if (item.bElapsed === true) {
s = oParsedNumber.date.countDay * 24 * 60 * 60 + oParsedNumber.date.hour * 60 * 60 + oParsedNumber.date.min * 60 + s;
}
if (item.val == 1) {
oCurText.text += s;
} else {
if (item.val == 2) {
oCurText.text += this._ZeroPad(s);
}
}
} else {
if (numFormat_AmPm == item.type) {
oCurText.text += (oParsedNumber.date.hour < 12) ? item.sAm : item.sPm;
} else {
if (numFormat_Milliseconds == item.type) {
var nMsFormatLength = item.format.length;
var dMs = oParsedNumber.date.ms;
if (nMsFormatLength < 3) {
var dTemp = dMs / Math.pow(10, 3 - nMsFormatLength);
dTemp = Math.round(dTemp);
dMs = dTemp * Math.pow(10, 3 - nMsFormatLength);
}
var nExponent = 0;
if (dMs < 10) {
nExponent = -2;
} else {
if (dMs < 100) {
nExponent = -1;
}
}
var aMilSec = this._FormatNumber(dMs, nExponent, item.format.concat(), FormatStates.Frac);
for (var k = 0; k < aMilSec.length; k++) {
this._AddDigItem(res, oCurText, aMilSec[k]);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
this._CommitText(res, oCurText, null, null);
if (0 == res.length) {
res = [{
text: ""
}];
}
} else {
if (0 == res.length) {
res = [{
text: number
}];
}
}
return res;
},
toString: function (output, nShift) {
var bRes = true;
if (this.bDateTime || this.bSlash || this.bTextFormat || (nShift < 0 && 0 == this.aFracFormat.length)) {
return false;
}
var nDecLength = this.aDecFormat.length;
var nDecIndex = 0;
var nFracLength = this.aFracFormat.length;
var nFracIndex = 0;
var nNewFracLength = nFracLength + nShift;
if (nNewFracLength < 0) {
nNewFracLength = 0;
}
var nReadState = FormatStates.Decimal;
var res = "";
var fFormatToString = function (aFormat) {
var res = "";
for (var i = 0, length = aFormat.length; i < length; ++i) {
var item = aFormat[i];
if (numFormat_Digit == item.type) {
if (null != item.val) {
res += item.val;
} else {
res += "0";
}
} else {
if (numFormat_DigitNoDisp == item.type) {
res += "#";
} else {
if (numFormat_DigitSpace == item.type) {
res += "?";
}
}
}
}
return res;
};
if (null != this.Color) {
switch (this.Color) {
case 0:
res += "[Black]";
break;
case 255:
res += "[Blue]";
break;
case 65535:
res += "[Cyan]";
break;
case 65280:
res += "[Green]";
break;
case 16711935:
res += "[Magenta]";
break;
case 16711680:
res += "[Red]";
break;
case 16777215:
res += "[White]";
break;
case 16776960:
res += "[Yellow]";
break;
}
}
if (null != this.ComporationOperator) {
switch (this.ComporationOperator.operator) {
case NumComporationOperators.equal:
res += "[=" + this.ComporationOperator.operatorValue + "]";
break;
case NumComporationOperators.greater:
res += "[>" + this.ComporationOperator.operatorValue + "]";
break;
case NumComporationOperators.less:
res += "[<" + this.ComporationOperator.operatorValue + "]";
break;
case NumComporationOperators.greaterorequal:
res += "[>=" + this.ComporationOperator.operatorValue + "]";
break;
case NumComporationOperators.lessorequal:
res += "[<=" + this.ComporationOperator.operatorValue + "]";
break;
case NumComporationOperators.notequal:
res += "[<>" + this.ComporationOperator.operatorValue + "]";
break;
}
}
var bAddThousandSep = this.bThousandSep;
var nThousandScale = this.nThousandScale;
var nFormatLength = this.aRawFormat.length;
for (var i = 0; i < nFormatLength; ++i) {
var item = this.aRawFormat[i];
if (numFormat_Bracket == item.type) {
if (null != item.CurrencyString || null != item.Lid) {
res += "[$";
if (null != item.CurrencyString) {
res += item.CurrencyString;
}
res += "-";
if (null != item.Lid) {
res += item.Lid;
}
res += "]";
}
} else {
if (numFormat_DecimalPoint == item.type) {
nReadState = FormatStates.Frac;
if (0 != nNewFracLength && 0 != nShift) {
res += ".";
}
} else {
if (numFormat_Thousand == item.type) {
for (var j = 0; j < item.val; ++j) {
res += ",";
}
} else {
if (numFormat_Digit == item.type || numFormat_DigitNoDisp == item.type || numFormat_DigitSpace == item.type) {
if (FormatStates.Decimal == nReadState) {
nDecIndex++;
} else {
nFracIndex++;
}
if (nReadState == FormatStates.Frac && nFracIndex > nNewFracLength) {} else {
var sCurSimbol;
if (numFormat_Digit == item.type) {
sCurSimbol = "0";
} else {
if (numFormat_DigitNoDisp == item.type) {
sCurSimbol = "#";
} else {
if (numFormat_DigitSpace == item.type) {
sCurSimbol = "?";
}
}
}
res += sCurSimbol;
if (nReadState == FormatStates.Frac && nFracIndex == nFracLength) {
for (var j = 0; j < nShift; ++j) {
res += sCurSimbol;
}
}
}
if (0 == nFracLength && nShift > 0 && FormatStates.Decimal == nReadState && nDecIndex == nDecLength) {
res += ".";
for (var j = 0; j < nShift; ++j) {
res += "0";
}
}
} else {
if (numFormat_Text == item.type) {
if ("%" == item.val) {
res += item.val;
} else {
res += '"' + item.val + '"';
}
} else {
if (numFormat_TextPlaceholder == item.type) {
res += "@";
} else {
if (numFormat_Scientific == item.type) {
nReadState = FormatStates.Scientific;
res += item.val;
if (item.sign == SignType.Positive) {
res += "+";
} else {
res += "-";
}
} else {
if (numFormat_DecimalFrac == item.type) {
res += fFormatToString(item.aLeft);
res += "/";
res += fFormatToString(item.aRight);
} else {
if (numFormat_Repeat == item.type) {
res += "*" + item.val;
} else {
if (numFormat_Skip == item.type) {
res += "_" + item.val;
} else {
if (numFormat_Year == item.type) {
for (var j = 0; j < item.val; ++j) {
res += "y";
}
} else {
if (numFormat_Month == item.type) {
for (var j = 0; j < item.val; ++j) {
res += "m";
}
} else {
if (numFormat_Day == item.type) {
for (var j = 0; j < item.val; ++j) {
res += "d";
}
} else {
if (numFormat_Hour == item.type) {
for (var j = 0; j < item.val; ++j) {
res += "h";
}
} else {
if (numFormat_Minute == item.type) {
for (var j = 0; j < item.val; ++j) {
res += "m";
}
} else {
if (numFormat_Second == item.type) {
for (var j = 0; j < item.val; ++j) {
res += "s";
}
} else {
if (numFormat_AmPm == item.type) {
res += item.sAm + "/" + item.sPm;
} else {
if (numFormat_Milliseconds == item.type) {
res += fFormatToString(item.format);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
output.format = res;
return true;
},
getType: function () {
var nType = c_oAscNumFormatType.Custom;
if (this.bGeneral) {
nType = c_oAscNumFormatType.General;
} else {
if (this.bTextFormat) {
nType = c_oAscNumFormatType.Text;
} else {
if (this.bDateTime) {
if (this.bDate) {
nType = c_oAscNumFormatType.Date;
} else {
nType = c_oAscNumFormatType.Time;
}
} else {
if (this.nPercent > 0) {
nType = c_oAscNumFormatType.Percent;
} else {
if (this.bScientific) {
nType = c_oAscNumFormatType.Scientific;
} else {
if (this.bCurrency) {
nType = c_oAscNumFormatType.Currency;
} else {
if (this.bSlash) {
nType = c_oAscNumFormatType.Fraction;
} else {
if (this.bNumber) {
nType = c_oAscNumFormatType.Number;
} else {
if (this.bInteger) {
nType = c_oAscNumFormatType.Integer;
}
}
}
}
}
}
}
}
}
return nType;
}
};
function NumFormatCache() {
this.oNumFormats = new Object();
}
NumFormatCache.prototype = {
get: function (format) {
var res = this.oNumFormats[format];
if (null == res) {
res = new CellFormat(format);
this.oNumFormats[format] = res;
}
return res;
},
set: function (format) {
var res = new CellFormat(format);
this.oNumFormats[format] = res;
}
};
oNumFormatCache = new NumFormatCache();
function CellFormat(format) {
this.sFormat = format;
this.oPositiveFormat = null;
this.oNegativeFormat = null;
this.oNullFormat = null;
this.oTextFormat = null;
this.aComporationFormats = null;
var aFormats = format.split(";");
var nFormatsLength = aFormats.length;
var aParsedFormats = new Array();
for (var i = 0; i < nFormatsLength; ++i) {
var oNewFormat = new NumFormat(false);
oNewFormat.setFormat(aFormats[i]);
aParsedFormats.push(oNewFormat);
}
var bComporationOperator = false;
if (nFormatsLength > 0) {
var oFirstFormat = aParsedFormats[0];
if (null != oFirstFormat.ComporationOperator) {
bComporationOperator = true;
if (3 == nFormatsLength) {
var oPositive = null;
var oNegative = null;
var oNull = null;
for (var i = 0; i < nFormatsLength; ++i) {
var oCurFormat = aParsedFormats[i];
if (null == oCurFormat.ComporationOperator) {
if (null == oPositive) {
oPositive = oCurFormat;
} else {
if (null == oNegative) {
oNegative = oCurFormat;
} else {
if (null == oNull) {
oNull = oCurFormat;
}
}
}
} else {
var oComporationOperator = oCurFormat.ComporationOperator;
if (0 == oComporationOperator.operatorValue) {
switch (oComporationOperator.operator) {
case NumComporationOperators.greater:
oPositive = oCurFormat;
break;
case NumComporationOperators.less:
oNegative = oCurFormat;
break;
case NumComporationOperators.equal:
oNull = oCurFormat;
break;
}
} else {
oPositive = oNegative = oNull = null;
break;
}
}
}
}
2014-08-21 11:21:20 +00:00
this.oTextFormat = new NumFormat(false);
this.oTextFormat.setFormat("@");
2014-07-05 18:22:49 +00:00
if (null == oPositive || null == oNegative || null == oNull) {
for (var i = 0, length = aParsedFormats.length; i < length; ++i) {
var oCurFormat = aParsedFormats[i];
if (null == oCurFormat.ComporationOperator) {
oCurFormat.bAddMinusIfNes = true;
} else {
var oComporationOperator = oCurFormat.ComporationOperator;
if (0 < oComporationOperator.operatorValue && (oComporationOperator.operator == NumComporationOperators.less || oComporationOperator.operator == NumComporationOperators.lessorequal)) {
oCurFormat.bAddMinusIfNes = true;
} else {
if (0 > oComporationOperator.operatorValue && (oComporationOperator.operator == NumComporationOperators.greater || oComporationOperator.operator == NumComporationOperators.greaterorequal)) {
oCurFormat.bAddMinusIfNes = true;
}
}
}
}
this.aComporationFormats = aParsedFormats;
} else {
this.oPositiveFormat = oPositive;
this.oNegativeFormat = oNegative;
this.oNullFormat = oNull;
}
}
}
if (false == bComporationOperator) {
if (4 <= nFormatsLength) {
this.oPositiveFormat = aParsedFormats[0];
this.oNegativeFormat = aParsedFormats[1];
this.oNullFormat = aParsedFormats[2];
this.oTextFormat = aParsedFormats[3];
} else {
if (3 == nFormatsLength) {
this.oPositiveFormat = aParsedFormats[0];
this.oNegativeFormat = aParsedFormats[1];
this.oNullFormat = aParsedFormats[2];
this.oTextFormat = this.oPositiveFormat;
} else {
if (2 == nFormatsLength) {
this.oPositiveFormat = aParsedFormats[0];
this.oNegativeFormat = aParsedFormats[1];
this.oNullFormat = this.oPositiveFormat;
this.oTextFormat = this.oPositiveFormat;
} else {
this.oPositiveFormat = aParsedFormats[0];
this.oPositiveFormat.bAddMinusIfNes = true;
this.oNegativeFormat = this.oPositiveFormat;
this.oNullFormat = this.oPositiveFormat;
this.oTextFormat = this.oPositiveFormat;
}
}
}
}
this.formatCache = new Object();
}
CellFormat.prototype = {
isTextFormat: function () {
if (null != this.oPositiveFormat) {
return this.oPositiveFormat.bTextFormat;
} else {
if (null != this.aComporationFormats && this.aComporationFormats.length > 0) {
return this.aComporationFormats[0].bTextFormat;
}
}
return false;
},
isGeneralFormat: function () {
if (null != this.oPositiveFormat) {
return this.oPositiveFormat.bGeneral;
} else {
if (null != this.aComporationFormats && this.aComporationFormats.length > 0) {
return this.aComporationFormats[0].bGeneral;
}
}
return false;
},
isDateTimeFormat: function () {
if (null != this.oPositiveFormat) {
return this.oPositiveFormat.bDateTime;
} else {
if (null != this.aComporationFormats && this.aComporationFormats.length > 0) {
return this.aComporationFormats[0].bDateTime;
}
}
return false;
},
getFormatByValue: function (dNumber) {
var oRes = null;
if (null == this.aComporationFormats) {
if (dNumber > 0 && null != this.oPositiveFormat) {
oRes = this.oPositiveFormat;
} else {
if (dNumber < 0 && null != this.oNegativeFormat) {
oRes = this.oNegativeFormat;
} else {
if (null != this.oNullFormat) {
oRes = this.oNullFormat;
}
}
}
} else {
var nLength = this.aComporationFormats.length;
var oDefaultComporationFormat = null;
for (var i = 0, length = nLength; i < length; ++i) {
var oCurFormat = this.aComporationFormats[i];
if (null != oCurFormat.ComporationOperator) {
var bOperationResult = false;
var oOperationValue = oCurFormat.ComporationOperator.operatorValue;
switch (oCurFormat.ComporationOperator.operator) {
case NumComporationOperators.equal:
bOperationResult = (dNumber == oOperationValue);
break;
case NumComporationOperators.greater:
bOperationResult = (dNumber > oOperationValue);
break;
case NumComporationOperators.less:
bOperationResult = (dNumber < oOperationValue);
break;
case NumComporationOperators.greaterorequal:
bOperationResult = (dNumber >= oOperationValue);
break;
case NumComporationOperators.lessorequal:
bOperationResult = (dNumber <= oOperationValue);
break;
case NumComporationOperators.notequal:
bOperationResult = (dNumber != oOperationValue);
break;
}
if (true == bOperationResult) {
oRes = oCurFormat;
}
} else {
if (null == oDefaultComporationFormat) {
oDefaultComporationFormat = oCurFormat;
}
}
}
if (null == oRes && null != oDefaultComporationFormat) {
oRes = oDefaultComporationFormat;
}
}
return oRes;
},
format: function (number, nValType, dDigitsCount, oAdditionalResult) {
var cacheVal = this.formatCache[number];
if (null != cacheVal) {
cacheVal = cacheVal[nValType];
if (null != cacheVal) {
cacheVal = cacheVal[dDigitsCount];
if (null != cacheVal) {
return cacheVal;
}
}
}
var res = [{
text: number
}];
var dNumber = number - 0;
if (CellValueType.String != nValType && number == dNumber) {
var oFormat = this.getFormatByValue(dNumber);
if (null != oFormat) {
res = oFormat.format(number, nValType, dDigitsCount, oAdditionalResult);
} else {
if (null != this.aComporationFormats) {
var oNewFont = new Font();
oNewFont.clean();
oNewFont.repeat = true;
res = [{
text: "#",
format: oNewFont
}];
}
}
} else {
if (null != this.oTextFormat) {
res = this.oTextFormat.format(number, nValType, dDigitsCount, oAdditionalResult);
}
}
var cacheVal = this.formatCache[number];
if (null == cacheVal) {
cacheVal = new Object();
this.formatCache[number] = cacheVal;
}
var cacheType = cacheVal[nValType];
if (null == cacheType) {
cacheType = new Object();
cacheVal[nValType] = cacheType;
}
cacheType[dDigitsCount] = res;
return res;
},
shiftFormat: function (output, nShift) {
var bRes = false;
var bCurRes = true;
if (null == this.aComporationFormats) {
bCurRes = this.oPositiveFormat.toString(output, nShift);
if (false == bCurRes) {
output.format = this.oPositiveFormat.formatString;
}
bRes |= bCurRes;
if (null != this.oNegativeFormat && this.oPositiveFormat != this.oNegativeFormat) {
var oTempOutput = new Object();
bCurRes = this.oNegativeFormat.toString(oTempOutput, nShift);
if (false == bCurRes) {
output.format += ";" + this.oNegativeFormat.formatString;
} else {
output.format += ";" + oTempOutput.format;
}
bRes |= bCurRes;
}
if (null != this.oNullFormat && this.oPositiveFormat != this.oNullFormat) {
var oTempOutput = new Object();
bCurRes = this.oNullFormat.toString(oTempOutput, nShift);
if (false == bCurRes) {
output.format += ";" + this.oNullFormat.formatString;
} else {
output.format += ";" + oTempOutput.format;
}
bRes |= bCurRes;
}
if (null != this.oTextFormat && this.oPositiveFormat != this.oTextFormat) {
var oTempOutput = new Object();
bCurRes = this.oTextFormat.toString(oTempOutput, nShift);
if (false == bCurRes) {
output.format += ";" + this.oTextFormat.formatString;
} else {
output.format += ";" + oTempOutput.format;
}
bRes |= bCurRes;
}
} else {
var length = this.aComporationFormats.length;
output.format = "";
for (var i = 0; i < length; ++i) {
var oTempOutput = new Object();
var oCurFormat = this.aComporationFormats[i];
var bCurRes = oCurFormat.toString(oTempOutput, nShift);
if (0 != i) {
output.format += ";";
}
if (false == bCurRes) {
output.format += oCurFormat.formatString;
} else {
output.format += oTempOutput.format;
}
bRes |= bCurRes;
}
}
return bRes;
},
getType: function () {
if (null != this.oPositiveFormat) {
return this.oPositiveFormat.getType();
} else {
if (null != this.aComporationFormats && this.aComporationFormats.length > 0) {
return this.aComporationFormats[0].getType();
}
}
return c_oAscNumFormatType.General;
}
};
var oDecodeGeneralFormatCache = new Object();
function DecodeGeneralFormat(val, nValType, dDigitsCount) {
var cacheVal = oDecodeGeneralFormatCache[val];
if (null != cacheVal) {
cacheVal = cacheVal[nValType];
if (null != cacheVal) {
cacheVal = cacheVal[dDigitsCount];
if (null != cacheVal) {
return cacheVal;
}
}
}
var res = DecodeGeneralFormat_Raw(val, nValType, dDigitsCount);
var cacheVal = oDecodeGeneralFormatCache[val];
if (null == cacheVal) {
cacheVal = new Object();
oDecodeGeneralFormatCache[val] = cacheVal;
}
var cacheType = cacheVal[nValType];
if (null == cacheType) {
cacheType = new Object();
cacheVal[nValType] = cacheType;
}
cacheType[dDigitsCount] = res;
return res;
}
function DecodeGeneralFormat_Raw(val, nValType, dDigitsCount) {
if (CellValueType.String == nValType) {
return "@";
}
var number = val - 0;
if (number != val) {
return "@";
}
if (0 == number) {
return "0";
}
var nDigitsCount;
if (null == dDigitsCount || dDigitsCount > gc_nMaxDigCountView) {
nDigitsCount = gc_nMaxDigCountView;
} else {
nDigitsCount = parseInt(dDigitsCount);
}
if (number < 0) {
number = -number;
}
if (nDigitsCount < 1) {
return "0";
}
var bContinue = true;
var parts = getNumberParts(number);
while (bContinue) {
bContinue = false;
var nRealExp = gc_nMaxDigCount + parts.exponent;
var nRealExpAbs = Math.abs(nRealExp);
var nExpMinDigitsCount;
if (nRealExpAbs < 100) {
nExpMinDigitsCount = 4;
} else {
nExpMinDigitsCount = 2 + nRealExpAbs.toString().length;
}
var suffix = "";
if (nRealExp > 0) {
if (nRealExp > nDigitsCount) {
if (nDigitsCount >= nExpMinDigitsCount + 1) {
suffix = "E+";
for (var i = 2; i < nExpMinDigitsCount; ++i) {
suffix += "0";
}
nDigitsCount -= nExpMinDigitsCount;
} else {
return "0";
}
}
} else {
var nVarian1 = nDigitsCount - 2 + nRealExp;
var nVarian2 = nDigitsCount - nExpMinDigitsCount;
if (nVarian2 > 2) {
nVarian2--;
} else {
if (nVarian2 > 0) {
nVarian2 = 1;
}
}
if (nVarian1 <= 0 && nVarian2 <= 0) {
return "0";
}
if (nVarian1 < nVarian2) {
var bUseVarian1 = false;
if (nVarian1 > 0) {
var sTempNumber = parts.mantissa.toString();
sTempNumber = sTempNumber.substring(nVarian1, nVarian2);
var nTempNumberLength = sTempNumber.length;
bUseVarian1 = true;
for (var i = 0; i < nTempNumberLength; ++i) {
if ("0" != sTempNumber[i]) {
bUseVarian1 = false;
break;
}
}
}
if (false == bUseVarian1) {
if (nDigitsCount >= nExpMinDigitsCount + 1) {
suffix = "E+";
for (var i = 2; i < nExpMinDigitsCount; ++i) {
suffix += "0";
}
nDigitsCount -= nExpMinDigitsCount;
} else {
return "0";
}
}
}
}
var dec_num_digits = nRealExp;
if (suffix) {
dec_num_digits = 1;
}
var nRoundDigCount = 0;
if (dec_num_digits <= 0) {
var nTemp = nDigitsCount + dec_num_digits - 2;
if (nTemp > 0) {
nRoundDigCount = nTemp;
}
} else {
if (dec_num_digits < gc_nMaxDigCount) {
if (dec_num_digits <= nDigitsCount) {
if (dec_num_digits + 1 < nDigitsCount) {
nRoundDigCount = nDigitsCount - 1;
} else {
nRoundDigCount = dec_num_digits;
}
}
}
}
if (nRoundDigCount > 0) {
var nTemp = Math.pow(10, gc_nMaxDigCount - nRoundDigCount);
number = Math.round(parts.mantissa / nTemp) * nTemp * Math.pow(10, parts.exponent);
var oNewParts = getNumberParts(number);
if (oNewParts.exponent != parts.exponent) {
bContinue = true;
} else {
bContinue = false;
}
parts = oNewParts;
}
}
var frac_num_digits;
if (dec_num_digits > 0) {
frac_num_digits = nDigitsCount - 1 - dec_num_digits;
} else {
frac_num_digits = nDigitsCount - 2 + dec_num_digits;
}
if (frac_num_digits > 0) {
var sTempNumber = parts.mantissa.toString();
var sTempNumber;
if (dec_num_digits > 0) {
sTempNumber = sTempNumber.substring(dec_num_digits, dec_num_digits + frac_num_digits);
} else {
sTempNumber = sTempNumber.substring(0, frac_num_digits);
}
var nTempNumberLength = sTempNumber.length;
var nreal_frac_num_digits = frac_num_digits;
for (var i = frac_num_digits - 1; i >= 0; --i) {
if ("0" == sTempNumber[i]) {
nreal_frac_num_digits--;
} else {
break;
}
}
frac_num_digits = nreal_frac_num_digits;
if (dec_num_digits < 0) {
frac_num_digits += (-dec_num_digits);
}
}
if (frac_num_digits <= 0) {
return "0" + suffix;
}
var number_format_string = "0.";
for (var i = 0; i < frac_num_digits; ++i) {
number_format_string += "0";
}
number_format_string += suffix;
return number_format_string;
}
function GeneralEditFormatCache() {
this.oCache = new Object();
}
GeneralEditFormatCache.prototype = {
format: function (number) {
var value = this.oCache[number];
if (null == value) {
if (0 == number) {
value = "0";
} else {
var sRes = "";
var parts = getNumberParts(number);
var nRealExp = gc_nMaxDigCount + parts.exponent;
if (parts.exponent >= 0) {
if (nRealExp <= 21) {
sRes = parts.mantissa.toString();
for (var i = 0; i < parts.exponent; ++i) {
sRes += "0";
}
} else {
sRes = this._removeTileZeros(parts.mantissa.toString());
if (sRes.length > 1) {
var temp = sRes.substring(0, 1);
temp += ".";
temp += sRes.substring(1);
sRes = temp;
}
sRes += "E+" + (nRealExp - 1);
}
} else {
if (nRealExp > 0) {
sRes = parts.mantissa.toString();
if (sRes.length > nRealExp) {
var temp = sRes.substring(0, nRealExp);
temp += ".";
temp += sRes.substring(nRealExp);
sRes = temp;
}
sRes = this._removeTileZeros(sRes);
} else {
if (nRealExp >= -18) {
sRes = "0";
sRes += ".";
for (var i = 0; i < -nRealExp; ++i) {
sRes += "0";
}
var sTemp = parts.mantissa.toString();
sTemp = sTemp.substring(0, 19 + nRealExp);
sRes += this._removeTileZeros(sTemp);
} else {
sRes = parts.mantissa.toString();
if (sRes.length > 1) {
var temp = sRes.substring(0, 1);
temp += ".";
temp += sRes.substring(1);
temp = this._removeTileZeros(temp);
sRes = temp;
}
sRes += "E-" + (1 - nRealExp);
}
}
}
if (SignType.Negative == parts.sign) {
value = "-" + sRes;
} else {
value = sRes;
}
}
this.oCache[number] = value;
}
return value;
},
_removeTileZeros: function (val) {
var res = val;
var nLength = val.length;
var nLastNoZero = nLength - 1;
for (var i = val.length - 1; i >= 0; --i) {
nLastNoZero = i;
if ("0" != val[i]) {
break;
}
}
if (nLastNoZero != nLength - 1) {
if ("." == res[nLastNoZero]) {
res = res.substring(0, nLastNoZero);
} else {
res = res.substring(0, nLastNoZero + 1);
}
}
return res;
}
};
var oGeneralEditFormatCache = new GeneralEditFormatCache();
function FormatParser() {
this.rx_percent = new RegExp("^([+-]?)(\\d+\\.?\\d*|\\.\\d+)%$");
this.rx_date = new RegExp("^ *((\\d{1,2}) *[/-] *(\\d{1,2}) *[/-] *(\\d{2,4}))? *((\\d{1,2}) *: *(\\d{1,2})? *(: *(\\d{1,2})?)? *(AM|PM)?)?$");
this.rx_date2 = new RegExp("^ *((\\d{1,2}) *[/-])? *(\\w{3}) *([/-]|[/-](\\w{2,4}))?$");
this.rx_currency = new RegExp("^([+-]?)([$€£¥])?(\\d+\\.?\\d*|\\.\\d+)(р.)?$");
this.days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
this.daysLeap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
}
FormatParser.prototype = {
parse: function (value) {
var res = null;
var match = value.match(this.rx_percent);
if (null != match) {
var sSing1 = match[1];
var sV1 = match[2];
var dVal = parseFloat(sV1);
if ("-" == sSing1) {
dVal = -dVal;
}
dVal /= 100;
res = {
format: "0.00%",
value: dVal
};
} else {
match = value.match(this.rx_currency);
if (null != match) {
var sSing1 = match[1];
var bRubble = false;
var sSing2 = match[2];
var sSing3 = match[4];
if ("р." == sSing3) {
bRubble = true;
}
var sV1 = match[3];
var dVal = parseFloat(sV1);
if ("-" == sSing1) {
dVal = -dVal;
}
if (bRubble) {
res = {
format: "#,##0.00р.",
value: dVal
};
} else {
res = {
format: "\\" + sSing2 + "#,##0.00_);[Red](\\" + sSing2 + "#,##0.00)",
value: dVal
};
}
} else {
res = this.parseDate(value);
}
}
return res;
},
parseDate: function (value) {
var res = null;
match = value.match(this.rx_date);
if (null != (match = value.match(this.rx_date))) {
var d = match[3];
var m = match[2];
var y = match[4];
var h = match[6];
var min = match[7];
var s = match[9];
var ampm = match[10];
var bDate = false;
var bTime = false;
var nDay;
var nMounth;
var nYear;
if (g_bDate1904) {
nDay = 1;
nMounth = 0;
nYear = 1904;
} else {
nDay = 31;
nMounth = 11;
nYear = 1899;
}
var nHour = 0;
var nHour = 0;
var nMinute = 0;
var nSecond = 0;
var dValue = 0;
var bValidDate = true;
if (null != d && null != m && null != y) {
bDate = true;
var nDay = d - 0;
var nMounth = m - 1;
var nYear = y - 0;
if (nYear < 100) {
nYear = 2000 + nYear;
}
bValidDate = this.isValidDate(nYear, nMounth, nDay);
}
if (null != h) {
bTime = true;
nHour = h - 0;
if (null != ampm) {
nHour = nHour % 12;
if ("PM" == ampm) {
nHour += 12;
}
}
if (null != min) {
nMinute = min - 0;
}
if (null != s) {
nSecond = s - 0;
}
}
if (true == bValidDate && (true == bDate || true == bTime)) {
if (g_bDate1904) {
dValue = (Date.UTC(nYear, nMounth, nDay, nHour, nMinute, nSecond) - Date.UTC(1904, 0, 1, 0, 0, 0)) / (86400 * 1000);
} else {
if (1900 < nYear || (1900 == nYear && 2 < nMounth)) {
dValue = (Date.UTC(nYear, nMounth, nDay, nHour, nMinute, nSecond) - Date.UTC(1899, 11, 30, 0, 0, 0)) / (86400 * 1000);
} else {
if (1900 == nYear && 2 == nMounth && 29 == nDay) {
dValue = 60;
} else {
dValue = (Date.UTC(nYear, nMounth, nDay, nHour, nMinute, nSecond) - Date.UTC(1899, 11, 31, 0, 0, 0)) / (86400 * 1000);
}
}
}
if (dValue > 0) {
var sFormat;
if (true == bDate && true == bTime) {
sFormat = "m/d/yyyy h:mm:ss AM/PM";
} else {
if (true == bDate) {
sFormat = "m/d/yyyy";
} else {
if (dValue > 1) {
sFormat = "[h]:mm:ss";
} else {
if (null != ampm) {
sFormat = "h:mm:ss AM/PM";
} else {
sFormat = "h:mm:ss";
}
}
}
}
res = {
format: sFormat,
value: dValue,
bDateTime: true
};
}
}
} else {
if (null != (match = this.rx_date2.exec(value))) {
var sDD = match[2],
sMM = match[3],
sYY = match[5],
nDay,
nMounth,
nYear,
sFormat,
bValidDate = false;
if (g_bDate1904) {
nDay = 1;
nMounth = 0;
nYear = 1904;
} else {
nDay = 31;
nMounth = 11;
nYear = 1899;
}
if (undefined != sDD) {
if (undefined != sYY) {
if (sYY.length == 4) {
sFormat = "d-mmm-yyyy";
} else {
sFormat = "d-mmm-yy";
}
} else {
sFormat = "d-mmm";
}
} else {
if (undefined != sYY) {
if (sYY.length == 4) {
sFormat = "mmm-yyyy";
} else {
sFormat = "mmm-yy";
}
} else {
return res;
}
}
var nDD = 1;
if (undefined != sDD) {
nDD = parseInt(sDD);
}
var nMM = 0;
switch (sMM.toLowerCase()) {
case "jan":
nMM = 1;
break;
case "feb":
nMM = 2;
break;
case "mar":
nMM = 3;
break;
case "apr":
nMM = 4;
break;
case "may":
nMM = 5;
break;
case "jun":
nMM = 6;
break;
case "jul":
nMM = 7;
break;
case "aug":
nMM = 8;
break;
case "sep":
nMM = 9;
break;
case "oct":
nMM = 10;
break;
case "nov":
nMM = 11;
break;
case "dec":
nMM = 12;
break;
default:
return res;
}
var nYY = -1;
if (undefined != sYY) {
nYY = parseInt(sYY);
} else {
nYY = new Date().getFullYear();
}
if (0 <= nDD && 0 < nMM && 0 <= nYY) {
nDay = nDD - 0;
nMounth = nMM - 1;
nYear = nYY - 0;
if (nYear < 100) {
nYear = 2000 + nYear;
}
bValidDate = this.isValidDate(nYear, nMounth, nDay);
}
if (true == bValidDate) {
if (g_bDate1904) {
dValue = (Date.UTC(nYear, nMounth, nDay, nHour, nMinute, nSecond) - Date.UTC(1904, 0, 1, 0, 0, 0)) / (86400 * 1000);
} else {
if (1900 < nYear || (1900 == nYear && 2 < nMounth)) {
dValue = (Date.UTC(nYear, nMounth, nDay, nHour, nMinute, nSecond) - Date.UTC(1899, 11, 30, 0, 0, 0)) / (86400 * 1000);
} else {
if (1900 == nYear && 2 == nMounth && 29 == nDay) {
dValue = 60;
} else {
dValue = (Date.UTC(nYear, nMounth, nDay, nHour, nMinute, nSecond) - Date.UTC(1899, 11, 31, 0, 0, 0)) / (86400 * 1000);
}
}
}
if (dValue > 0) {
res = {
format: sFormat,
value: dValue,
bDateTime: true
};
}
}
}
}
return res;
},
isValidDate: function (nYear, nMounth, nDay) {
if (nYear < 1900) {
return false;
} else {
if (nMounth < 0 || nMounth > 11) {
return false;
} else {
if (this.isLeapYear(nYear)) {
if (nDay <= 0 || nDay > this.daysLeap[nMounth]) {
return false;
}
} else {
if (nDay <= 0 || nDay > this.days[nMounth]) {
return false;
}
}
}
}
return true;
},
isLeapYear: function (year) {
return (0 == (year % 4)) && (0 != (year % 100) || 0 == (year % 400));
}
};
var g_oFormatParser = new FormatParser();