{"version":3,"sources":["../../src/core/module.js","../../src/core/config/Mathtruncpolyfill.js","../../src/core/config/qallsettled.js","../../src/core/constants/GeneralNoteTypeKeys.js","../../src/core/constants/MedicationHistoryFilterSubtype.js","../../src/core/constants/NumeralConstant.js","../../src/core/constants/PrmState.js","../../src/core/filters/apExprFilter.js","../../src/core/filters/formatNum.js","../../src/core/filters/hasKeys.js","../../src/core/filters/hasNoKeys.js","../../src/core/services/BrowserService.js","../../src/core/services/DeviceSettings.js","../../src/core/services/Guid.js","../../src/core/services/NumUtil.js","../../src/core/services/SingleAccessSet.js","../../src/core/services/StrConvert.js","../../src/core/services/StringBuilder.js","../../src/core/services/UnitConvert.js"],"names":["angular","module","Math","isFinite","config","trunc","v","window","$provide","decorator","$delegate","$q","allSettled","promises","wrapped","isArray","forEach","promise","key","hasOwnProperty","when","then","value","state","reason","wrap","all","Object","generalNoteTypeKeys","readonlyProp","val","writable","enumerable","configurable","defineProperties","DrugScreeningOverrideReason","MedicationConsent","SigPharmacyInstructions","SigInternalNotes","MedicalDeviceHistoryNotes","DrugDiscontinueOverrideReason","DrugReactionReason","RxChangeMessageResponseComment","constant","Default","Rx","numeral","Fnc","HxTab","RxTab","History","Patient","Medication","Message","ManualRxRefill","filter","$parse","_","parsedExpression","locals","expressionDefinition","arguments","tail","index","isObject","assign","apply","NumUtil","format","input","keys","length","hasKeys","factory","$window","$log","DeviceSettings","ie","navigator","userAgent","match","ie11","ieEDGE","ieVer","base64ToBlob","base64String","contentType","byteCharacters","atob","byteArray","Array","i","charCodeAt","byteArrayInt","Uint8Array","Blob","type","isBlobCompatible","isIE","saveBlob","document","blobObj","fileName","msSaveBlob","downloadLink","createElement","download","href","URL","createObjectURL","onclick","e","body","removeChild","target","style","display","appendChild","click","downloadDocumentToFile","fileNameToSaveAs","isLegacyIE","supportsInlinePdf","isIos","isAndroid","DeviceSettingsFactory","DeviceSettingsRepository","provider","$get","Guid","newGuid","replace","c","r","random","toString","empty","zeroToEmptyRegex","numeraljsFilter","result","test","multiply","reduce","cumulative","num","divide","num1","num2","add","subtract","SingleAccessSet","this","set","prototype","contains","exists","replaceNewLine","str","newVal","oldVal","isString","valToReplace","isNil","replacement","defineProperty","init","initialStr","StringBuilder","self","baseStr","Append","AppendLine","isNaN","ToString","get","floor","pow","usToKg","convertUsToKg","usToKgRounded","lbs","oz","roundKg","usToCm","convertUsToCm","usToCmRounded","ft","inches","roundCm","kgToUs","convertKgToUs","kgToUsRounded","kg","usMeasurements","ounces","round","cmToUs","convertCmToUs","cmToUsRounded","cm","getBodySurfaceArea","heightCm","weightKg","totalKg","roundedKg","totalCm","roundedCm","totalPounds","pounds","totalFeet","feet"],"mappings":"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","file":"aprima-core.min.js","sourcesContent":["angular.module('aprima-core', [\r\n 'lodash', \r\n 'ngNumeraljs',\r\n]);\r\n","(function(angular, Math, isFinite) {\r\n 'use strict';\r\n\r\n // according to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc\r\n // ie doesn't support Math.trunc(), so this is a polyfill for it; it's listed at the bottom of the linked page\r\n \r\n angular.module('aprima-core').config([\r\n MathTruncPolyfill,\r\n ]);\r\n\r\n function MathTruncPolyfill() {\r\n if (!Math.trunc) {\r\n Math.trunc = function(v) {\r\n v = +v;\r\n if (!isFinite(v)) return v;\r\n\r\n return (v - v % 1) || (v < 0 ? -0 : v === 0 ? v : 0);\r\n\r\n // returns:\r\n // 0 -> 0\r\n // -0 -> -0\r\n // 0.2 -> 0\r\n // -0.2 -> -0\r\n // 0.7 -> 0\r\n // -0.7 -> -0\r\n // Infinity -> Infinity\r\n // -Infinity -> -Infinity\r\n // NaN -> NaN\r\n // null -> 0\r\n };\r\n }\r\n }\r\n \r\n})(window.angular, window.Math, window.isFinite);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').config([\r\n '$provide',\r\n QAllSettled,\r\n ]);\r\n\r\n function QAllSettled($provide) {\r\n // https://stackoverflow.com/questions/18888104/angularjs-q-wait-for-all-even-when-1-rejected\r\n $provide.decorator('$q', [\r\n '$delegate',\r\n addAllSettled,\r\n ]);\r\n\r\n function addAllSettled($delegate) {\r\n var $q = $delegate;\r\n\r\n $q.allSettled = $q.allSettled || allSettled;\r\n\r\n return $q;\r\n\r\n function allSettled(promises) {\r\n // Implementation of allSettled function from Kris Kowal's Q:\r\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\r\n\r\n var wrapped = angular.isArray(promises) ? [] : {};\r\n\r\n angular.forEach(promises, function(promise, key) {\r\n if (!wrapped.hasOwnProperty(key)) {\r\n wrapped[key] = wrap(promise);\r\n }\r\n });\r\n\r\n return $q.all(wrapped);\r\n }\r\n\r\n function wrap(promise) {\r\n return $q.when(promise)\r\n .then(function (value) {\r\n return { state: 'fulfilled', value: value };\r\n }, function (reason) {\r\n return { state: 'rejected', reason: reason };\r\n });\r\n }\r\n }\r\n }\r\n})(window.angular);","(function(angular, Object) {\r\n 'use strict';\r\n\r\n // Add to this as necessary\r\n var generalNoteTypeKeys = {};\r\n Object.defineProperties(generalNoteTypeKeys, {\r\n DrugScreeningOverrideReason: readonlyProp('Medication_Override'),\r\n MedicationConsent: readonlyProp('MedicationConsent'),\r\n SigPharmacyInstructions: readonlyProp('Sig_Item'),\r\n SigInternalNotes: readonlyProp('SigInternal'),\r\n MedicalDeviceHistoryNotes: readonlyProp('MEDICALDEVICE-HISTORY'),\r\n DrugDiscontinueOverrideReason: readonlyProp('RX_Discontinue'),\r\n DrugReactionReason: readonlyProp('DrugReaction'),\r\n RxChangeMessageResponseComment:readonlyProp('RXChangeResponseComment'),\r\n });\r\n\r\n function readonlyProp(val) {\r\n return {\r\n value: val,\r\n writable: false,\r\n enumerable: true,\r\n configurable: false,\r\n };\r\n }\r\n\r\n angular.module('aprima-core').constant('GeneralNoteTypeKeys', generalNoteTypeKeys);\r\n\r\n})(window.angular, window.Object);\r\n"," angular.module('aprima-core').constant('MedicationHistoryFilterSubtype', {\r\n Default: 0,\r\n Rx: 1 \r\n });\r\n\r\n","(function(angular, numeral) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').constant('numeral', numeral);\r\n\r\n})(window.angular, window.numeral);\r\n"," angular.module('aprima-core').constant('PrmState', {\r\n Fnc: {\r\n HxTab: 'HxTab',\r\n RxTab: 'RxTab',\r\n },\r\n History: {\r\n Patient: {\r\n Medication: 'PatientMedicationHistory'\r\n }\r\n },\r\n Message: {\r\n ManualRxRefill: 'ManualRxRefillMessage'\r\n }\r\n });\r\n\r\n","// Filter that allows angular expressions and has lodash(_) in its context\r\n\r\n// It converts angular expression to a function, \r\n// and then delegates to the default angular 'filter' with this function\r\n\r\n// Usage: \r\n// $scope.items = [{a: 1}, {a: {b: 1}}, {a: {b: 2}}, {a: 2}, {a: 3}];\r\n// $scope.scopeValue = 2;\r\n// ng-repeat=\"item in items | apExprFilter:'!_.isObject($exprItem.a)'\"\r\n// => [{a: 1}, {a: 2}, {a: 3}]\r\n// ng-repeat=\"item in items | apExprFilter:'_.isObject($exprItem.a)'\"\r\n// => [{a: {b: 1}}, {a: {b: 2}}]\r\n\r\n// Parameterized (because this filter doesn't know anything about the scope, and it shouldn't, but if we pass values in, then it can use those):\r\n// Array:\r\n// $0, $1, $2, etc. are locals to the expression that correspond to the other values in the array in order\r\n// ng-repeat=\"item in items | apExprFilter:['$exprItem.a === $0', scopeValue]\"\r\n// => '$exprItem.a === 2'\r\n// => [{a: 2}]\r\n// Object:\r\n// the expression should be expr property of object, the other properties become locals to the expression\r\n// ng-repeat=\"item in items | apExprFilter:{expr: '$exprItem.a === someProperty', someProperty: scopeValue}\"\r\n// => '$exprItem.a === 2'\r\n// => [{a: 2}]\r\n\r\nangular.module('aprima-core').filter('apExprFilter', ['filterFilter', '$parse', '_', function(filter, $parse, _) {\r\n 'use strict';\r\n\r\n var localKeyPrefix = '$';\r\n var localItemKey = '$exprItem';\r\n var exprKey = 'expr';\r\n\r\n return _filter;\r\n\r\n function _filter() {\r\n var locals = {\r\n _: _\r\n };\r\n var expressionDefinition = arguments[1];\r\n var parsedExpression;\r\n\r\n if(_.isArray(expressionDefinition)) {\r\n parsedExpression = $parse(expressionDefinition[0]);\r\n _(expressionDefinition).tail().forEach(function(value, index) {\r\n locals[localKeyPrefix + index] = value;\r\n });\r\n }\r\n else if(_.isObject(expressionDefinition)) {\r\n parsedExpression = $parse(expressionDefinition[exprKey]);\r\n delete expressionDefinition[exprKey];\r\n _.assign(locals, expressionDefinition);\r\n }\r\n else {\r\n parsedExpression = $parse(expressionDefinition);\r\n }\r\n\r\n arguments[1] = filterExpression;\r\n return filter.apply(null, arguments);\r\n\r\n function filterExpression(value) {\r\n locals[localItemKey] = value;\r\n return parsedExpression(locals);\r\n }\r\n }\r\n}]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').filter('formatNum', [\r\n 'NumUtil',\r\n formatNum,\r\n ]);\r\n\r\n function formatNum(\r\n NumUtil\r\n ) {\r\n return NumUtil.format;\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').filter('hasKeys', [\r\n '_',\r\n hasKeysFactory,\r\n ]);\r\n\r\n function hasKeysFactory(\r\n _\r\n ) {\r\n\r\n return hasKeys;\r\n\r\n\r\n function hasKeys(input) {\r\n var keys = _.keys(input);\r\n return keys && keys.length;\r\n }\r\n }\r\n\r\n})(window.angular);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').filter('hasNoKeys', [\r\n 'hasKeysFilter',\r\n hasNoKeysFactory,\r\n ]);\r\n\r\n function hasNoKeysFactory(\r\n hasKeys\r\n ) {\r\n\r\n return hasNoKeys;\r\n\r\n\r\n function hasNoKeys(input) {\r\n var result = !hasKeys(input);\r\n return result;\r\n }\r\n }\r\n\r\n})(window.angular);","angular.module('aprima-core').factory('BrowserService',\r\n [\r\n '$window',\r\n '$log',\r\n 'DeviceSettings', \r\n function (\r\n $window, \r\n $log,\r\n DeviceSettings\r\n ) {\r\n 'use strict';\r\n\r\n var ie = navigator.userAgent.match(/MSIE\\s([\\d.]+)/),\r\n ie11 = navigator.userAgent.match(/Trident\\/7.0/) && navigator.userAgent.match(/rv:11/),\r\n ieEDGE = navigator.userAgent.match(/Edge/g),\r\n ieVer = (ie ? ie[1] : (ie11 ? 11 : (ieEDGE ? 12 : -1)));\r\n\r\n function base64ToBlob(base64String, contentType){\r\n var byteCharacters = atob(base64String);\r\n var byteArray = new Array(byteCharacters.length);\r\n\r\n for (var i = 0; i < byteCharacters.length; i++) {\r\n byteArray[i] = byteCharacters.charCodeAt(i);\r\n }\r\n var byteArrayInt = new Uint8Array(byteArray);\r\n\r\n return new Blob([byteArrayInt], {type: contentType});\r\n }\r\n\r\n function downloadDocumentToFile(fileNameToSaveAs, base64String, contentType, document){\r\n if (!isBlobCompatible()) {\r\n return;\r\n }\r\n\r\n var blob = base64ToBlob(base64String, contentType);\r\n saveBlob(document, blob, fileNameToSaveAs);\r\n }\r\n\r\n function isBlobCompatible(){\r\n if (ie && ieVer<10) {\r\n $log('No blobs on IE ver<10');\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function isLegacyIE() {\r\n return !!(ie || ie11);\r\n }\r\n\r\n function isIE(){\r\n return !!(ie || ie11 || ieEDGE);\r\n }\r\n\r\n function saveBlob(document, blobObj, fileName) {\r\n if (ieVer > -1) {\r\n $window.navigator.msSaveBlob(blobObj, fileName);\r\n\r\n } else {\r\n var downloadLink = document.createElement('a');\r\n downloadLink.download = fileName;\r\n downloadLink.href = $window.URL.createObjectURL(blobObj);\r\n downloadLink.onclick = function (e) {\r\n document.body.removeChild(e.target);\r\n };\r\n downloadLink.style.display = 'none';\r\n document.body.appendChild(downloadLink);\r\n downloadLink.click();\r\n }\r\n }\r\n\r\n function supportsInlinePdf() {\r\n if (isIE() || DeviceSettings.isIos || DeviceSettings.isAndroid) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n return {\r\n base64ToBlob : base64ToBlob,\r\n downloadDocumentToFile : downloadDocumentToFile,\r\n isBlobCompatible: isBlobCompatible,\r\n isIE: isIE,\r\n isLegacyIE: isLegacyIE,\r\n saveBlob: saveBlob,\r\n supportsInlinePdf: supportsInlinePdf,\r\n };\r\n }\r\n ]);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').provider('DeviceSettings', [\r\n DeviceSettingsProvider,\r\n ]);\r\n\r\n function DeviceSettingsProvider() {\r\n return {\r\n $get: [\r\n 'DeviceSettingsRepository',\r\n DeviceSettingsFactory,\r\n ],\r\n };\r\n }\r\n\r\n function DeviceSettingsFactory(DeviceSettingsRepository) {\r\n return DeviceSettingsRepository;\r\n }\r\n})(angular);\r\n","angular.module('aprima-core').factory('Guid', [\r\n function() {\r\n 'use strict';\r\n var Guid = {};\r\n Guid.newGuid = function newGuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n };\r\n Guid.empty = function empty() {\r\n return '00000000-0000-0000-0000-000000000000';\r\n };\r\n return Guid;\r\n }\r\n]);","// This service is an abstraction around the third party numeraljsFilter, \r\n// It is useful in case we want to swap it out with another implementation\r\n\r\n(function(angular) {\r\n 'use strict';\r\n\r\n // todo: this utility library doesn't handle the optional digit before the decimal point correctly \r\n // (it always has a digit before the decimal point, even if it's a leading 0)\r\n // for example:\r\n // format(0, '[0][.]0') => '0', i would expect ''\r\n // format(0.56, '[0][.]0') => '0.6', i would expect '.6'\r\n\r\n // you can get the result without the leading 0, by doing this:\r\n // format(0, '[.]0') => ''\r\n // format(0.56, '[.]0') => '.6'\r\n // these will work as expected,\r\n // but then problem is this:\r\n // format(6.56, '[.]0') => '.6', i would expect '6.6'\r\n // it just never shows anything to the left of the decimal point\\\r\n\r\n // and it's not trivial to just remove the 0 out of there in this function, since the leading zero could be anywhere in the\r\n // result string, since it's based on what format was passed in\r\n // (the format could have a currency symbol or '-' sign at the start of the string, among other things)\r\n // '0.60' or '-0.60' or '$ 0.60' or '$ -0.60'\r\n // these 4 examples all have leading zeroes in a different index in the result string\r\n\r\n // Other Info:\r\n // ===========\r\n // c# formats i've seen in our backend codebase:\r\n // 1. ####.##\r\n // 2. #.##\r\n // 3. .##\r\n // these 3 examples are identical in c#\r\n // they all would convert to [0].[00] for this numeraljs formatter, which translates to\r\n // optional digit followed by decimal, and it has a max of 2 optional digits after the decimal point\r\n\r\n // this regex will handle most or all cases where where it could return '0', when it really should return ''\r\n // because all digits in the format are optional\r\n // this is important only because there are certain cases where if a number value is 0, we could check the result\r\n // to see if it's just an empty string, or if it actually has a value\r\n // [0] at start, followed by ( ([.] and anything after it) OR .([0*])? )?\r\n var zeroToEmptyRegex = /^\\[0]((\\[\\.].*)|(\\.(\\[0*])?))?$/;\r\n\r\n angular.module('aprima-core').factory('NumUtil', [\r\n '_',\r\n 'numeral',\r\n 'numeraljsFilter',\r\n NumUtil,\r\n ]);\r\n\r\n function NumUtil(\r\n _,\r\n numeral,\r\n numeraljsFilter\r\n ) {\r\n\r\n var service = {\r\n format: format,\r\n multiply: multiply,\r\n divide: divide,\r\n add: add,\r\n subtract: subtract,\r\n };\r\n\r\n return service;\r\n\r\n function format(input, format) {\r\n var result = numeraljsFilter(input, format);\r\n \r\n // if the regex matches, return empty string ('') instead of '0'\r\n if(result && result === '0' && zeroToEmptyRegex.test(format)) {\r\n result = '';\r\n }\r\n return result;\r\n }\r\n\r\n // precision multiplication, different from just doing num1 * num2\r\n // check for example 18.7 * 1.5 === 28.049999999999997 vs multiply(18.7, 1.5) === 28.05\r\n // can pass more than 2 arguments, and they will all be multiplied, ex: multiply(2, 3, 8) === 48\r\n function multiply() {\r\n var result = _.reduce(arguments, function(cumulative, num) {\r\n return cumulative.multiply(num);\r\n }, numeral(1)).value();\r\n\r\n return result;\r\n }\r\n\r\n // same idea as multiply function => more precise than num1 / num2\r\n // 6.9 / 3 === 2.3000000000000003 vs divide(6.9, 3) === 2.3\r\n function divide(num1, num2) {\r\n var result = numeral(num1).divide(num2).value();\r\n return result;\r\n }\r\n\r\n // same idea as multiply function => more precise than num1 + num2\r\n // 0.1 + 0.2 === 0.30000000000000004 vs add(0.1, 0.2) === 0.3\r\n function add() {\r\n var result = _.reduce(arguments, function(cumulative, num) {\r\n return cumulative.add(num);\r\n }, numeral(0)).value();\r\n\r\n return result;\r\n }\r\n\r\n // same idea as multiply function => more precise than num1 - num2\r\n // 0.1 - 0.3 === -0.19999999999999998 vs subtract(0.1, 0.3) === -0.2\r\n function subtract(num1, num2) {\r\n var result = numeral(num1).subtract(num2).value();\r\n return result;\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","/*\r\nA set that allows adding values and checking if it contains a value. contains() removes the item from the list.\r\n */\r\nangular.module('aprima-core').factory('SingleAccessSet', [function() {\r\n 'use strict';\r\n\r\n function SingleAccessSet() {\r\n this.set = {};\r\n }\r\n\r\n SingleAccessSet.prototype.add = function add(key) {\r\n this.set[key] = true;\r\n };\r\n\r\n SingleAccessSet.prototype.contains = function contains(key) {\r\n var exists = !!this.set[key];\r\n delete this.set[key];\r\n return exists;\r\n };\r\n\r\n return SingleAccessSet;\r\n}]);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core').factory('StrConvert', [\r\n '_',\r\n StrConvert,\r\n ]);\r\n\r\n function StrConvert(\r\n _\r\n ) {\r\n\r\n var service = {\r\n replaceNewLine: replaceNewLine,\r\n };\r\n\r\n return service;\r\n\r\n function replaceNewLine(str, newVal, oldVal) {\r\n if(!str || !_.isString(str)) {\r\n return str;\r\n }\r\n\r\n var valToReplace = _.isNil(oldVal) ? /(\\r\\n|\\r|\\n)/g : oldVal;\r\n var replacement = _.isNil(newVal) ? '
' : newVal;\r\n\r\n var result = str.replace(valToReplace, replacement);\r\n return result;\r\n }\r\n }\r\n})(window.angular);\r\n","(function(angular, defineProperty) {\r\n 'use strict';\r\n\r\n // similar to c# StringBuilder, but with much less functionality (only a subset of functions)\r\n // will make it easier to port code from C# to js, if necessary\r\n\r\n var newLine = '\\r\\n';\r\n\r\n angular.module('aprima-core').factory('StringBuilder', [\r\n '_',\r\n StringBuilderFactory,\r\n ]);\r\n \r\n function StringBuilderFactory(\r\n _\r\n ) {\r\n var service = {\r\n init: init,\r\n };\r\n \r\n return service;\r\n \r\n function init(initialStr) {\r\n var sb = new StringBuilder(initialStr);\r\n return sb;\r\n }\r\n\r\n function StringBuilder(initialStr) {\r\n var self = this;\r\n \r\n var baseStr = initialStr || '';\r\n\r\n self.Append = append;\r\n self.AppendLine = appendLine;\r\n self.ToString = toString;\r\n defineProperty(self, 'Length', {\r\n get: stringLength,\r\n enumerable: true,\r\n configurable: false,\r\n });\r\n \r\n function append(str) {\r\n baseStr += str;\r\n return self;\r\n }\r\n\r\n function appendLine(str) {\r\n if(!_.isNil(str) && !_.isNaN(str)) {\r\n baseStr += str;\r\n }\r\n baseStr += newLine;\r\n return self;\r\n }\r\n \r\n function stringLength() {\r\n return baseStr.length;\r\n }\r\n \r\n function toString() {\r\n return baseStr;\r\n }\r\n }\r\n }\r\n\r\n})(window.angular, window.Object.defineProperty);\r\n","(function(angular, floor, pow) {\r\n 'use strict';\r\n\r\n // in PRM these are the formats for the observation value measurements:\r\n // (According to FrameworkBO.Util.Observation.ObservationFormatter)\r\n // ====================================================================\r\n // 1. public const string MetricWeightMask = \"####0.000\";\r\n var kgPrecision = 3;\r\n\r\n // 2. public const string EnglishPoundMask = \"####0.000\";\r\n // this will always be converted to an integer, because the ounces will have the fractional amount\r\n\r\n // 3. public const string EnglishOzMask = \"###0.0\";\r\n // the precision of oz is 1 regardless of this mask declared in PRM, because the conversion code rounds\r\n // to a precision of 1\r\n var ozPrecision = 1;\r\n\r\n // 4. public const string MetricCMMask = \"####0.000\";\r\n var cmPrecision = 3;\r\n\r\n // 5. public const string EnglishFeetMask = \"####0\";\r\n // this will always be converted to an integer, because the inches will have the fractional amount\r\n\r\n // 6. public const string EnglishInchMask = \"###0.000\";\r\n // the precision of in is 1 regardless of this mask declared in PRM, because the conversion code rounds\r\n // to a precision of 1\r\n var inPrecision = 1;\r\n // ======================================================================\r\n\r\n\r\n // Multipliers:\r\n // 1 lb ~= 0.45359237 kg\r\n var lbsToKgMultiplier = 0.45359237;\r\n // 1 oz ~= 0.0283495231 kg\r\n var ozToKgMultiplier = 0.0283495231;\r\n\r\n // 1 kg ~= 2.2046226218 lbs\r\n var kgToLbsMultiplier = 2.2046226218;\r\n // 1 lb == 16 oz\r\n var lbsToOzMultiplier = 16;\r\n\r\n // 1 ft ~= 30.48 cm\r\n var ftToCmMultiplier = 30.48;\r\n // 1 in ~= 2.54 cm\r\n var inToCmMultiplier = 2.54;\r\n\r\n // 1 cm ~= 0.032808399 ft\r\n var cmToFtMultiplier = 0.032808399;\r\n // 1 ft == 12 in\r\n var ftToInMultiplier = 12;\r\n\r\n angular.module('aprima-core').factory('UnitConvert', [\r\n '_',\r\n 'NumUtil',\r\n UnitConvert,\r\n ]);\r\n\r\n function UnitConvert(\r\n _,\r\n NumUtil\r\n ) {\r\n\r\n var service = {\r\n usToKg: convertUsToKg,\r\n usToKgRounded: convertUsToKgRounded,\r\n roundKg: roundKg,\r\n usToCm: convertUsToCm,\r\n usToCmRounded: convertUsToCmRounded,\r\n roundCm: roundCm,\r\n kgToUs: convertKgToUs,\r\n kgToUsRounded: convertKgToUsRounded,\r\n cmToUs: convertCmToUs,\r\n cmToUsRounded: convertCmToUsRounded,\r\n getBodySurfaceArea: getBodySurfaceArea,\r\n };\r\n\r\n return service;\r\n\r\n function convertUsToKg(lbs, oz) {\r\n var totalKg = NumUtil.add(NumUtil.multiply((lbs || 0), lbsToKgMultiplier), NumUtil.multiply((oz || 0), ozToKgMultiplier));\r\n return totalKg;\r\n }\r\n\r\n function convertUsToKgRounded(lbs, oz) {\r\n var roundedKg = roundKg(convertUsToKg(lbs, oz));\r\n return roundedKg;\r\n }\r\n \r\n function roundKg(kg) {\r\n var roundedKg = _.round(kg, kgPrecision);\r\n return roundedKg;\r\n }\r\n\r\n function convertUsToCm(ft, inches) {\r\n var totalCm = NumUtil.add(NumUtil.multiply((ft || 0), ftToCmMultiplier), NumUtil.multiply((inches || 0), inToCmMultiplier));\r\n return totalCm;\r\n }\r\n\r\n function convertUsToCmRounded(ft, inches) {\r\n var roundedCm = roundCm(convertUsToCm(ft, inches));\r\n return roundedCm;\r\n }\r\n \r\n function roundCm(cm) {\r\n var roundedCm = _.round(cm, cmPrecision);\r\n return roundedCm;\r\n }\r\n\r\n function convertKgToUs(kg) {\r\n var totalPounds = NumUtil.multiply((kg || 0), kgToLbsMultiplier);\r\n var lbs = floor(totalPounds);\r\n var oz = NumUtil.multiply(NumUtil.subtract(totalPounds, lbs), lbsToOzMultiplier);\r\n\r\n var result = {\r\n pounds: lbs,\r\n ounces: oz,\r\n };\r\n\r\n return result;\r\n }\r\n\r\n function convertKgToUsRounded(kg) {\r\n var usMeasurements = convertKgToUs(kg);\r\n usMeasurements.ounces = _.round(usMeasurements.ounces, ozPrecision);\r\n return usMeasurements;\r\n }\r\n\r\n function convertCmToUs(cm) {\r\n var totalFeet = NumUtil.multiply((cm || 0), cmToFtMultiplier);\r\n var ft = floor(totalFeet);\r\n var inches = NumUtil.multiply(NumUtil.subtract(totalFeet, ft), ftToInMultiplier);\r\n\r\n var result = {\r\n feet: ft,\r\n inches: inches,\r\n };\r\n\r\n return result;\r\n }\r\n\r\n function convertCmToUsRounded(cm) {\r\n var usMeasurements = convertCmToUs(cm);\r\n usMeasurements.inches = _.round(usMeasurements.inches, inPrecision);\r\n return usMeasurements;\r\n }\r\n \r\n // Returns the body surface area as calculated using the DuBois formula method.\r\n function getBodySurfaceArea(heightCm, weightKg) {\r\n if(!heightCm || !weightKg) {\r\n return 0;\r\n }\r\n \r\n // body surface area = 0.007184 * height(cm) to the 0.725 power * weight(kg) to the 0.425 power.\r\n var bsa = NumUtil.multiply(0.007184, pow(heightCm, 0.725), pow(weightKg, 0.425));\r\n return bsa;\r\n }\r\n }\r\n\r\n})(window.angular, window.Math.floor, window.Math.pow);\r\n"]}