/** * Additional Maths Functions, not specific to any one area**  &copy;Copyright Mike Brockington 2007 - 2010 All rights reserved.*  Build Number:13:* This version first released: 01/08/2007*/
CR.longInt=function (inVal){if(typeof(inVal)==='string'){this.value=stringToArray(inVal);}else{if(typeof(inVal)==='number'){this.value=stringToArray(inVal.toFixed(0) );}else{if((typeof(inVal)==='object') && (inVal.className=="CR.longInt"))
{this.value=inVal.value;}else{if (inVal instanceof Array){this.value=inVal;}else{logMsg("CR.longInt(): Unable to parse inVal:"+inVal+"\n typeof inVal="+typeof(inVal), params={level:"error"});this.value=[0];}}}}this.length=this.value.length;
this.toString=function (){return this.value.join("")};this.toNumber=function (){return Number(this.toString() );};this.format=function (formatCode){var sepChar=",\u200B";var retval="";var j=0;var thisLength=this.value.length;if(thisLength < 5){return this.value.join("");}for(var i=(thisLength - 1);i >=0;i--){if(j > 2){retval=sepChar+retval;
j=0;}retval=this.value[i]+retval;j++;}return retval;};this.add=function (inVal){if(inVal){if(inVal.className && (inVal.className=="CR.longInt") ){return longIntAdd(this, inVal);}else{newValue=new CR.longInt(inVal);return longIntAdd(this, newValue );}}else{logMsg("[20011F] CR.longInt.Add(): Nothing to add.", params={level:"error"});
}};this.multiply=function (inVal){if(inVal){if(inVal.className && (inVal.className=="CR.longInt") ){return longIntMultiply(this, inVal);}else{newValue=new CR.longInt(inVal);return longIntMultiply(this, newValue );}}else{logMsg("[200152] CR.longInt.multiply(): Nothing to add.", params={level:"error"});}};};CR.longInt.prototype.className="CR.longInt";
function longIntMultiply(longInt1, longInt2){var len1=longInt1.value.length;var len2=longInt2.value.length;var temp=0;var temp2="";var overflow=0;var longIntOutput=new CR.longInt(0);var thisPad=0;for (var j=(len2 - 1);j >=0;j--){var arrIntermediate=newBlankArray(0, thisPad);thisPad++;var thisDigit=longInt2.value[j];if(thisDigit==0){
}else{for (var i=(len1 - 1);i >=0;i--){temp=((overflow * 1)+(longInt1.value[i] * thisDigit));if(temp > 9){temp2=temp.toString();overflow=temp2[0];arrIntermediate.unshift( temp2[1].toString() );}else{arrIntermediate.unshift( temp.toString() );
overflow=0;}}if(overflow > 0){arrIntermediate.unshift( overflow.toString() );overflow=0;}longIntOutput=longIntOutput.add(new CR.longInt(arrIntermediate));}}return longIntOutput;}function longIntAdd(longInt1, longInt2){var maxBlockLength=12;var len1=longInt1.value.length;
var len2=longInt2.value.length;if(len1==len2){}else{if(len1 < len2){longInt1.value=arrayPad(longInt1.value, len2);}else{longInt2.value=arrayPad(longInt2.value, len1);}}var calcLength=longInt1.value.length - 1;if(calcLength < maxBlockLength){
return new CR.longInt( longInt1.toNumber()+longInt2.toNumber() );}else{var temp=0;var temp2="";var overflow=0;var arrOutput=new Array();for (var i=calcLength;i >=0;i--){temp=(overflow * 1)+(longInt1.value[i] * 1)+(longInt2.value[i] * 1);if(temp > 9){temp2=temp.toString();overflow=temp2[0];arrOutput.unshift( temp2[1].toString() );}else{
arrOutput.unshift( temp.toString() );overflow=0;}}if(overflow > 0){arrOutput.unshift( overflow.toString() );}return new CR.longInt( arrOutput );}}function newBlankArray(filler, newLength){var arrInput=new Array();while(newLength > 0){arrInput.push(filler);newLength--;
}return arrInput;}function factorial(numInput){if (isNaN(numInput)){return Math.NaN;}else{var retVal=1;numInput=Math.floor(numInput);for(i=numInput;i >1;i--) {retVal *=i;}return retVal;
}}function isOdd(inVal){if (inVal % 2) {return true;}else{return false;}}