var digitObj_EN={nil:0, zero:0, nought:0,one:1, two:2, three:3, four:4, five:5, six:6, seven:7, eight:8, nine:9, ten:10,eleven:11, twelve:12, thirteen:13, fourteen:14, fifteen:15, sixteen:16, seventeen:17, eighteen:18, nineteen:19,twenty:20, twentyone:21, twentytwo:22, twentythree:23, twentyfour:24, twentyfive:25, twentysix:26, twentyseven:27, twentyeight:28, twentynine:29,thirty:30, thirtyone:31, thirtytwo:32, thirtythree:33, thirtyfour:34, thirtyfive:35, thirtysix:36, thirtyseven:37, thirtyeight:38, thirtynine:39,forty:40, fortyone:41, fortytwo:42, fortythree:43, fortyfour:44, fortyfive:45, fortysix:46, fortyseven:47, fortyeight:48, fortynine:49,fifty:50, fiftyone:51, fiftytwo:52, fiftythree:53, fiftyfour:54, fiftyfive:55, fiftysix:56, fiftyseven:57, fiftyeight:58, fiftynine:59,sixty:60, sixtyone:61, sixtytwo:62, sixtythree:63, sixtyfour:64, sixtyfive:65, sixtysix:66, sixtyseven:67, sixtyeight:68, sixtynine:69,seventy:70, seventyone:71, seventytwo:72, seventythree:73, seventyfour:74, seventyfive:75, seventysix:76, seventyseven:77, seventyeight:78, seventynine:79,eighty:80, eightyone:81, eightytwo:82, eightythree:83, eightyfour:84, eightyfive:85, eightysix:86, eightyseven:87, eightyeight:88, eightynine:89,ninety:90, ninetyone:91, ninetytwo:92, ninetythree:93, ninetyfour:94, ninetyfive:95, ninetysix:96, ninetyseven:97, ninetyeight:98, ninetynine:99,};var multiplierObj_EN={pair:2, pairs:2, dozen:12, score:20, hundred:100, gross:144, ream:500, reams:500, thousand:1000, lakh:100000, million:1000000, crore:10000000, billion:1000000000, trillion:1000000000000};var otherObj_EN={point:".",and:"+", minus:"-",pound:".", pounds:".",quid:".",dollar:".", dollars:"."};function addNumber(inputOne, inputTwo){return ((inputOne - 0)+(inputTwo - 0));}function toNUM(strInput){var numOutput=0;var signOfAmount="positive";var arrFirstPass=new Array;var arrOutput=new Array;var arrFinalised=new Array;var strOutput="";var strCalc="";if(isFinite(strInput)){return strInput;}if((strInput=="NaN") || (strInput=="") || (strInput=="undefined")){return "false";}var firstString=strInput;var stringStart=strInput.slice(0, 3);if(stringStart.match(/-/) ){signOfAmount="negative";}firstString=firstString.replace(/-/g, "");firstString=firstString.replace(/(\d),(\d)/g, "$1$2");firstString=firstString.replace(/(\d)([a-zA-Z])/g, "$1 $2");firstString=firstString.replace(/([a-zA-Z])(\d)/g, "$1 $2");var inArray=joinDecimals(firstString.split(/\b/) );strOutput+="\ninArray : ["+inArray.toString()+"]\n";arrFirstPass=classifyElements(inArray);/*strOutput+="\n\narrFirstPass:\n";stopIndex=arrFirstPass.length;for(var i=0;i<stopIndex;i++){strOutput+=i+":"+arrFirstPass[i].value+" : "+arrFirstPass[i].type+" : "+arrFirstPass[i].levelNum+"\n";}*/
arrFirstPass=classifyLevel(arrFirstPass);arrOutput=sortByLevel(arrFirstPass);strOutput+="\n\nOutput from fourth pass:\n";for(var i=0;i<arrOutput.length;i++){strOutput+=i+":"+arrOutput[i]+"\n";arrFinalised.push( fixAnomalies(arrOutput[i]) );}strCalc=arrFinalised.join("+");strOutput+="\nstrCalc="+strCalc;strOutput+="\nsignOfAmount: "+signOfAmount;try{if(signOfAmount=="negative"){return (0 - eval(strCalc));}else{return eval(strCalc);}}catch(thisError){retVal=new Object;retVal.reason=strOutput+"\n Calculation Failed: "+strCalc+"\n Reason: "+thisError;retVal.NaN=true;return retVal;}}function fixAnomalies(inString){var outString=inString;outString=fixLeadingPlus(inString);outString=fixLeadingStar(inString);outString=fixDotPlus(outString);outString=matchBraces(outString);outString=fixDotBrace(outString);return outString;}function fixLeadingStar(inString){return inString.replace(/^\*/, "(");
}function fixLeadingPlus(inString){return inString.replace(/^\+/, "(");}function fixDotPlus(inString){return inString.replace(/\.\+/, ".");}function fixDotBrace(inString){return inString.replace(/\.\)/, "0)");}function toNUMdetail(strIn){if(strIn.length==0){return{value:0, type:"unknown"};}if(isFinite(strIn)){return{value:strIn, type:"digit"};}var strInput=strIn.toLowerCase();if(digitObj_EN[strInput] || (strInput=="zero") || (strInput=="nil")) {return{value:digitObj_EN[strInput], type:"digit"};}if(multiplierObj_EN[strInput]) {return{value:multiplierObj_EN[strInput], type:"multiplier"};}if(otherObj_EN[strInput]) {return{value:otherObj_EN[strInput], type:"operator"};}return{value:0, type:"unknown"}}function matchBraces(inString){var regClose=/\)/gi;var regOpen=/\(/gi;var closeCount=inString.count(regClose);var openCount=inString.count(regOpen);if(closeCount > 0) {return getMatchingBraces(closeCount - openCount, inString);}return inString;}String.prototype.count=function(expressionToCount){var remainder=this.match(expressionToCount);if(remainder){return remainder.length;}else{return 0;}}function getMatchingBraces(numberRequired, baseString){var outputString="";if(numberRequired==0){return baseString;}if(numberRequired > 0){for(var i=numberRequired;i>0;i--) {outputString=outputString.concat("(");}outputString=outputString.concat(baseString);}else{for(var i=numberRequired;i<0;i++){outputString=outputString.concat(")");}outputString=baseString.concat(outputString);}return outputString;}function joinDecimals(inArray){var arrInternal=new Array();for(var i=0;i<inArray.length;i++){if(inArray[i].length==0){continue;}if(inArray[i].match(/[\\+-]/)){arrInternal.push(inArray[i]);continue;}if(inArray[i].match(/[^a-zA-Z0-9.]/)){continue;}if(inArray[i]==".") {if(i==(inArray.length - 1)){}else{var lastItem=inArray[i - 1];var nextItem=inArray[i+1];arrInternal[arrInternal.length - 1]=lastItem+"."+nextItem;i++;}}else{arrInternal.push(inArray[i]);}}return arrInternal;}function getLevelNum(arrInput){if(arrInput[0]){if(arrInput[0].levelNum){return arrInput[0].levelNum;}}return -1;}function classifyElements(inArray){var outArray=new Array();for(var i=0;i<inArray.length;i++){if(inArray[i].length==0){continue;}var thisSegment=toNUMdetail(inArray[i]);if(thisSegment.type=="unknown"){continue;}if(outArray.length > 0) {var lastItem=outArray[outArray.length - 1];if((thisSegment.type=="digit") && (lastItem.type=="digit")) {lastItem.value=addNumber(lastItem.value, thisSegment.value);continue;}if((thisSegment.type=="multiplier") && (lastItem.type=="multiplier")) {lastItem.value *=thisSegment.value;continue;}outArray.push(thisSegment);}else{outArray.push(thisSegment);}}return outArray;}function classifyLevel(inArray){var stopIndex=inArray.length;var lastMultiplier=0;var currentLevelNum=0;for(var i=stopIndex;i>0;){i--;if(inArray[i].type=="multiplier"){if(inArray[i].value > lastMultiplier){lastMultiplier=inArray[i].value;currentLevelNum++;}}if(inArray[i].value=="-"){lastMultiplier=inArray[i].value;currentLevelNum++;}inArray[i].levelNum=currentLevelNum;}return inArray;}function sortByLevel(inArray){var lastType="blank";var outArray=new Array();var multiplierCount=0;var currentLevelNum=getLevelNum(inArray);outArray.push(" ");var currentBlockNum=0;var currentBlock="";var stopIndex=inArray.length;for(var i=0;i<stopIndex;i++){if(inArray[i].levelNum < currentLevelNum ) {outArray.push(" ");outArray[currentBlockNum]=currentBlock+")";currentBlockNum++;multiplierCount=0;currentBlock=inArray[i].value.toString();lastType=inArray[i].type;currentLevelNum=inArray[i].levelNum;}else{if(inArray[i].type=="digit"){currentBlock=currentBlock.concat("", inArray[i].value);}if(inArray[i].type=="multiplier"){if(multiplierCount > 0){currentBlock=currentBlock.concat(")*", inArray[i].value);}else{currentBlock=currentBlock.concat("*", inArray[i].value);}multiplierCount++;}if(inArray[i].type=="operator"){currentBlock=currentBlock.concat("", inArray[i].value);}lastType=inArray[i].type;}}outArray[currentBlockNum]=currentBlock+")";return outArray;}