/** * Office Functions**  &copy;Copyright Mike Brockington 2009 - 2009 All rights reserved.*  Build Number:3:* This version first released: 15/01/2009 22:10* Some functions based on equivalents from Finance.js*/
/** Construct an object to handle calculations using discrete objects, rather than continuous numbers* @class* Concrete class - based on simpleCalculator(), with details of required fields and calculations added* @constructor* @return Nothing*/
function totaliser(){/*  Integer */
this.numberOfItems=0;/** ID of the result that the context menu is 'attached' to, as and when it is displayed.*  Integer*/
this.currentMenuRef="";/** Total value;may be float or integer*  Number*/
this.totalAmount=0;/*  defaultDataObject */
this.arrItems=[new defaultDataObject()];/** Usually a single character*  String*/
this.charCurrencySymbol="";this.addAmount=addThisAmount;this.deleteAmount=removeThisAmount;this.clearCurrent=clearCurrentCalc;this.removeItem=removeCalcItem;this.editItem=editCalcItem;this.removeTotal=removeThisTotal;this.showTotal=showThisTotal;this.labelItem=labelCalcItem;}/** Adds the given value to the list.* s debitValue unformatted number/currency*  Function*  Nothing*/
function removeThisAmount(debitValue, optionalText){this.numberOfItems++;this.removeTotal();this.arrItems.push(new totaliserData("Debit", debitValue) );this.totalAmount -=(debitValue - 0);var theseParams={CSSclassName:"credit", elementID:"debit"+this.numberOfItems, showActions:true};if(optionalText){theseParams.labelText=optionalText;}var output="-"+formatNumber(debitValue);recordResultText(output, theseParams);this.showTotal();}/** Adds the given value to the list.* s creditValue unformatted number/currency*  Function*  Nothing*/
function addThisAmount(creditValue, optionalText){this.numberOfItems++;this.removeTotal();this.arrItems.push(new totaliserData("Credit", creditValue) );this.totalAmount+=(creditValue - 0);var theseParams={CSSclassName:"credit", elementID:"credit"+this.numberOfItems, showActions:true};if(optionalText){theseParams.labelText=optionalText;}recordResultText(formatNumber(creditValue), theseParams );this.showTotal();}/** Adds the latest value to the list.* s None.*  Function*  Boolean indicating success(false) or failure(true).*/
function calcSum2(buttonUsed){if((buttonUsed=="Add") || (buttonUsed=="Subtract")){checkResultsVisible();var strFieldName="txtAmount";var valueField=document.getElementById(strFieldName);if(buttonUsed=="Add"){thisCalculator.addAmount(valueField.value);}else{thisCalculator.deleteAmount(valueField.value);}valueField.value="";if(document.frmCalc && document.frmCalc.elements && document.frmCalc.elements[strFieldName]){document.frmCalc.elements[strFieldName].focus();}else{logMsg("[200159] Unable to find form element:"+strFieldName, params={level:"error"});}return false;}else{logMsg("[200158] Unforeseen error;no Submit details.", params={level:"error"});}return false;}/** Adds the latest value to the list.* s None.*  Function*  Boolean indicating success(false) or failure(true).*/
function calcSum3(buttonUsed){if((buttonUsed=="Add") || (buttonUsed=="Subtract")){checkResultsVisible();var strFieldName="txtAmount";var strFieldName2="txtLabel";var valueField=document.getElementById(strFieldName);var labelField=document.getElementById(strFieldName2);if(buttonUsed=="Add"){thisCalculator.addAmount(valueField.value, labelField.value);}else{thisCalculator.deleteAmount(valueField.value, labelField.value);}valueField.value="";if(document.frmCalc && document.frmCalc.elements && document.frmCalc.elements[strFieldName]){document.frmCalc.elements[strFieldName].focus();}else{logMsg("[200160] Unable to find form element:"+strFieldName, params={level:"error"});}return false;}else{logMsg("[200161] Unforeseen error;no Submit details.", params={level:"error"});}return false;}/** Construct an object to store calculations using discrete objects, rather than continuous numbers* @class* Concrete class - subclass of simpleDataObject(), with details of required fields and calculations added* @constructor* @return Nothing*/
function totaliserData(type, amount){/*  String Array */
this.arrErrorMsg=new Array();/**  Number*/
this.numAmount=amount;/**  Boolean*/
this.isCredit=(type=="Credit");}/** Carry out the base calculation.*  Function*  Nothing*/
function showThisTotal(){recordResultText("Total: "+formatNumber(this.totalAmount), params={CSSclassName:"total", showActions:false});}/** This constructor defines a default object to fill up the Zero index in a calculator's data store* Concrete class - may be subclassed if required* Copied from simpleObject.js for convenience* @constructor*/
function defaultDataObject(){}/** Remove an existing entry.*  Function*  Nothing*/
function removeCalcItem(calcNumber){var oldData=this.arrItems[calcNumber];if(oldData.isCredit ){this.totalAmount -=(1 * oldData.numAmount);}else{this.totalAmount+=(1 * oldData.numAmount);}clearLastResult();this.showTotal();}/** Change an existing entry.*  Function*  Nothing*/
function editCalcItem(calcNumber){var elementID="";var oldData=this.arrItems[calcNumber];var newData=prompt("Please enter the new value, \nPlace a minus sign in front, if required. \n\nLeave blank to cancel this change.");if(newData.length > 0){if(isFinite(newData) ){if(oldData.isCredit ){this.totalAmount -=(oldData.numAmount - 0);elementID="credit"+calcNumber;}else{this.totalAmount+=(oldData.numAmount - 0);elementID="debit"+calcNumber;}this.totalAmount+=(newData - 0);oldData.numAmount=(newData - 0);oldData.isCredit=true;var newElement=document.createTextNode( formatNumber(newData) );modifyResult(elementID, newElement, params={oldClassName:"debit", CSSclassName:"credit"});clearLastResult();this.showTotal();}else{alert("Please only enter numeric values, without currency or other symbols except for a leading minus, if required.");}}else{}}/** Label an existing entry.*  Function*  Nothing*/
function labelCalcItem(calcNumber){var elementID="credit"+calcNumber;var newLabel=prompt("Please enter a text label. \n\nLeave blank to cancel.");if(newLabel.length > 0){modifyLabel(elementID, newLabel);}else{}}/** Insert grouping seperators, if number has enough digits.*  Function*  String*/
function formatNumber(inValue){var thisString=inValue+"";var sepChar=",\u200B";var retval="";var j=0;var thisLength=thisString.length;if(thisLength < 5){return thisString;}for(var i=(thisLength - 1);i >=0;i--){if(j > 2){retval=sepChar+retval;j=0;}retval=thisString.charAt( i )+retval;j++;}return retval;}/** Carry out the base calculation.*  Function*  Nothing*/
function removeThisTotal(){clearLastResult();appSettings.oddResultsLine=!(appSettings.oddResultsLine);}/** Carry out the base calculation.*  Function*  Nothing*/
function clearCurrentCalc(){this.numberOfItems=0;this.totalAmount=0;this.arrItems=[new defaultDataObject()];}
