Difference between revisions of "MediaWiki:Gadget-calculator-drugs-core.js"

From WikiAnesthesia
Line 3: Line 3:
  */
  */
( function() {
( function() {
    var DEFAULT_DRUG_COLOR = 'default';
    var DEFAULT_DRUG_POPULATION = 'general';
    var DEFAULT_DRUG_ROUTE = 'iv';
    mw.calculators.isValueDependent = function( value, variableId ) {
        // This may need generalized to support other variables in the future
        if( variableId === 'weight' ) {
            return value && value.formatUnits().match( /\/[\s(]*?kg/ );
        } else {
            throw new Error( 'Dependence "' + variableId + '" not supported by isValueDependent' );
        }
    };
     /**
     /**
     * Define units
     * DrugColor data
     */
     */
     mw.calculators.addUnitsBases( {
     mw.calculators.addDrugColors( {
         concentration: {
         anticholinergic: {
             toString: function( units ) {
             primaryColor: '#9fc96b'
                units = units.replace( ' pct', '%' );
        },
                units = units.replace( 'ug', 'mcg' );
        benzodiazepine: {
 
            primaryColor: '#f57921'
                return units;
        },
             }
        benzodiazepineReversal: {
            parentColor: 'benzodiazepine',
            striped: true
        },
        cardiovascularAgonist: {
            primaryColor: '#e1c9df'
        },
        cardiovascularAntagonist: {
            parentColor: 'cardiovascularAgonist',
            striped: true
        },
        default: {
            primaryColor: '#fff',
            highlightColor: '#fff'
        },
        desflurane: {
            primaryColor: '#0072ae'
        },
        enflurane: {
            primaryColor: '#f9a23b'
        },
        epinephrine: {
            parentColor: 'cardiovascularAgonist',
            highlightColor: '#000'
        },
        halothane: {
            primaryColor: '#b20107'
        },
        isoflurane: {
            primaryColor: '#92278f'
        },
        localAnesthetic: {
            primaryColor: '#b6b2a9'
        },
        neuromuscularBlocker: {
            primaryColor: '#f15563'
        },
        neuromuscularBlockerReversal: {
             parentColor: 'neuromuscularBlocker',
            striped: true
        },
        nitrousOxide: {
            primaryColor: '#004f7c'
        },
        opioid: {
            primaryColor: '#6bc8ea'
         },
         },
         mass: {
         opioidReversal: {
             toString: function( units ) {
             parentColor: 'opioid',
                units = units.replace( 'ug', 'mcg' );
             striped: true
 
                return units;
            }
        }
    } );
 
    mw.calculators.addUnits( {
        mcg: {
            baseName: 'mass',
             definition: '1 ug'
         },
         },
         pct: {
         sedativeHypnotic: {
             baseName: 'concentration',
             primaryColor: '#f7e20a'
            definition: '10 mg/mL'
         },
         },
         units: {
         sevoflurane: {
             baseName: 'mass_abstract',
             primaryColor: '#ffe715'
            aliases: [
                'unit'
            ]
         },
         },
         vial: {
         succinylcholine: {
             baseName: 'volume_abstract'
             parentColor: 'neuromuscularBlocker',
            highlightColor: '#000'
         }
         }
     } );
     } );
Line 60: Line 79:


     /**
     /**
     * DrugColor
     * DrugPopulation data
     */
     */
     mw.calculators.drugColors = {};
     mw.calculators.addDrugPopulations( {
        general: {
            name: 'General',
        },
        general120kg: {
            name: 'General (≥120kg)',
            abbreviation: '≥120kg',
            variables: {
                weight: {
                    min: '120 kgwt'
                }
            }
        },
        neonatal: {
            name: 'Neonatal',
            variables: {
                age: {
                    max: '0 yo'
                }
            }
        },
        pediatric: {
            name: 'Pediatric',
            variables: {
                age: {
                    min: '0 yo',
                    max: '17.9 yo'
                }
            }
        },
        geriatric: {
            name: 'Geriatric',
            variables: {
                age: {
                    min: '65 yo'
                }
            }
        }
    } );


    mw.calculators.addDrugColors = function( drugColorData ) {
        var drugColors = mw.calculators.createCalculatorObjects( 'DrugColor', drugColorData );


        for( var drugColorId in drugColors ) {
            mw.calculators.drugColors[ drugColorId ] = drugColors[ drugColorId ];
        }
    };
    mw.calculators.getDrugColor = function( drugColorId ) {
        if( mw.calculators.drugColors.hasOwnProperty( drugColorId ) ) {
            return mw.calculators.drugColors[ drugColorId ];
        } else {
            return null;
        }
    };


     /**
     /**
     * Class DrugColor
     * DrugRoute data
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugColor}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugColor = function( propertyValues ) {
     mw.calculators.addDrugRoutes( {
         var properties = {
         iv: {
             required: [
             name: 'Intravenous',
                'id'
            abbreviation: 'IV',
             ],
             default: true
             optional: [
        },
                'parentColor',
        im: {
                'primaryColor',
             name: 'Intramuscular',
                'highlightColor',
            abbreviation: 'IM'
                'striped'
        },
            ]
        po: {
         };
            name: 'Oral',
 
            abbreviation: 'PO'
        mw.calculators.objectClasses.CalculatorObject.call( this, properties, propertyValues );
         },
 
         pr: {
         this.parentColor = this.parentColor || this.id === DEFAULT_DRUG_COLOR ? this.parentColor : DEFAULT_DRUG_COLOR;
            name: 'Rectal',
    };
             abbreviation: 'PR'
 
    mw.calculators.objectClasses.DrugColor.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
 
    mw.calculators.objectClasses.DrugColor.prototype.getParentDrugColor = function() {
        if( !this.parentColor ) {
             return null;
         }
         }
    } );


        var parentDrugColor = mw.calculators.getDrugColor( this.parentColor );


        if( !parentDrugColor ) {
            throw new Error( 'Parent drug color "' + this.parentColor + '" not found for drug color "' + this.id + '"' );
        }


        return parentDrugColor;
    /**
    };
    * DrugIndication data
 
    */
     mw.calculators.objectClasses.DrugColor.prototype.getHighlightColor = function() {
     mw.calculators.addDrugIndications( {
         if( this.highlightColor ) {
         abxProphylaxis: {
             return this.highlightColor;
            name: 'Antimicrobial prophylaxis',
         } else if( this.parentColor ) {
            abbreviation: 'Abx.'
             return this.getParentDrugColor().getHighlightColor();
        },
        acls: {
            name: 'ACLS',
            abbreviation: 'ACLS'
        },
        analgesia: {
            name: 'Analgesia',
            abbreviation: 'Analgesia'
        },
        anaphylaxis: {
            name: 'Anaphylaxis',
            abbreviation: 'Anaphylaxis'
        },
        anxiolysis: {
            name: 'Anxiolysis',
            abbreviation: 'Anxiety'
        },
        bradycardia: {
            name: 'Bradycardia',
            abbreviation: 'Bradycardia'
        },
        generalAnesthesia: {
            name: 'General anesthesia',
            abbreviation: 'GA'
        },
        hypotension: {
             name: 'Hypotension',
            abbreviation: 'Hypoten.'
        },
        hypocalcemia: {
            name: 'Hypocalcemia',
            abbreviation: 'Hypo Ca<sup>2+</sup>'
        },
        intubation: {
            name: 'Intubation',
            abbreviation: 'Intubation'
        },
        malignantHyperthermia: {
            name: 'Malignant hyperthermia',
            abbreviation: 'MH'
        },
        neuromuscularBlockade: {
            name: 'Neuromuscular blockade',
            abbreviation: 'NMB'
        },
        neuromuscularBlockadeReversal: {
            name: 'Neuromuscular blockade reversal',
            abbreviation: 'NMB reversal'
        },
        mac: {
            name: 'Monitored anesthesia care',
            abbreviation: 'MAC'
        },
        ponv: {
            name: 'Postoperative nausea & vomiting',
            abbreviation: 'PONV'
         },
        tiva: {
             name: 'Total intravenous anesthesia',
            abbreviation: 'TIVA'
         }
         }
     };
     } );


    mw.calculators.objectClasses.DrugColor.prototype.getPrimaryColor = function() {
        if( this.primaryColor ) {
            return this.primaryColor;
        } else if( this.parentColor ) {
            return this.getParentDrugColor().getPrimaryColor();
        }
    };
    mw.calculators.objectClasses.DrugColor.prototype.isStriped = function() {
        if( this.striped !== null ) {
            return this.striped;
        } else if( this.parentColor ) {
            return this.getParentDrugColor().isStriped();
        }
    };




    /**
    * Drug data
    */






     /**
     /**
     * DrugPopulation
     * Acetaminophen
     */
     */
 
     mw.calculators.addDrugs( {
     mw.calculators.drugPopulations = {};
        acetaminophen: {
 
            name: 'Acetaminophen',
    mw.calculators.addDrugPopulations = function( drugPopulationData ) {
            dosages: [
        var drugPopulations = mw.calculators.createCalculatorObjects( 'DrugPopulation', drugPopulationData );
                {
 
                    indication: 'analgesia',
        for( var drugPopulationId in drugPopulations ) {
                    population: 'general',
            mw.calculators.drugPopulations[ drugPopulationId ] = drugPopulations[ drugPopulationId ];
                    description: 'Max dose 4 g/day. Use caution in hepatic impairment.',
                    dose: {
                        dose: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'general',
                    route: 'po',
                    description: 'Max dose 4 g/day. Use caution in hepatic impairment.',
                    dose: {
                        min: '650 mg',
                        max: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'general',
                    route: 'pr',
                    description: 'Max dose 4 g/day. Use caution in hepatic impairment.',
                    dose: {
                        min: '650 mg',
                        max: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    description: 'Max 75 mg/kg/day or 4 g/day (whichever is less). Use caution in hepatic impairment.',
                    dose: {
                        dose: '15 mg/kg',
                        absoluteMax: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    route: 'po',
                    description: 'Max 75 mg/kg/day or 4 g/day (whichever is less). Use caution in hepatic impairment.',
                    dose: {
                        dose: '15 mg/kg',
                        absoluteMax: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    route: 'pr',
                    description: 'Max 100 mg/kg/day or 4 g/day (whichever is less). Use caution in hepatic impairment.',
                    references: [
                        'Patrick K. Birmingham, AF1-0567, Michael J. Tobin, Dennis M. Fisher, Thomas K. Henthorn, Steven C. Hall, Charles J. Coté; Initial and Subsequent Dosing of Rectal Acetaminophen in Children: A 24-Hour Pharmacokinetic Study of New Dose Recommendations. Anesthesiology 2001; 94:385–389 doi: https://doi.org/10.1097/00000542-200103000-00005'
                    ],
                    dose: [
                        {
                            name: 'Load',
                            dose: '40 mg/kg',
                            absoluteMax: '1 g'
                        }, {
                            name: 'Maintenance',
                            dose: '20 mg/kg',
                            absoluteMax: '1 g'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/mL'
                }
            ]
         }
         }
     };
     } );
 
    mw.calculators.getDrugPopulation = function( drugPopulationId ) {
        if( mw.calculators.drugPopulations.hasOwnProperty( drugPopulationId ) ) {
            return mw.calculators.drugPopulations[ drugPopulationId ];
        } else {
            return null;
        }
    };






     /**
     /**
     * Class DrugPopulation
     * Atropine
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugPopulation}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugPopulation = function( propertyValues ) {
     mw.calculators.addDrugs( [
         var properties = {
         {
             required: [
             id: 'atropine',
                 'id',
            name: 'Atropine',
                 'name'
            color: 'anticholinergic',
            description: 'Low doses may cause paradoxical bradycardia',
            dosages: [
                 {
                    indication: 'bradycardia',
                    population: 'general',
                    description: 'Repeat as needed to a maximum total dose of 3 mg',
                    dose: {
                        min: '0.5 mg',
                        max: '1 mg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'bradycardia',
                    population: 'pediatric',
                    description: 'Repeat as needed to a maximum total dose of 1 mg',
                    dose: {
                        min: '10 mcg/kg',
                        max: '20 mcg/kg',
                        absoluteMin: '40 mcg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'acls',
                    population: 'general',
                    description: 'Repeat as needed to a maximum total dose of 3 mg',
                    dose: {
                        dose: '1 mg',
                        frequency: 'q3-5m'
                    }
                 }, {
                    indication: 'acls',
                    population: 'pediatric',
                    description: 'Repeat as needed to a maximum total dose of 1 mg',
                    dose: {
                        dose: '20 mcg/kg',
                        absoluteMin: '100 mcg',
                        absoluteMax: '500 mcg',
                        frequency: 'q3-5m'
                    }
                }
             ],
             ],
             optional: [
             preparations: [
                 'abbreviation',
                 {
                'variables'
                    concentration: '0.1 mg/mL'
                }, {
                    concentration: '0.4 mg/mL',
                    default:true
                }
             ]
             ]
        };
        mw.calculators.objectClasses.CalculatorObject.call( this, properties, propertyValues );
        if( this.variables ) {
            for( var variableId in this.variables ) {
                if( !mw.calculators.getVariable( variableId ) ) {
                    throw new Error( 'DrugPopulation variable "' + variableId + '" not defined' );
                }
                this.variables[ variableId ].min = this.variables[ variableId ].hasOwnProperty( 'min' ) ?
                    math.unit( this.variables[ variableId ].min ) : null;
                this.variables[ variableId ].max = this.variables[ variableId ].hasOwnProperty( 'max' ) ?
                    math.unit( this.variables[ variableId ].max ) : null;
            }
        } else {
            this.variables = {};
         }
         }
     };
     ] );


    mw.calculators.objectClasses.DrugPopulation.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );


    mw.calculators.objectClasses.DrugPopulation.prototype.getCalculationData = function() {
        var inputData = new mw.calculators.objectClasses.CalculationData();


         for( var variableId in this.variables ) {
    /**
             inputData.variables.required.push( variableId );
    * Calcium chloride
    */
    mw.calculators.addDrugs( [
         {
             id: 'calciumChloride',
            name: 'Calcium chloride',
            description: '<ul><li>Administer via central line</li><li>A 10 mL ampule of calcium chloride 100 mg/mL contains 272 mg of elemental calcium</li></ul>',
            references: [
                'French S, Subauste J, Geraci S. Calcium abnormalities in hospitalized patients. South Med J. 2012 Apr;105(4):231-7. doi: 10.1097/SMJ.0b013e31824e1737. PMID: 22475676.'
            ],
            dosages: [
                {
                    indication: 'hypocalcemia',
                    population: 'general',
                    dose: {
                        min: '500 mg',
                        max: '1 g',
                        duration: '5-10 min'
                    }
                }, {
                    indication: 'hypocalcemia',
                    population: 'pediatric',
                    dose: {
                        min: '10 mg/kg',
                        max: '20 mg/kg',
                        absoluteMax: '1 g',
                        duration: '5-10 min'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '100 mg/mL'
                }
            ]
         }
         }
    ] );


        return inputData;
    };


    mw.calculators.objectClasses.DrugPopulation.prototype.getCalculationDataScore = function( dataValues ) {
        // A return value of -1 indicates the data did not match the population definition


         for( var variableId in this.variables ) {
    /**
             if( !dataValues.hasOwnProperty( variableId ) ) {
    * Calcium gluconate
                return -1;
    */
             }
    mw.calculators.addDrugs( [
 
         {
             if( this.variables[ variableId ].min &&
             id: 'calciumGluconate',
                 ( !dataValues[ variableId ] ||
            name: 'Calcium gluconate',
                     !math.largerEq( dataValues[ variableId ], this.variables[ variableId ].min ) ) ) {
            description: '<ul><li>Can administer peripherally</li><li>A 10 mL ampule of calcium gluconate 100 mg/mL contains 93 mg of elemental calcium</li></ul>',
                return -1;
            references: [
            }
                'French S, Subauste J, Geraci S. Calcium abnormalities in hospitalized patients. South Med J. 2012 Apr;105(4):231-7. doi: 10.1097/SMJ.0b013e31824e1737. PMID: 22475676.'
 
             ],
             if( this.variables[ variableId ].max &&
             dosages: [
                 ( !dataValues[ variableId ] ||
                {
                     !math.smallerEq( dataValues[ variableId ], this.variables[ variableId ].max ) ) ) {
                    indication: 'hypocalcemia',
                 return -1;
                    population: 'general',
             }
                    dose: {
                        min: '1 g',
                        max: '2 g',
                        duration: '5-10 min'
                    }
                 }, {
                    indication: 'hypocalcemia',
                     population: 'pediatric',
                    dose: {
                        dose: '30 mg/kg',
                        absoluteMax: '2 g',
                        duration: '5-10 min'
                    }
                }
            ],
             preparations: [
                 {
                     concentration: '100 mg/mL'
                 }
             ]
         }
         }
 
     ] );
        // If the data matches the population definition, the score corresponds to the number of variables in the
        // population definition. This should roughly correspond to the specificity of the population.
        return Object.keys( this.variables ).length;
    };
 
     mw.calculators.objectClasses.DrugPopulation.prototype.toString = function() {
        return mw.calculators.isMobile() && this.abbreviation ? this.abbreviation : this.name;
    };






     /**
     /**
     * DrugRoute
     * Cefazolin
     */
     */
     mw.calculators.drugRoutes = {};
     mw.calculators.addDrugs( {
        cefazolin: {
            name: 'Cefazolin',
            dosages: [
                {
                    indication: 'abxProphylaxis',
                    population: 'general',
                    dose: {
                        dose: '2 g',
                        frequency: 'q4h'
                    }
                }, {
                    indication: 'abxProphylaxis',
                    population: 'general120kg',
                    dose: {
                        dose: '3 g',
                        frequency: 'q4h'
                    }
                }, {
                    indication: 'abxProphylaxis',
                    population: 'pediatric',
                    dose: {
                        dose: '30 mg/kg',
                        frequency: 'q4h'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '1 g/vial'
                }
            ]
        }
    } );


    mw.calculators.addDrugRoutes = function( drugRouteData ) {
        var drugRoutes = mw.calculators.createCalculatorObjects( 'DrugRoute', drugRouteData );
        for( var drugRouteId in drugRoutes ) {
            mw.calculators.drugRoutes[ drugRouteId ] = drugRoutes[ drugRouteId ];
        }
    };


    mw.calculators.getDrugRoute = function( drugRouteId ) {
        if( mw.calculators.drugRoutes.hasOwnProperty( drugRouteId ) ) {
            return mw.calculators.drugRoutes[ drugRouteId ];
        } else {
            return null;
        }
    };


     /**
     /**
     * Class DrugRoute
     * Cisatracurium
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugRoute}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugRoute = function( propertyValues ) {
     mw.calculators.addDrugs( {
         var properties = {
         cisatracurium: {
             required: [
             name: 'Cisatracurium',
                 'id',
            color: 'neuromuscularBlocker',
                'name'
            dosages: [
                 {
                    indication: 'neuromuscularBlockade',
                    population: 'general',
                    dose: {
                        dose: '0.2 mg/kg'
                    }
                }
             ],
             ],
             optional: [
             preparations: [
                 'abbreviation',
                 {
                'default'
                    concentration: '2 mg/mL'
                }, {
                    concentration: '20 mg/mL'
                }
             ]
             ]
         };
         }
 
     } );
        mw.calculators.objectClasses.CalculatorObject.call( this, properties, propertyValues );
     };
 
    mw.calculators.objectClasses.DrugRoute.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
 
    mw.calculators.objectClasses.DrugRoute.prototype.toString = function() {
        return mw.calculators.isMobile() && this.abbreviation ? this.abbreviation : this.name;
    };
 
 
 
 






     /**
     /**
     * DrugIndication
     * Dantrolene
     */
     */
     mw.calculators.drugIndications = {};
     mw.calculators.addDrugs( {
        dantrolene: {
            name: 'Dantrolene',
            dosages: [
                {
                    indication: 'malignantHyperthermia',
                    population: 'general',
                    dose: {
                        dose: '2.5 mg/kg'
                    },
                    description: 'Repeat up to a cumulative dose of 10 mg/kg'
                }
            ],
            preparations: [
                {
                    concentration: '250 mg/vial'
                }, {
                    concentration: '20 mg/vial'
                }
            ]
        }
    } );


    mw.calculators.addDrugIndications = function( drugIndicationData ) {
        var drugIndications = mw.calculators.createCalculatorObjects( 'DrugIndication', drugIndicationData );


        for( var drugIndicationId in drugIndications ) {
            mw.calculators.drugIndications[ drugIndicationId ] = drugIndications[ drugIndicationId ];
        }
    };
    mw.calculators.getDrugIndication = function( drugIndicationId ) {
        if( mw.calculators.drugIndications.hasOwnProperty( drugIndicationId ) ) {
            return mw.calculators.drugIndications[ drugIndicationId ];
        } else {
            return null;
        }
    };


     /**
     /**
     * Class DrugIndication
     * Dexmedetomidine
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugIndication}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugIndication = function( propertyValues ) {
     mw.calculators.addDrugs( {
         var properties = {
         dexmedetomidine: {
             required: [
             name: 'Dexmedetomidine',
                 'id',
            color: 'sedativeHypnotic',
                'name'
            dosages: [
                 {
                    indication: 'mac',
                    population: 'general',
                    dose: [
                        {
                            name: 'Load',
                            dose: '1 mcg/kg',
                            duration: '10 min'
                        }, {
                            name: 'Maintenance',
                            min: '0.2 mcg/kg/hr',
                            max: '1 mcg/kg/hr'
                        }
                    ]
                }
             ],
             ],
             optional: [
             preparations: [
                 'abbreviation',
                 {
                'default'
                    concentration: '4 mcg/mL'
                }, {
                    concentration: '100 mcg/mL',
                    dilutionRequired: true
                }
             ]
             ]
         };
         }
 
     } );
        mw.calculators.objectClasses.CalculatorObject.call( this, properties, propertyValues );
     };
 
    mw.calculators.objectClasses.DrugIndication.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
 
    mw.calculators.objectClasses.DrugIndication.prototype.toString = function() {
        return mw.calculators.isMobile() && this.abbreviation ? this.abbreviation : this.name;
    };
 
 






     /**
     /**
     * Drug
     * Dexamethasone
     */
     */
    mw.calculators.drugs = {};
     mw.calculators.addDrugs( [
 
        {
     mw.calculators.addDrugs = function( drugData ) {
            id: 'dexamethasone',
        var drugs = mw.calculators.createCalculatorObjects( 'Drug', drugData );
            name: 'Dexamethasone',
 
             dosages: [
        for( var drugId in drugs ) {
                 {
             mw.calculators.drugs[ drugId ] = drugs[ drugId ];
                     indication: 'ponv',
 
                     population: 'general',
            var drugDosageCalculationId = mw.calculators.getDrugDosageCalculationId( drugId );
                     dose: {
            var drugDosageCalculation = mw.calculators.getCalculation( drugDosageCalculationId );
                        min: '4 mg',
 
                        max: '8 mg'
            if( !drugDosageCalculation ) {
                    }
                 var calculationData = {};
                 }, {
 
                    indication: 'ponv',
                calculationData[ drugDosageCalculationId ] = {
                    population: 'pediatric',
                     calculate: mw.calculators.objectClasses.DrugDosageCalculation.prototype.calculate,
                    dose: {
                     drug: drugId,
                        dose: '0.1 mg/kg',
                     type: 'drug'
                        absoluteMax: '10 mg'
                };
                    }
 
                }
                mw.calculators.addCalculations( calculationData, 'DrugDosageCalculation' );
            ],
 
            preparations: [
                 drugDosageCalculation = mw.calculators.getCalculation( drugDosageCalculationId );
                {
            }
                    concentration: '2 mg/mL'
 
                }
            drugDosageCalculation.setDependencies();
             ]
        }
    };
 
    mw.calculators.addDrugDosages = function( drugId, drugDosageData ) {
        var drug = mw.calculators.getDrug( drugId );
 
        if( !drug ) {
            throw new Error( 'DrugDosage references drug "' + drugId + '" which is not defined' );
        }
 
        drug.addDosages( drugDosageData );
 
        // Update calculation dependencies
        var drugDosageCalculation = mw.calculators.getCalculation( mw.calculators.getDrugDosageCalculationId( drugId ) );
 
        drugDosageCalculation.updateVariables();
        drugDosageCalculation.setDependencies();
    };
 
    mw.calculators.getDrug = function( drugId ) {
        if( mw.calculators.drugs.hasOwnProperty( drugId ) ) {
            return mw.calculators.drugs[ drugId ];
        } else {
             return null;
         }
         }
     };
     ] );






     /**
     /**
     * Class Drug
     * Dobutamine
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.Drug}
    * @constructor
     */
     */
     mw.calculators.objectClasses.Drug = function( propertyValues ) {
     mw.calculators.addDrugs( {
         mw.calculators.objectClasses.CalculatorObject.call( this, this.getProperties(), propertyValues );
         dobutamine: {
 
             name: 'Dobutamine',
        if( !this.color ) {
            color: 'cardiovascularAgonist',
             this.color = DEFAULT_DRUG_COLOR;
             description: 'First line vasopressor for cardiogenic shock with low cardiac output and maintained blood pressure',
        }
             dosages: [
 
                {
        var color = mw.calculators.getDrugColor( this.color );
                    indication: 'hypotension',
 
                    population: 'general',
        if( !color ) {
                    references: [
             throw new Error( 'Invalid drug color "' + this.color + '" for drug "' + this.id + '"' );
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
        }
                    ],
 
                    dose: {
        this.color = color;
                        min: '0.5 mcg/kg/min',
 
                        max: '20 mcg/kg/min'
        if( this.preparations ) {
                    }
            var preparationData = this.preparations;
 
            this.preparations = [];
 
            this.addPreparations( preparationData );
        } else {
            this.preparations = [];
        }
 
        if( this.dosages ) {
             var dosageData = this.dosages;
 
            this.dosages = [];
 
            this.addDosages( dosageData );
        } else {
            this.dosages = [];
        }
 
        this.references = this.references ? this.references : [];
    };
 
    mw.calculators.objectClasses.Drug.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
 
    mw.calculators.objectClasses.Drug.prototype.addDosages = function( dosageData ) {
        var dosages = mw.calculators.createCalculatorObjects( 'DrugDosage', dosageData );
 
        for( var dosageId in dosages ) {
            dosages[ dosageId ].id = this.dosages.length;
 
            this.dosages.push( dosages[ dosageId ] );
        }
    };
 
    mw.calculators.objectClasses.Drug.prototype.addPreparations = function( preparationData ) {
        var preparations = mw.calculators.createCalculatorObjects( 'DrugPreparation', preparationData );
 
        for( var preparationId in preparations ) {
            preparations[ preparationId ].id = this.preparations.length;
 
            this.preparations.push( preparations[ preparationId ] );
        }
    };
 
    mw.calculators.objectClasses.Drug.prototype.getIndications = function() {
        var indications = [];
 
        for( var iDosage in this.dosages ) {
            if( this.dosages[ iDosage ].indication ) {
                indications.push( this.dosages[ iDosage ].indication );
            }
        }
 
        return indications.filter( mw.calculators.uniqueValues );
    };
 
    mw.calculators.objectClasses.Drug.prototype.getPopulations = function( indicationId ) {
        var populations = [];
 
        for( var iDosage in this.dosages ) {
            if( this.dosages[ iDosage ].population &&
                ( !indicationId || ( this.dosages[ iDosage ].indication && this.dosages[ iDosage ].indication.id === indicationId ) ) ) {
                populations.push( this.dosages[ iDosage ].population );
            }
        }
 
        return populations.filter( mw.calculators.uniqueValues );
    };
 
    mw.calculators.objectClasses.Drug.prototype.getRoutes = function( indicationId ) {
        var routes = [];
 
        for( var iDosage in this.dosages ) {
            if( this.dosages[ iDosage ].route &&
                ( !indicationId || ( this.dosages[ iDosage ].indication && this.dosages[ iDosage ].indication.id === indicationId ) ) ) {
                routes.push( this.dosages[ iDosage ].route );
            }
        }
 
        return routes.filter( mw.calculators.uniqueValues );
    };
 
    mw.calculators.objectClasses.Drug.prototype.getPreparations = function( excludeDilutionRequired ) {
        var preparations = this.preparations.filter( mw.calculators.uniqueValues );
 
        if( excludeDilutionRequired ) {
            for( var iPreparation in preparations ) {
                if( preparations[ iPreparation ].dilutionRequired ) {
                    delete preparations[ iPreparation ];
                 }
                 }
            }
        }
        return preparations;
    };
    mw.calculators.objectClasses.Drug.prototype.getProperties = function() {
        return {
            required: [
                'id',
                'name'
             ],
             ],
             optional: [
             preparations: [
                 'color',
                 {
                'description',
                    concentration: '0.5 mg/mL'
                 'dosages',
                 }, {
                'preparations',
                    concentration: '12.5 mg/mL'
                 'references'
                 }
             ]
             ]
         };
         }
     };
     } );
 
 






     /**
     /**
     * DrugPreparation
     * Dopamine
     */
     */
     mw.calculators.addDrugPreparations = function( drugId, drugPreparationData ) {
     mw.calculators.addDrugs( {
        var drug = mw.calculators.getDrug( drugId );
        dopamine: {
 
            name: 'Dopamine',
        if( !drug ) {
            color: 'cardiovascularAgonist',
             throw new Error( 'DrugPreparation references drug "' + drugId + '" which is not defined' );
            description: '<ul><li>Predominant receptor activation is dose-dependent:<ul><li><5 mcg/kg/min: Dopaminergic</li><li>5-10 mcg/kg/min: &beta;-1 adrenergic</li><li>>10 mcg/kg/min: &alpha;-1 adrenergic</li></ul></li><li>Low-dose dopamine should not be used for renal protective effect</li></ul>',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.',
                        'Bellomo R, Chapman M, Finfer S, Hickling K, Myburgh J. Low-dose dopamine in patients with early renal dysfunction: a placebo-controlled randomised trial. Australian and New Zealand Intensive Care Society (ANZICS) Clinical Trials Group. Lancet. 2000 Dec 23-30;356(9248):2139-43. doi: 10.1016/s0140-6736(00)03495-4. PMID: 11191541.'
                    ],
                    dose: {
                        min: '2 mcg/kg/min',
                        max: '50 mcg/kg/min'
                    }
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: {
                        min: '5 mcg/kg/min',
                        max: '20 mcg/kg/min'
                    }
                }
             ],
            preparations: [
                {
                    concentration: '1.6 mg/mL'
                }, {
                    concentration: '40 mg/mL'
                }
            ]
         }
         }
 
     } );
        drug.addPreparations( drugPreparationData );
 
        var drugDosageCalculation = mw.calculators.getCalculation( mw.calculators.getDrugDosageCalculationId( drugId ) );
 
        drugDosageCalculation.recalculate();
     };






     /**
     /**
     * Class DrugPreparation
     * Ephedrine
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugPreparation}
    * @constructor
     */
     */
    mw.calculators.objectClasses.DrugPreparation = function( propertyValues ) {
    mw.calculators.addDrugs( {
         var properties = {
         ephedrine: {
             required: [
             name: 'Ephedrine',
                 'id',
            color: 'cardiovascularAgonist',
                 'concentration'
            dosages: [
                 {
                    indication: 'hypotension',
                    population: 'general',
                    dose: {
                        min: '2.5 mg',
                        max: '25 mg'
                    }
                 }, {
                    indication: 'hypotension',
                    population: 'general',
                    route: 'im',
                    dose: {
                        min: '25 mg',
                        max: '50 mg'
                    }
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: {
                        min: '0.02 mg/kg',
                        max: '0.2 mg/kg'
                    }
                }
             ],
             ],
             optional: [
             preparations: [
                 'default',
                 {
                'dilutionRequired',
                    concentration: '5 mg/mL'
                 'commonDilution'
                }, {
                    concentration: '50 mg/mL'
                 }
             ]
             ]
         };
         }
 
     } );
        mw.calculators.objectClasses.CalculatorObject.call( this, properties, propertyValues );
 
 
        this.concentration = this.concentration.replace( 'mcg', 'ug' );
 
        this.concentration = math.unit( this.concentration );
    };
 
    mw.calculators.objectClasses.DrugPreparation.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
 
    mw.calculators.objectClasses.DrugPreparation.prototype.getVolumeUnits = function() {
        // The units of concentration will always be of the form "mass / volume"
        // The regular expression matches all text leading up to the volume units
        return mw.calculators.getUnitsByBase( this.concentration ).volume;
     };
 
    mw.calculators.objectClasses.DrugPreparation.prototype.toString = function() {
        return mw.calculators.getValueString( this.concentration );
    };
 
 






     /**
     /**
     * Class DrugDosage
     * Epinephrine
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugDosage}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugDosage = function( propertyValues ) {
     mw.calculators.addDrugs( {
         mw.calculators.objectClasses.CalculatorObject.call( this, this.getProperties(), propertyValues );
         epinephrine: {
 
            name: 'Epinephrine',
        var drugIndication = mw.calculators.getDrugIndication( this.indication );
             color: 'epinephrine',
 
            description: 'First line vasopressor for anaphylactic shock',
        if( !drugIndication ) {
            dosages: [
             throw new Error( 'Invalid indication "' + this.indication + '" for drug dosage' );
                {
        }
                    indication: 'hypotension',
 
                    population: 'general',
        this.indication = drugIndication;
                    references: [
 
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
        this.population = this.population ? this.population : DEFAULT_DRUG_POPULATION;
                    ],
 
                    dose: [
        var drugPopulation = mw.calculators.getDrugPopulation( this.population );
                        {
 
                            name: 'Bolus',
        if( !drugPopulation ) {
                            min: '5 mcg',
            throw new Error( 'Invalid population "' + this.population + '" for drug dosage' );
                            max: '20 mcg',
        }
                            frequency: 'q1-5m'
 
                        }, {
        this.population = drugPopulation;
                            name: 'Infusion',
 
                            min: '0.01 mcg/kg/min',
        this.references = this.references ? this.references : [];
                            max: '2 mcg/kg/min'
 
                        }
        this.route = this.route ? this.route : DEFAULT_DRUG_ROUTE;
                    ]
 
                }, {
        var drugRoute = mw.calculators.getDrugRoute( this.route );
                    indication: 'hypotension',
 
                    population: 'pediatric',
        if( !drugRoute ) {
                    references: [
            throw new Error( 'Invalid route "' + this.route + '" for drug dosage' );
                        'Marino BS, Tabbutt S, MacLaren G, Hazinski MF, Adatia I, Atkins DL, Checchia PA, DeCaen A, Fink EL, Hoffman GM, Jefferies JL, Kleinman M, Krawczeski CD, Licht DJ, Macrae D, Ravishankar C, Samson RA, Thiagarajan RR, Toms R, Tweddell J, Laussen PC; American Heart Association Congenital Cardiac Defects Committee of the Council on Cardiovascular Disease in the Young; Council on Clinical Cardiology; Council on Cardiovascular and Stroke Nursing; Council on Cardiovascular Surgery and Anesthesia; and Emergency Cardiovascular Care Committee. Cardiopulmonary Resuscitation in Infants and Children With Cardiac Disease: A Scientific Statement From the American Heart Association. Circulation. 2018 May 29;137(22):e691-e782. doi: 10.1161/CIR.0000000000000524. Epub 2018 Apr 23. PMID: 29685887.',
        }
                        'Reiter PD, Roth J, Wathen B, LaVelle J, Ridall LA. Low-Dose Epinephrine Boluses for Acute Hypotension in the PICU. Pediatr Crit Care Med. 2018 Apr;19(4):281-286. doi: 10.1097/PCC.0000000000001448. PMID: 29319635.'
 
                    ],
        this.route = drugRoute;
                    dose: [
 
                        {
        // Add the dose objects to the drug
                            name: 'Bolus',
        var drugDoseData = this.dose;
                            min: '1 mcg/kg',
        this.dose = [];
                            max: '5 mcg/kg',
 
                            frequency: 'q1-5m'
        this.addDoses( drugDoseData );
                        }, {
    };
                            name: 'Infusion',
 
                            min: '0.02 mcg/kg/min',
    mw.calculators.objectClasses.DrugDosage.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
                            max: '1 mcg/kg/min'
 
                        }
    mw.calculators.objectClasses.DrugDosage.prototype.addDoses = function( drugDoseData ) {
                    ]
        // Each dosage can have one or more associated doses. Ensure this value is an array.
                }, {
        if( !Array.isArray( drugDoseData ) ) {
                    indication: 'acls',
            drugDoseData = [ drugDoseData ];
                    population: 'general',
        }
                    dose: {
 
                        dose: '1 mg',
        var doses = mw.calculators.createCalculatorObjects( 'DrugDose', drugDoseData );
                        frequency: 'q3-5m'
 
                    }
        for( var doseId in doses ) {
                }, {
            doses[ doseId ].id = this.dose.length;
                    indication: 'acls',
 
                    population: 'pediatric',
            this.dose.push( doses[ doseId ] );
                    dose: {
        }
                        dose: '10 mcg/kg',
    };
                        absoluteMax: '1 mg',
 
                        frequency: 'q3-5m'
    mw.calculators.objectClasses.DrugDosage.prototype.getCalculationData = function() {
                    }
        var inputData = new mw.calculators.objectClasses.CalculationData();
                }, {
 
                    indication: 'anaphylaxis',
        inputData = inputData.merge( this.population.getCalculationData() );
                    population: 'general',
 
                    dose: [
        for( var iDose in this.dose ) {
                        {
            inputData = inputData.merge( this.dose[ iDose ].getCalculationData() );
                            name: 'Bolus',
        }
                            dose: '10 mcg/kg',
 
                            absoluteMax: '0.5 mg',
        return inputData;
                            frequency: 'q3-5m'
    };
                        }, {
 
                            name: 'Infusion',
    mw.calculators.objectClasses.DrugDosage.prototype.getProperties = function() {
                            min: '0.1 mcg/kg/min',
        return {
                            max: '1 mcg/kg/min'
            required: [
                        }
                'dose',
                    ]
                'id',
                }, {
                'indication'
                    indication: 'anaphylaxis',
                    population: 'general',
                    route: 'im',
                    dose: {
                        dose: '10 mcg/kg',
                        frequency: 'q5-15m',
                        absoluteMax: '0.5 mg'
                    }
                }
             ],
             ],
             optional: [
             preparations: [
                 'description',
                 {
                'population',
                    concentration: '10 mcg/mL'
                'route',
                }, {
                 'references'
                    concentration: '16 mcg/mL'
                }, {
                    concentration: '100 mcg/mL',
                    default: true
                 }, {
                    concentration: '1 mg/mL'
                }
             ]
             ]
         };
         }
     };
     } );
 
    mw.calculators.objectClasses.DrugDosage.prototype.hasInfo = function() {
        return this.description;
    };
 
 






     /**
     /**
     * Class DrugDose
     * Etomidate
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugDose}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugDose = function( propertyValues ) {
     mw.calculators.addDrugs( {
         mw.calculators.objectClasses.CalculatorObject.call( this, this.getProperties(), propertyValues );
         etomidate: {
 
            name: 'Etomidate',
        if( this.weightCalculation ) {
            color: 'sedativeHypnotic',
            var weightCalculationIds = this.weightCalculation;
            dosages: [
 
                {
            // weightCalculation property will contain references to the actual objects, so reinitialize
                    indication: 'generalAnesthesia',
            this.weightCalculation = [];
                    population: 'general',
 
                    dose: {
            if( !Array.isArray( weightCalculationIds ) ) {
                        min: '0.2 mg/kg',
                 weightCalculationIds = [ weightCalculationIds ];
                        max: '0.6 mg/kg',
             }
                        weightCalculation: [ 'lbw', 'ibw' ]
 
                    }
             for( var iWeightCalculation in weightCalculationIds ) {
                 }
                var weightCalculationId = weightCalculationIds[ iWeightCalculation ];
             ],
                var weightCalculation = mw.calculators.getCalculation( weightCalculationId );
             preparations: [
 
                 {
                 if( !weightCalculation ) {
                     concentration: '2 mg/mL'
                     throw new Error( 'Drug dose references weight calculation "' + weightCalculationId + '" which is not defined' );
                 }
                 }
 
             ]
                this.weightCalculation.push( weightCalculation );
             }
        } else {
            this.weightCalculation = [];
         }
         }
    } );


        var mathProperties = this.getMathProperties();
        var isWeightDependent = false;


        for( var iMathProperty in mathProperties ) {
            var mathProperty = mathProperties[ iMathProperty ];


             if( this[ mathProperty ] ) {
    /**
                // TODO consider making a UnitsBase.weight.fromString()
    * Ketamine
                this[ mathProperty ] = this[ mathProperty ].replace( 'kg', 'kgwt' );
    */
                 this[ mathProperty ] = this[ mathProperty ].replace( 'mcg', 'ug' );
    mw.calculators.addDrugs( {
 
        ketamine: {
                this[ mathProperty ] = math.unit( this[ mathProperty ] );
            name: 'Ketamine',
 
            color: 'sedativeHypnotic',
                if( mw.calculators.isValueDependent( this[ mathProperty ], 'weight' ) ) {
             dosages: [
                     isWeightDependent = true;
                {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    dose: {
                        min: '1 mg/kg',
                        max: '2 mg/kg',
                        weightCalculation: [ 'lbw', 'ibw'  ]
                    }
                }, {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    route: 'im',
                    dose: {
                        min: '4 mg/kg',
                        max: '6 mg/kg'
                    }
                 }, {
                    indication: 'analgesia',
                    population: 'general',
                    description: 'To prevent prolonged recovery, do not administer in last hour of surgery.',
                    references: [
                        'Sabine Himmelseher, Marcel E. Durieux, Richard B. Weiskopf; Ketamine for Perioperative Pain Management. Anesthesiology 2005; 102:211–220 doi: https://doi.org/10.1097/00000542-200501000-00030'
                    ],
                    dose: [
                        {
                            name: 'Load (before incision)',
                            min: '0.25 mg/kg',
                            max: '0.5 mg/kg'
                        }, {
                            name: 'Maintenance',
                            min: '0.125 mg/kg',
                            max: '0.25 mg/kg',
                            frequency: 'q30m'
                        }
                     ]
                 }
                 }
            } else {
                this[ mathProperty ] = null;
            }
        }
        if( isWeightDependent ) {
            // Default is tbw
            this.weightCalculation.push( mw.calculators.getCalculation( 'tbw' ) );
        }
    };
    mw.calculators.objectClasses.DrugDose.prototype = Object.create( mw.calculators.objectClasses.CalculatorObject.prototype );
    mw.calculators.objectClasses.DrugDose.prototype.getAdministration = function() {
        var administration = '';
        if( this.frequency ) {
            administration += administration ? ' ' : '';
            administration += this.frequency;
        }
        if( this.duration ) {
            administration += administration ? ' ' : '';
            administration += 'over ' + this.duration;
        }
        return administration;
    };
    mw.calculators.objectClasses.DrugDose.prototype.getCalculationData = function() {
        var calculationData = new mw.calculators.objectClasses.CalculationData();
        for( var iWeightCalculation in this.weightCalculation ) {
            calculationData.calculations.optional.push( this.weightCalculation[ iWeightCalculation ].id );
        }
        return calculationData;
    };
    mw.calculators.objectClasses.DrugDose.prototype.getMathProperties = function() {
        return [
            'dose',
            'min',
            'max',
            'absoluteMin',
            'absoluteMax'
        ];
    };
    mw.calculators.objectClasses.DrugDose.prototype.getProperties = function() {
        return {
            required: [
                'id'
             ],
             ],
             optional: [
             preparations: [
                 'absoluteMax',
                 {
                'absoluteMin',
                    concentration: '10 mg/mL'
                 'dose',
                 }, {
                'duration',
                    concentration: '50 mg/mL'
                 'frequency',
                 }, {
                'min',
                    concentration: '100 mg/mL'
                'max',
                 }
                'name',
                 'weightCalculation'
             ]
             ]
         };
         }
     };
     } );
 




    mw.calculators.getDrugDosageCalculationId = function( drugId ) {
        return 'drugDosages-' + drugId;
    };


     /**
     /**
     * Class DrugDosageCalculation
     * Ketorolac
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugDosageCalculation}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugDosageCalculation = function( propertyValues ) {
     mw.calculators.addDrugs( [
        mw.calculators.objectClasses.CalculatorObject.call( this, this.getProperties(), propertyValues );
         {
 
             id: 'ketorolac',
        this.initialize();
             name: 'Ketorolac',
    };
             dosages: [
 
                {
    mw.calculators.objectClasses.DrugDosageCalculation.prototype = Object.create( mw.calculators.objectClasses.AbstractCalculation.prototype );
                    indication: 'analgesia',
 
                    population: 'general',
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.calculate = function( data ) {
                    description: 'A 10 mg dose of ketorolac is as effective for acute pain control as a 15 or 30 mg dose<sup>1</sup>',
         var value = {
                    references: [
             message: null,
                        'Motov S, Yasavolian M, Likourezos A, Pushkar I, Hossain R, Drapkin J, Cohen V, Filk N, Smith A, Huang F, Rockoff B, Homel P, Fromm C. Comparison of Intravenous Ketorolac at Three Single-Dose Regimens for Treating Acute Pain in the Emergency Department: A Randomized Controlled Trial. Ann Emerg Med. 2017 Aug;70(2):177-184. doi: 10.1016/j.annemergmed.2016.10.014. Epub 2016 Dec 16. PMID: 27993418.'
             population: null,
                     ],
             preparation: data.preparation,
                    dose: {
            dose: []
                        min: '10 mg',
        };
                         max: '30 mg'
 
        this.activeDosageId = null;
 
        if( !data.drug.dosages.length ) {
            value.message = 'No dose data';
 
            return value;
        }
 
        // Determine which dosage to use
        var populationScores = [];
 
        for( var iDosage in data.drug.dosages ) {
            var drugDosage = data.drug.dosages[ iDosage ];
 
            // If the indication and route do not match, set the score to -1
            var populationScore =
                drugDosage.indication.id === data.indication.id && drugDosage.route.id === data.route.id ?
                drugDosage.population.getCalculationDataScore( data ) : -1;
 
            populationScores.push( populationScore );
        }
 
        var maxPopulationScore = Math.max.apply( null, populationScores );
 
        if( maxPopulationScore < 0 ) {
            value.message = 'No dose data for indication "' + String( data.indication ) + '" and route "' + String( data.route ) + '"';
 
            return value;
        }
 
        // If there is more than one dosage with the same score, take the first.
        // This allows the data editor to decide which is most important.
        this.activeDosageId = populationScores.indexOf( maxPopulationScore );
 
        var dosage = data.drug.dosages[ this.activeDosageId ];
 
        // A dosage may contain multiple doses (e.g. induction and maintenance)
        for( var iDose in dosage.dose ) {
            var dose = dosage.dose[ iDose ];
            var mathProperties = dose.getMathProperties();
 
            var weightCalculation = null;
            var weightValue = null;
 
            // data.weightCalculation should be in order of preference, so take the first non-null value
            for( var iWeightCalculation in dose.weightCalculation ) {
                if( dose.weightCalculation[ iWeightCalculation ].value !== null ) {
                    weightCalculation = dose.weightCalculation[ iWeightCalculation ];
                    weightValue = dose.weightCalculation[ iWeightCalculation ].value;
 
                     break;
                }
            }
 
            // Initialize value properties for dose
            value.dose[ iDose ] = {
                massPerWeight: {},
                mass: {},
                volume: {},
                weightCalculation: weightCalculation ? weightCalculation : null
            };
 
            var massUnits;
            var volumeUnits;
 
            for( var iMathProperty in mathProperties ) {
                var mathProperty = mathProperties[ iMathProperty ];
 
                var doseValue = dose[ mathProperty ];
 
                if( doseValue ) {
                    var doseUnitsByBase = mw.calculators.getUnitsByBase( doseValue );
 
                    if( doseUnitsByBase.hasOwnProperty( 'weight' ) ) {
                         value.dose[ iDose ].massPerWeight[ mathProperty ] = doseValue;
 
                        if( weightValue ) {
                            massUnits = doseUnitsByBase.mass;
 
                            if( doseUnitsByBase.hasOwnProperty( 'time' ) ) {
                                massUnits += '/' + doseUnitsByBase.time;
                            }
 
                            // For whatever reason math.format will simplify the units, but math.formatUnits will not
                            // as a hack, we recreate a new unit value with the correct formatting of the result
                            value.dose[ iDose ].mass[ mathProperty ] = math.unit( math.multiply( doseValue, weightValue ).format() ).to( massUnits );
                        }
                    } else {
                        value.dose[ iDose ].mass[ mathProperty ] = doseValue;
                     }
                     }
 
                }, {
                     if( data.preparation && value.dose[ iDose ].mass[ mathProperty ] ) {
                     indication: 'analgesia',
                        // Need a special case for pct
                    population: 'pediatric',
                        if( data.preparation.concentration.formatUnits() === 'pct' ) {
                    dose: {
                            volumeUnits = 'mL';
                         min: '0.5 mg/kg',
                        } else {
                        max: '1 mg/kg',
                            var preparationUnitsByBase = mw.calculators.getUnitsByBase( data.preparation.concentration );
                         absoluteMax: '30 mg'
 
                            volumeUnits = preparationUnitsByBase.volume;
                         }
 
                        if( doseUnitsByBase.hasOwnProperty( 'time' ) ) {
                            volumeUnits += '/' + doseUnitsByBase.time;
                         }
 
                        // Same hack as above to get units to simplify correctly
                        value.dose[ iDose ].volume[ mathProperty ] = math.unit( math.multiply( value.dose[ iDose ].mass[ mathProperty ], math.divide( 1, data.preparation.concentration ) ).format() ).to( volumeUnits );
                     }
                     }
                 }
                 }
             }
             ],
            preparations: [
                {
                    concentration: '15 mg/mL'
                }, {
                    concentration: '30 mg/mL',
                    default: true
                }
            ]
        }
    ] );


            if( value.dose[ iDose ].mass.hasOwnProperty( 'absoluteMin' ) ) {
                if( value.dose[ iDose ].mass.hasOwnProperty( 'max' ) && math.larger( value.dose[ iDose ].mass.absoluteMin, value.dose[ iDose ].mass.max ) ) {
                    // Both min and max are larger than the absolute max dose, so just convert to single dose.
                    value.dose[ iDose ].mass.dose = value.dose[ iDose ].mass.absoluteMin;


                    delete value.dose[ iDose ].mass.min;
                    delete value.dose[ iDose ].mass.max;


                    if( value.dose[ iDose ].volume.hasOwnProperty( 'absoluteMin' ) ) {
    /**
                        value.dose[ iDose ].volume.dose = value.dose[ iDose ].volume.absoluteMin;
    * Lidocaine
 
    */
                        delete value.dose[ iDose ].volume.min;
    mw.calculators.addDrugs( {
                        delete value.dose[ iDose ].volume.max;
        lidocaine: {
                    }
            name: 'Lidocaine',
                } else if( value.dose[ iDose ].mass.hasOwnProperty( 'min' ) && math.larger( value.dose[ iDose ].mass.absoluteMin, value.dose[ iDose ].mass.min ) ) {
            color: 'localAnesthetic',
                    value.dose[ iDose ].mass.min = value.dose[ iDose ].mass.absoluteMin;
            dosages: [
 
                {
                     if( value.dose[ iDose ].volume.hasOwnProperty( 'absoluteMin' ) ) {
                     indication: 'intubation',
                        value.dose[ iDose ].volume.min = value.dose[ iDose ].volume.absoluteMin;
                     population: 'general',
                     }
                     dose: {
                } else if( value.dose[ iDose ].mass.hasOwnProperty( 'dose' ) && math.larger( value.dose[ iDose ].mass.absoluteMin, value.dose[ iDose ].mass.dose ) ) {
                        dose: '1 mg/kg'
                     value.dose[ iDose ].mass.dose = value.dose[ iDose ].mass.absoluteMin;
 
                    if( value.dose[ iDose ].volume.hasOwnProperty( 'absoluteMin' ) ) {
                        value.dose[ iDose ].volume.dose = value.dose[ iDose ].volume.absoluteMin;
                     }
                     }
                 }
                 }
             }
             ],
            preparations: [
                {
                    concentration: '1 pct'
                }, {
                    concentration: '2 pct'
                }
            ]
        }
    } );


            if( value.dose[ iDose ].mass.hasOwnProperty( 'absoluteMax' ) ) {
                if( value.dose[ iDose ].mass.hasOwnProperty( 'min' ) && math.smaller( value.dose[ iDose ].mass.absoluteMax, value.dose[ iDose ].mass.min ) ) {
                    // Both min and max are larger than the absolute max dose, so just convert to single dose.
                    value.dose[ iDose ].mass.dose = value.dose[ iDose ].mass.absoluteMax;


                    delete value.dose[ iDose ].mass.min;
                    delete value.dose[ iDose ].mass.max;


                    if( value.dose[ iDose ].volume.hasOwnProperty( 'absoluteMax' ) ) {
    /**
                         value.dose[ iDose ].volume.dose = value.dose[ iDose ].volume.absoluteMax;
    * Midazolam
 
    */
                         delete value.dose[ iDose ].volume.min;
    mw.calculators.addDrugs( {
                         delete value.dose[ iDose ].volume.max;
        midazolam: {
            name: 'Midazolam',
            color: 'benzodiazepine',
            dosages: [
                {
                    indication: 'anxiolysis',
                    population: 'general',
                    dose: {
                         min: '0.01 mg/kg',
                        max: '0.03 mg/kg'
                    }
                }, {
                    indication: 'anxiolysis',
                    population: 'general',
                    route: 'im',
                    dose: {
                         min: '0.07 mg/kg',
                         max: '0.08 mg/kg'
                     }
                     }
                 } else if( value.dose[ iDose ].mass.hasOwnProperty( 'max' ) && math.smaller( value.dose[ iDose ].mass.absoluteMax, value.dose[ iDose ].mass.max ) ) {
                 }, {
                     value.dose[ iDose ].mass.max = value.dose[ iDose ].mass.absoluteMax;
                    indication: 'anxiolysis',
 
                     population: 'general',
                     if( value.dose[ iDose ].volume.hasOwnProperty( 'absoluteMax' ) ) {
                    route: 'po',
                         value.dose[ iDose ].volume.max = value.dose[ iDose ].volume.absoluteMax;
                     dose: {
                         dose: '0.5 mg/kg',
                        absoluteMax: '20 mg'
                     }
                     }
                 } else if( value.dose[ iDose ].mass.hasOwnProperty( 'dose' ) && math.smaller( value.dose[ iDose ].mass.absoluteMax, value.dose[ iDose ].mass.dose ) ) {
                 }, {
                     value.dose[ iDose ].mass.dose = value.dose[ iDose ].mass.absoluteMax;
                    indication: 'generalAnesthesia',
 
                     population: 'general',
                     if( value.dose[ iDose ].volume.hasOwnProperty( 'absoluteMax' ) ) {
                     dose: {
                         value.dose[ iDose ].volume.dose = value.dose[ iDose ].volume.absoluteMax;
                        min: '0.1 mg/kg',
                        max: '0.3 mg/kg',
                         weightCalculation: [ 'lbw', 'ibw' ]
                     }
                     }
                 }
                 }
             }
             ],
            preparations: [
                {
                    concentration: '1 mg/mL'
                }, {
                    concentration: '5 mg/mL'
                }
            ]
         }
         }
    } );


        return value;
    };


    mw.calculators.objectClasses.DrugDosageCalculation.prototype.doRender = function() {
        var $calculationContainer = $( '.' + this.getContainerId() );


         if( !$calculationContainer.length ) {
    /**
             return;
    * Milrinone
    */
    mw.calculators.addDrugs( {
         milrinone: {
            name: 'Milrinone',
            color: 'cardiovascularAgonist',
            description: '<ul><li>Used in cardiogenic shock</li><li>Dose adjustment needed in renal impairment</li></ul>',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                    ],
                    dose: [
                        {
                            name: 'Load (optional)',
                            dose: '50 mcg/kg',
                            duration: '10 min'
                        }, {
                            name: 'Infusion',
                            min: '0.125 mcg/kg/min',
                            max: '0.75 mcg/kg/min'
                        }
                    ]
                }
            ],
             preparations: [
                {
                    concentration: '0.2 mg/mL'
                }, {
                    concentration: '1 mg/mL'
                }
            ]
         }
         }
    } );


        // Add all required classes
        $calculationContainer.addClass( 'border ' + this.getContainerClasses() );


        // Add search phrases
        $calculationContainer.attr( 'data-search', this.getSearchString() );


        // Store this object in a local variable since .each() will reassign this to the DOM object of each
    /**
        // calculation container.
    * Neostigmine
        var calculation = this;
    */
        var calculationCount = 0;
    mw.calculators.addDrugs( {
 
         neostigmine: {
        // Eventually may implement different rendering, so we should regenerate
             name: 'Neostigmine',
        // all elements with each iteration of the loop.
             color: 'neuromuscularBlockerReversal',
        // I.e. might show result in table and inline in 2 different places of article.
             dosages: [
         $calculationContainer.each( function() {
                 {
             // Initalize the variables for all the elements of the calculation. These need to be in order of placement
                    indication: 'neuromuscularBlockadeReversal',
             // in the calculation container
                    population: 'general',
             var elementTypes = [
                    description: 'For each 1 mg of neostigmine, give 0.2 mg of glycopyrrolate to avoid bradycardia',
                 'title',
                    dose: {
                'dosage',
                        min: '0.03 mg/kg',
                'info'
                        max: '0.07 mg/kg',
            ];
                        absoluteMax: '5 mg'
 
                    }
            var elements = {};
                 }
 
            ],
            for( var iElementType in elementTypes ) {
            preparations: [
                var elementType = elementTypes[ iElementType ];
                {
 
                     concentration: '0.5 mg/mL'
                // If an input contained by $container has user input focus, $container will not rerender (would be
                 }, {
                // annoying behavior to the user). However, if it contains subelements which should try to rerender,
                     concentration: '1 mg/mL'
                 // add those elements to the contains property.
                elements[ elementType ] = {
                    $container: null,
                    contains: [],
                     id: calculation.getContainerId() + '-' + elementType
                 };
 
                if( calculationCount ) {
                     elements[ elementType ].id += '-' + calculationCount;
                 }
                 }
             }
             ]
        }
    } );


            // Create title element and append to container
            elements.title.$container = $( '<div>', {
                id: elements.title.id,
                class: 'col-12 border-bottom ' + calculation.getElementClasses( 'title' )
            } );


            elements.title.$container.append( calculation.getTitleHtml() );


            if( calculation.hasInfo() ) {
    /**
                // Id of the info container should already be set by getInfo()
    * Norepinephrine
                elements.info.$container = calculation.getInfo();
    */
             }
    mw.calculators.addDrugs( {
 
        norepinephrine: {
             // Create the dosage element
             name: 'Norepinephrine',
             elements.dosage.$container = $( '<div>', {
             color: 'cardiovascularAgonist',
                id: elements.dosage.id,
             description: 'First line vasopressor for septic and hypovolemic shock',
                class: 'row no-gutters ' + calculation.getElementClasses( 'dosage' )
            dosages: [
            } );
                {
 
                    indication: 'hypotension',
            // Dose column
                    population: 'general',
            var $dose = $( '<div>', {
                    references: [
                id: calculation.getContainerId() + '-dose',
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                class: 'col-7 ' + calculation.getElementClasses( 'dose' )
                    ],
            } );
                    dose: [
 
                        {
            var dash = '-';
                            name: 'Bolus',
 
                            min: '5 mcg',
            // The options column should only show the preparation if there is a calculated volume
                            max: '20 mcg'
            var hasVolume;
                        }, {
 
                            name: 'Infusion',
            if( !calculation.value || calculation.activeDosageId === null ) {
                            min: '0.05 mcg/kg/min',
                if( calculation.value && calculation.value.hasOwnProperty( 'message' ) ) {
                            max: '3.3 mcg/kg/min'
                    $dose.append( $( '<i>' ).append( calculation.value.message ) );
                        }
                    ]
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: [
                        {
                            name: 'Bolus',
                            min: '0.05 mcg/kg',
                            max: '0.1 mcg/kg'
                        }, {
                            name: 'Infusion',
                            min: '0.05 mcg/kg/min',
                            max: '2 mcg/kg/min'
                        }
                    ]
                 }
                 }
             } else {
             ],
                var dosage = calculation.drug.dosages[ calculation.activeDosageId ];
            preparations: [
 
                 {
                 if( dosage.population && dosage.population.id !== DEFAULT_DRUG_POPULATION ) {
                     concentration: '10 mcg/mL'
                     var $dosePopulation = $( '<div>', {
                }, {
                        class: calculation.getElementClasses( 'dose-info' )
                    concentration: '16 mcg/mL'
                    } );
                }, {
 
                    concentration: '1 mg/mL',
                    $dosePopulation
                     dilutionRequired: true
                        .append( $( '<div>', {
                            class: calculation.getElementClasses( 'dose-info-population' )
                        } ).append( String( dosage.population ) + ' dosing' ) );
 
                     $dose.append( $dosePopulation );
                 }
                 }
            ]
        }
    } );


                var $doseData = $( '<div>', {
                    class: calculation.getElementClasses( 'dose-data' )
                } );


                // This will iterate through the calculated doses. iDose should exactly correspond to doses within dosage
                // to allow referencing other properties of the dose.
                for( var iDose in calculation.value.dose ) {
                    var dose = dosage.dose[ iDose ];
                    var doseValue = calculation.value.dose[ iDose ];


                     if( dose.name ) {
    /**
                         $doseData.append( dose.name + '<br />' );
    * Ondansetron
    */
    mw.calculators.addDrugs( {
        ondansetron: {
            name: 'Ondansetron',
            dosages: [
                {
                    indication: 'ponv',
                    population: 'general',
                     dose: {
                         dose: '4 mg'
                     }
                     }
 
                }, {
                     var $doseList = $( '<ul>' );
                     indication: 'ponv',
 
                     population: 'pediatric',
                     var administration = dose.getAdministration();
                     dose: {
                    var administrationDisplayed = false;
                         dose: '0.1 mg/kg',
 
                         absoluteMax: '4 mg'
                    var massPerWeightHtml = '';
 
                     if( doseValue.massPerWeight.hasOwnProperty( 'dose' ) ) {
                         massPerWeightHtml += mw.calculators.getValueString( doseValue.massPerWeight.dose );
                    } else if( doseValue.massPerWeight.hasOwnProperty( 'min' ) &&
                        doseValue.massPerWeight.hasOwnProperty( 'max' ) ) {
 
                        // getValueString will simplify the value and may adjust the units
                        var massPerWeightMinValue = math.unit( mw.calculators.getValueString( doseValue.massPerWeight.min ) );
                        var massPerWeightMaxValue = math.unit( mw.calculators.getValueString( doseValue.massPerWeight.max ) );
 
                        if( massPerWeightMinValue.formatUnits() !== massPerWeightMaxValue.formatUnits() ) {
                            // If the units between min and max don't match, show both
                            massPerWeightHtml += mw.calculators.getValueString( massPerWeightMinValue );
                         } else {
                            massPerWeightHtml += mw.calculators.getValueNumber( massPerWeightMinValue );
                        }
 
                        massPerWeightHtml += dash;
                        massPerWeightHtml += mw.calculators.getValueString( massPerWeightMaxValue );
                     }
                     }
                }
            ],
            preparations: [
                {
                    concentration: '2 mg/mL'
                }
            ]
        }
    } );


                    if( massPerWeightHtml ) {
                        if( administration && ! administrationDisplayed ) {
                            massPerWeightHtml += ' ' + administration;
                            administrationDisplayed = true;
                        }


                        var massPerWeightNotesHtml = '';


                        if( doseValue.mass.hasOwnProperty( 'absoluteMin' ) ) {
    /**
                             massPerWeightNotesHtml += 'Min: ' + mw.calculators.getValueString( doseValue.mass.absoluteMin );
    * Phenylephrine
                         } else if( doseValue.mass.hasOwnProperty( 'absoluteMax' ) ) {
    */
                             massPerWeightNotesHtml += 'Max: ' + mw.calculators.getValueString( doseValue.mass.absoluteMax );
    mw.calculators.addDrugs( {
        phenylephrine: {
            name: 'Phenylephrine',
            color: 'cardiovascularAgonist',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    dose: [
                        {
                             name: 'Bolus',
                            min: '50 mcg',
                            max: '200 mcg'
                         }, {
                            name: 'Infusion',
                             min: '0.25 mcg/kg/min',
                            max: '1 mcg/kg/min'
                         }
                         }
 
                    ]
                        if( dose.weightCalculation && dose.weightCalculation[ 0 ].id !== 'tbw' ) {
                }, {
                             if( massPerWeightNotesHtml ) {
                    indication: 'hypotension',
                                massPerWeightNotesHtml += ', ';
                    population: 'pediatric',
                             }
                    dose: [
 
                        {
                             massPerWeightNotesHtml += dose.weightCalculation[ 0 ].getTitleString();
                            name: 'Bolus',
                            min: '0.5 mcg/kg',
                            max: '1 mcg/kg'
                        }, {
                             name: 'Infusion',
                             min: '0.1 mcg/kg/min',
                             max: '0.5 mcg/kg/min'
                         }
                         }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mcg/mL'
                }, {
                    concentration: '100 mcg/mL',
                    default: true
                }, {
                    concentration: '160 mcg/mL'
                }, {
                    concentration: '10 mg/mL',
                    dilutionRequired: true
                }
            ]
        }
    } );


                        if( massPerWeightNotesHtml ) {
                            massPerWeightHtml += ' (' + massPerWeightNotesHtml + ')';
                        }


                        massPerWeightHtml = $( '<li>' ).append( massPerWeightHtml );


                        $doseList.append( massPerWeightHtml );
    /**
                    }
    * Propofol
 
    */
                    var massHtml = '';
    mw.calculators.addDrugs( {
 
        propofol: {
                     if( doseValue.mass.hasOwnProperty( 'dose' ) ) {
            name: 'Propofol',
                        massHtml += mw.calculators.getValueString( doseValue.mass.dose );
            color: 'sedativeHypnotic',
                     } else if( doseValue.mass.hasOwnProperty( 'min' ) &&
            dosages: [
                         doseValue.mass.hasOwnProperty( 'max' ) ) {
                {
 
                     indication: 'generalAnesthesia',
                        // getValueString will simplify the value and may adjust the units
                     population: 'general',
                        var massMinValue = math.unit( mw.calculators.getValueString( doseValue.mass.min ) );
                    dose: [
                        var massMaxValue = math.unit( mw.calculators.getValueString( doseValue.mass.max ) );
                         {
 
                            name: 'Induction',
                         if( massMinValue.formatUnits() !== massMaxValue.formatUnits() ) {
                            min: '1 mg/kg',
                             // If the units between min and max don't match, show both
                            max: '2.5 mg/kg',
                             massHtml += mw.calculators.getValueString( massMinValue );
                            weightCalculation: [ 'lbw', 'ibw' ]
                        } else {
                         }, {
                            massHtml += mw.calculators.getValueNumber( massMinValue );
                             name: 'Maintenance',
                            min: '100 mcg/kg/min',
                             max: '200 mcg/kg/min'
                         }
                         }
 
                    ]
                        massHtml += dash;
                }, {
                        massHtml += mw.calculators.getValueString( massMaxValue );
                    indication: 'generalAnesthesia',
                     }
                     population: 'pediatric',
 
                    dose: [
                    if( massHtml ) {
                        {
                         if( administration && ! administrationDisplayed ) {
                            name: 'Induction',
                             massHtml += ' ' + administration;
                            min: '2.5 mg/kg',
                             administrationDisplayed = true;
                            max: '3.5 mg/kg',
                            weightCalculation: [ 'lbw', 'ibw' ]
                         }, {
                             name: 'Maintenance',
                            min: '125 mcg/kg/min',
                             max: '300 mcg/kg/min'
                         }
                         }
 
                    ]
                        if( dose.weightCalculation.length && doseValue.weightCalculation.id !== dose.weightCalculation[ 0 ].id ) {
                }, {
                            var weightCalculationLabel = doseValue.weightCalculation.getTitleString();
                    indication: 'generalAnesthesia',
 
                    population: 'geriatric',
                            var $weightCalculationInfoIcon = $( '<i>', {
                    dose: [
                                class: 'far fa-question-circle',
                        {
                                'data-toggle': 'popover',
                            name: 'Induction',
                                'data-trigger': 'focus',
                            min: '1 mg/kg',
                                'data-content': String( doseValue.weightCalculation ) +
                            max: '1.5 mg/kg',
                                    ' is being used because data is missing for ' +
                            weightCalculation: [ 'lbw', 'ibw' ]
                                    String( dose.weightCalculation[ 0 ] ) + ': ' + dose.weightCalculation[ 0 ].message
                        }, {
                            } );
                             name: 'Maintenance',
 
                            min: '50 mcg/kg/min',
                             massHtml += '&nbsp; (' + weightCalculationLabel + '&nbsp;' + $weightCalculationInfoIcon[ 0 ].outerHTML + ')';
                            max: '100 mcg/kg/min'
                         }
                         }
 
                    ]
                         massHtml = $( '<li>' ).append( massHtml );
                }, {
 
                    indication: 'mac',
                         $doseList.append( massHtml );
                    population: 'general',
                    dose: {
                         min: '25 mcg/kg/min',
                         max: '75 mcg/kg/min'
                     }
                     }
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/mL'
                }
            ]
        }
    } );


                    var volumeHtml = '';


                    if( doseValue.volume.hasOwnProperty( 'dose' ) ) {
                        volumeHtml += mw.calculators.getValueString( doseValue.volume.dose );
                    } else if( doseValue.volume.hasOwnProperty( 'min' ) &&
                        doseValue.volume.hasOwnProperty( 'max' ) ) {


                        // getValueString will simplify the value and may adjust the units
    /**
                        var volumeMinValue = math.unit( mw.calculators.getValueString( doseValue.volume.min ) );
    * Remifentanil
                        var volumeMaxValue = math.unit( mw.calculators.getValueString( doseValue.volume.max ) );
    */
 
    mw.calculators.addDrugs( {
                        if( volumeMinValue.formatUnits() !== volumeMaxValue.formatUnits() ) {
        remifentanil: {
                            // If the units between min and max don't match, show both
            name: 'Remifentanil',
                            volumeHtml += mw.calculators.getValueString( volumeMinValue );
            color: 'opioid',
                         } else {
            dosages: [
                             volumeHtml += mw.calculators.getValueNumber( volumeMinValue );
                {
                        }
                    indication: 'tiva',
 
                    population: 'general',
                        volumeHtml += dash;
                    dose: [
                         volumeHtml += mw.calculators.getValueString( doseValue.volume.max );
                         {
                    }
                             name: 'Load',
 
                            min: '1 mcg/kg',
                    if( volumeHtml ) {
                            max: '2 mcg/kg',
                        if( administration && ! administrationDisplayed ) {
                            weightCalculation: [ 'lbw', 'ibw' ]
                             volumeHtml += ' ' + administration;
                         }, {
                             administrationDisplayed = true;
                            name: 'Maintenance',
                             min: '0.1 mcg/kg/min',
                             max: '1 mcg/kg/min'
                         }
                         }
 
                     ]
                        volumeHtml = $( '<li>' ).append( volumeHtml );
 
                        $doseList.append( volumeHtml );
 
                        hasVolume = true;
                     }
 
                    $doseData.append( $doseList );
                 }
                 }
 
            ],
                 $dose.append( $doseData );
            preparations: [
 
                {
                 if( calculation.hasInfo() ) {
                    concentration: '50 mcg/mL'
                     $dose.append( calculation.getInfoButton( calculationCount ) );
                 }, {
                    concentration: '1 mg/vial',
                    dilutionRequired: true
                 }, {
                     concentration: '2 mg/vial',
                    dilutionRequired: true
                 }
                 }
             }
             ]
        }
    } );




            // Options column
            var $options = $( '<div>', {
                id: calculation.getContainerId() + '-options',
                class: 'col-5 ' + calculation.getElementClasses( 'options' )
            } );


            var optionsRowClass = 'row no-gutters align-items-center';
    /**
 
    * Rocuronium
            if( !mw.calculators.isMobile() ) {
    */
                optionsRowClass += ' mb-2';
    mw.calculators.addDrugs( {
             }
        rocuronium: {
 
             name: 'Rocuronium',
            var optionLabelClass = mw.calculators.isMobile() ? 'col-4' : 'col-3';
             color: 'neuromuscularBlocker',
             var optionValueClass = mw.calculators.isMobile() ? 'col-8' : 'col-9';
             dosages: [
 
                 {
             var indications = calculation.drug.getIndications();
                     indication: 'neuromuscularBlockade',
 
                    population: 'general',
            if( indications.length ) {
                     dose: [
                 var indicationVariable = mw.calculators.getVariable( calculation.getVariableIds().indication );
                         {
 
                             name: 'Standard',
                $options
                            dose: '0.6 mg/kg'
                    .append( $( '<div>', {
                        }, {
                        class: optionsRowClass
                             name: 'Rapid sequence',
                     } )
                            dose: '1.2 mg/kg'
                        .append(
                         }
                            $( '<div>', {
                    ]
                                class: optionLabelClass,
                }
                                html: indicationVariable.getLabelString() + '&nbsp;'
            ],
                            } ),
            preparations: [
                            $( '<div>', {
                {
                                class: optionValueClass
                    concentration: '10 mg/mL'
                            } )
                                .append( indicationVariable.createInput({
                                    class: 'calculator-container-input-DrugDosageCalculator-options',
                                    hideLabel: true,
                                    inline: true
                                } ) ) ) );
            }
 
            var routes = calculation.drug.getRoutes();
 
            if( routes.length ) {
                var routeVariable = mw.calculators.getVariable( calculation.getVariableIds().route );
 
                $options
                     .append( $( '<div>', {
                        class: optionsRowClass
                    } )
                         .append(
                             $( '<div>', {
                                class: optionLabelClass,
                                html: routeVariable.getLabelString() + '&nbsp;'
                            } ),
                            $( '<div>', {
                                class: optionValueClass
                             } )
                                .append( routeVariable.createInput({
                                    class: 'calculator-container-input-DrugDosageCalculator-options',
                                    hideLabel: true,
                                    inline: true
                                } ) ) ) );
            }
 
            // Don't show preparations if there isn't a dose with volume
            if( hasVolume ) {
                var preparations = calculation.drug.getPreparations();
 
                if( preparations.length ) {
                    var preparationVariable = mw.calculators.getVariable( calculation.getVariableIds().preparation );
 
                    $options
                        .append( $( '<div>', {
                            class: optionsRowClass
                         } )
                            .append(
                                $( '<div>', {
                                    class: optionLabelClass,
                                    html: preparationVariable.getLabelString() + '&nbsp;'
                                } ),
                                $( '<div>', {
                                    class: optionValueClass
                                } )
                                    .append( preparationVariable.createInput({
                                        class: 'calculator-container-input-DrugDosageCalculator-options',
                                        hideLabel: true,
                                        inline: true
                                    } ) ) ) );
                 }
                 }
             }
             ]
        }
    } );


            elements.dosage.$container.append( $dose, $options );


            // Add elements to the contains array
            elements.dosage.contains.push( $dose, $options );


            // Iterate over elementTypes since it is in order of rendering
    /**
            for( var iElementType in elementTypes ) {
    * Succinylcholine
                var elementType = elementTypes[ iElementType ];
    */
                var element = elements[ elementType ];
    mw.calculators.addDrugs( {
 
        succinylcholine: {
                var $existingContainer = $( '#' + element.id );
            name: 'Succinylcholine',
 
            color: 'succinylcholine',
                 if( $existingContainer.length ) {
            dosages: [
                     // If an input within this container has focus (i.e. the user changed a variable input which
                 {
                     // triggered this rerender), don't rerender the element as this would destroy the focus on
                     indication: 'neuromuscularBlockade',
                     // the input.
                     population: 'general',
                    if( !$.contains( $existingContainer[ 0 ], $( ':focus' )[ 0 ] ) ) {
                     dose: {
                         $existingContainer.replaceWith( element.$container );
                        min: '1 mg/kg',
                     } else {
                         max: '1.5 mg/kg'
                        for( var containedElementId in element.contains ) {
                     }
                            var $containedElement = element.contains[ containedElementId ];
                }, {
 
                    indication: 'neuromuscularBlockade',
                            var $existingContainedContainer = $( '#' + $containedElement.attr( 'id' ) );
                    population: 'general',
 
                    route: 'im',
                            if( $existingContainedContainer.length ) {
                    dose: {
                                if( !$.contains( $existingContainedContainer[ 0 ], $( ':focus' )[ 0 ] ) ) {
                        min: '3 mg/kg',
                                    $existingContainedContainer.replaceWith( $containedElement );
                         max: '5 mg/kg'
                                }
                            }
                         }
                     }
                     }
                } else {
                    $( this ).append( elements[ elementType ].$container );
                 }
                 }
             }
             ],
 
             preparations: [
             calculationCount++;
                {
        } );
                    concentration: '20 mg/mL'
 
                }, {
        // Activate popovers
                    concentration: '100 mg/mL'
        $( '[data-toggle="popover"]' ).popover();
                }
    };
             ]
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getCalculationData = function() {
        var inputData = new mw.calculators.objectClasses.CalculationData();
 
        // Add variables created by this calculation
        var variableIds = this.getVariableIds();
 
        for( var variableType in variableIds ) {
             inputData.variables.optional.push( variableIds[ variableType ] );
         }
         }
    } );


        var dataTypes = inputData.getDataTypes();


        // Data is only actually required if it is required by every dosage for the drug.
        // Data marked as required by an individual dosage that does not appear in every
        // dosage will be converted to optional.
        var requiredInputData = new mw.calculators.objectClasses.CalculationData();


        // Need a way to tell the first iteration of the loop to initialize the required variables to a value that
    /**
        // is distinct from the empty array (populated across loop using array intersect, so could become [] and shouldn't
    * Sufentanil
        // reinitialize).
    */
         var initializeRequiredData = true;
    mw.calculators.addDrugs( {
 
         sufentanil: {
        // Iterate through each dosage to determine variable dependency
            name: 'Sufentanil',
        for( var iDosage in this.drug.dosages ) {
            color: 'opioid',
             var dosageInputData = this.drug.dosages[ iDosage ].getCalculationData();
             dosages: [
 
                {
            inputData = inputData.merge( dosageInputData );
                    indication: 'tiva',
 
                    population: 'general',
            for( var iDataType in dataTypes ) {
                    dose: [
                var dataType = dataTypes[ iDataType ];
                        {
 
                            name: 'Load',
                if( initializeRequiredData ) {
                            min: '0.25 mcg/kg',
                    requiredInputData[ dataType ].required = inputData[ dataType ].required;
                            max: '2 mcg/kg',
                } else {
                            weightCalculation: [ 'lbw', 'ibw' ]
                    // Data is only truly required if it is required by all dosage calculations, so use array intersection
                        }, {
                     requiredInputData[ dataType ].required = requiredInputData[ dataType ].required.filter( function( index ) {
                            name: 'Maintenance',
                        return dosageInputData[ dataType ].required.indexOf( index ) !== -1;
                            min: '0.5 mcg/kg/hr',
                     } );
                            max: '1.5 mcg/kg/hr'
                        }
                     ]
                }
            ],
            preparations: [
                {
                     concentration: '5 mcg/mL'
                }, {
                    concentration: '50 mcg/mL'
                 }
                 }
             }
             ]
 
            initializeRequiredData = false;
         }
         }
    } );


        for( var iDataType in dataTypes ) {
            var dataType = dataTypes[ iDataType ];


            // Move any data marked required in inputData to optional if it not actually required (i.e. doesn't appear
            // in requiredInputData).
            inputData[ dataType ].optional = inputData[ dataType ].optional.concat( inputData[ dataType ].required.filter( function( index ) {
                return requiredInputData[ dataType ].required.indexOf( index ) === -1;
            } ) ).filter( mw.calculators.uniqueValues );


             inputData[ dataType ].required = requiredInputData[ dataType ].required;
    /**
    * Sugammadex
    */
    mw.calculators.addDrugs( {
        sugammadex: {
            name: 'Sugammadex',
            color: 'neuromuscularBlockerReversal',
             dosages: [
                {
                    indication: 'neuromuscularBlockadeReversal',
                    population: 'general',
                    description: '<ul><li>&ge;2 twitches on TOF: 2 mg/kg</li><li>1-2 posttetanic twitches: 4 mg/kg</li><li>Immediate reversal: 16 mg/kg</li></ul>',
                    dose: {
                        min: '2 mg/kg',
                        max: '16 mg/kg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '100 mg/mL'
                }
            ]
         }
         }
    } );


        return inputData;
    };


    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getCalculationDataValues = function() {
        var data = mw.calculators.objectClasses.AbstractCalculation.prototype.getCalculationDataValues.call( this );


        data.drug = this.drug;
    /**
 
    * Vasopressin
        data.indication = data[ this.getVariablePrefix() + 'indication' ] !== null ?
    */
            mw.calculators.getDrugIndication( mw.calculators.getVariable( this.getVariableIds().indication ).getValue() ) :
    mw.calculators.addDrugs( {
             null;
        vasopressin: {
 
             name: 'Vasopressin',
        delete data[ this.getVariablePrefix() + 'indication' ];
            color: 'cardiovascularAgonist',
 
             dosages: [
        data.preparation = data[ this.getVariablePrefix() + 'preparation' ] !== null ?
                {
             this.drug.preparations[ mw.calculators.getVariable( this.getVariableIds().preparation ).getValue() ] :
                    indication: 'hypotension',
            null;
                    population: 'general',
 
                    description: 'Use caution with sustained infusions >0.04 units/min which can cause cardiac and splanchnic ischemia',
        delete data[ this.getVariablePrefix() + 'preparation' ];
                    references: [
 
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
        data.route = data[ this.getVariablePrefix() + 'route' ] !== null ?
                    ],
            mw.calculators.getDrugRoute( mw.calculators.getVariable( this.getVariableIds().route ).getValue() ) :
                    dose: [
            null;
                        {
 
                            name: 'Bolus',
        delete data[ this.getVariablePrefix() + 'route' ];
                            min: '0.5 units',
 
                            max: '1 unit'
        return data;
                        }, {
    };
                            name: 'Infusion',
 
                            min: '0.01 units/min',
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getClassName = function() {
                            max: '0.07 units/min'
        return 'DrugDosageCalculation';
                        }
    };
                    ]
 
                }, {
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getDescription = function() {
                    indication: 'hypotension',
        var description = this.drug.description ? this.drug.description : '';
                    population: 'pediatric',
 
                    references: [
        if( this.activeDosageId !== null && this.drug.dosages[ this.activeDosageId ].description ) {
                        'Choong K, Kissoon N. Vasopressin in pediatric shock and cardiac arrest. Pediatr Crit Care Med. 2008 Jul;9(4):372-9. doi: 10.1097/PCC.0b013e318172d7c8. PMID: 18496412.'
            description += description ? '<br/><br/>' : '';
                    ],
            description += this.drug.dosages[ this.activeDosageId ].description;
                    dose: [
        }
                        {
 
                            name: 'Bolus',
        return description;
                            min: '0.005 units/kg',
    };
                            max: '0.01 units/kg'
 
                        }, {
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getInfoButton = function( infoCount ) {
                            name: 'Infusion',
        var infoContainerId = this.getContainerId() + '-info';
                            min: '0.0002 units/kg/min',
 
                            max: '0.008 units/kg/min'
        if( infoCount ) {
                        }
            infoContainerId += '-' + infoCount;
                    ]
        }
                 }
 
        var infoString = 'More information';
 
        infoString += !mw.calculators.isMobile() ? ' about this dose' : '';
 
        return $( '<div>', {
            class: this.getElementClasses( 'infoButton' )
        } )
            .append( $( '<a>', {
                'data-toggle': 'collapse',
                href: '#' + infoContainerId,
                role: 'button',
                'aria-expanded': 'false',
                'aria-controls': infoContainerId
            } )
                .append( $( '<i>', {
                    class: 'far fa-question-circle'
                } ), '&nbsp;' + infoString ) );
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getProperties = function() {
        var inheritedProperties = mw.calculators.objectClasses.AbstractCalculation.prototype.getProperties();
 
        return this.mergeProperties( inheritedProperties, {
            required: [
                 'drug'
             ],
             ],
             optional: []
             preparations: [
        } );
                 {
    };
                    concentration: '1 units/mL'
 
                 }, {
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getReferences = function() {
                    concentration: '20 units/mL'
        var references = this.drug.references;
 
        if( this.activeDosageId !== null && this.drug.dosages[ this.activeDosageId ].references.length ) {
            references = references
                .concat( this.drug.dosages[ this.activeDosageId ].references )
                 .filter( mw.calculators.uniqueValues );
        }
 
        return references;
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getSearchString = function() {
        return this.drug.name + ' ' + this.drug.color + ' ' + this.drug.getIndications().join( ' ' );
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getTitleHtml = function() {
        var $title = $( '<a>', {
            class: this.getElementClasses( 'title-name' ),
            href: mw.util.getUrl( this.drug.name ),
            text: this.getTitleString()
        } ).css( 'background-color', '#fff' );
 
        var highlightColor = this.drug.color.getHighlightColor();
 
        if( highlightColor ) {
            var highlightContainerAttributes = {
                class: this.getElementClasses( 'title-highlight' )
            };
 
            var highlightContainerCss = {};
 
            highlightContainerCss[ 'background' ] = highlightColor;
 
            $title = $( '<span>', highlightContainerAttributes ).append( $title ).css( highlightContainerCss );
        }
 
        var primaryColor = this.drug.color.getPrimaryColor();
 
        if( primaryColor ) {
            var backgroundContainerAttributes = {
                class: this.getElementClasses( 'title-background' )
            };
 
            var backgroundContainerCss = {};
 
            if( this.drug.color.isStriped() ) {
                backgroundContainerCss[ 'background' ] = 'repeating-linear-gradient(135deg,rgba(0,0,0,0),rgba(0,0,0,0)10px,rgba(255,255,255,1)10px,rgba(255,255,255,1)20px),' + primaryColor;
            } else {
                 backgroundContainerCss[ 'background'] = primaryColor;
            }
 
            $title = $( '<span>', backgroundContainerAttributes ).append( $title ).css( backgroundContainerCss );
        }
 
        return $title;
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getTitleString = function() {
        return this.drug ? this.drug.name : '';
    }
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getVariableIds = function() {
        return {
            indication: this.getVariablePrefix() + 'indication',
            preparation: this.getVariablePrefix() + 'preparation',
            route: this.getVariablePrefix() + 'route'
        };
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getVariableOptions = function( variableId ) {
        if( variableId === this.getVariablePrefix() + 'indication' ) {
            return this.drug.getIndications();
        } else if( variableId === this.getVariablePrefix() + 'preparation' ) {
            // Exclude preparations which require dilution
            return this.drug.getPreparations( true );
        } else if( variableId === this.getVariablePrefix() + 'route' ) {
            return this.drug.getRoutes();
        }
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.getVariablePrefix = function() {
        return this.drug.id + '-';
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.initialize = function() {
        if( typeof this.drug === 'string' ) {
            var drug = mw.calculators.getDrug( this.drug );
 
            if( !drug ) {
                throw new Error( 'DrugDosage references drug "' + this.drug + '" which is not defined' );
            }
 
            this.drug = drug;
        }
 
        this.activeDosageId = null;
 
        this.updateVariables();
 
        mw.calculators.objectClasses.AbstractCalculation.prototype.initialize.call( this );
    };
 
    mw.calculators.objectClasses.DrugDosageCalculation.prototype.updateVariables = function() {
        var variableIds = this.getVariableIds();
 
        for( var variableType in variableIds ) {
            var variableId = variableIds[ variableType ];
            var variableOptions = this.getVariableOptions( variableId );
            var variableOptionValues = {};
            var defaultOption = 0;
 
            for( var iVariableOption in variableOptions ) {
                var variableOption = variableOptions[ iVariableOption ];
 
                defaultOption = variableOption.default ? iVariableOption : defaultOption;
 
                variableOptionValues[ variableOption.id ] = String( variableOption );
            }
 
            var defaultValue = variableOptions.length ? variableOptions[ defaultOption ].id : null;
 
            var variable = mw.calculators.getVariable( variableId );
 
            if( !variable ) {
                var newVariable = {};
 
                // TODO put this somewhere else
                var abbreviation;
 
                if( variableType === 'indication' ) {
                    abbreviation = 'Use';
                } else if( variableType === 'route' ) {
                    abbreviation = 'Route';
                } else if( variableType === 'preparation' ) {
                    abbreviation = 'Prep';
                 }
                 }
 
             ]
                newVariable[ variableId ] = {
                    name: variableType.charAt(0).toUpperCase() + variableType.slice(1),
                    abbreviation: abbreviation,
                    type: 'string',
                    defaultValue: defaultValue,
                    options: variableOptionValues
                };
 
                mw.calculators.addVariables( newVariable );
             } else {
                // Probably not ideal to reach into the variable to change these things directly
                // Perhaps add helper functions to variable class
                mw.calculators.variables[ variableId ].defaultValue = defaultValue;
                mw.calculators.variables[ variableId ].options = variableOptionValues;
            }
         }
         }
     };
     } );
 
 
 
 
 
 
    mw.calculators.addDrugCalculators = function( moduleId, drugCalculatorData, className ) {
        className = className ? className : 'DrugDosageCalculator';
 
        for( var drugCalculatorId in drugCalculatorData ) {
            drugCalculatorData[ drugCalculatorId ].module = moduleId;
 
            for( var iCalculation in drugCalculatorData[ drugCalculatorId].calculations ) {
                drugCalculatorData[ drugCalculatorId].calculations[ iCalculation ] = moduleId + '-' +
                    drugCalculatorData[ drugCalculatorId].calculations[ iCalculation ];
            }
        }
 
        mw.calculators.addCalculators( moduleId, drugCalculatorData, className );
    };






     /**
     /**
     * Class DrugDosageCalculator
     * Vecuronium
    * @param {Object} propertyValues
    * @returns {mw.calculators.objectClasses.DrugDosageCalculator}
    * @constructor
     */
     */
     mw.calculators.objectClasses.DrugDosageCalculator = function( propertyValues ) {
     mw.calculators.addDrugs( {
         mw.calculators.objectClasses.CalculatorObject.call( this, this.getProperties(), propertyValues );
         vecuronium: {
    };
            name: 'Vecuronium',
 
            color: 'neuromuscularBlocker',
    mw.calculators.objectClasses.DrugDosageCalculator.prototype = Object.create( mw.calculators.objectClasses.AbstractCalculator.prototype );
            dosages: [
 
                {
    mw.calculators.objectClasses.DrugDosageCalculator.prototype.getClassName = function() {
                    indication: 'neuromuscularBlockade',
        return 'DrugDosageCalculator';
                    population: 'general',
     };
                    dose: [
 
                        {
                            name: 'Standard',
                            dose: '0.1 mg/kg'
                        }, {
                            name: 'Rapid sequence',
                            dose: '1.2 mg/kg'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/vial'
                }
            ]
        }
     } );
}() );
}() );

Revision as of 20:12, 30 August 2021

/**
 * @author Chris Rishel
 */
( function() {
    /**
     * DrugColor data
     */
    mw.calculators.addDrugColors( {
        anticholinergic: {
            primaryColor: '#9fc96b'
        },
        benzodiazepine: {
            primaryColor: '#f57921'
        },
        benzodiazepineReversal: {
            parentColor: 'benzodiazepine',
            striped: true
        },
        cardiovascularAgonist: {
            primaryColor: '#e1c9df'
        },
        cardiovascularAntagonist: {
            parentColor: 'cardiovascularAgonist',
            striped: true
        },
        default: {
            primaryColor: '#fff',
            highlightColor: '#fff'
        },
        desflurane: {
            primaryColor: '#0072ae'
        },
        enflurane: {
            primaryColor: '#f9a23b'
        },
        epinephrine: {
            parentColor: 'cardiovascularAgonist',
            highlightColor: '#000'
        },
        halothane: {
            primaryColor: '#b20107'
        },
        isoflurane: {
            primaryColor: '#92278f'
        },
        localAnesthetic: {
            primaryColor: '#b6b2a9'
        },
        neuromuscularBlocker: {
            primaryColor: '#f15563'
        },
        neuromuscularBlockerReversal: {
            parentColor: 'neuromuscularBlocker',
            striped: true
        },
        nitrousOxide: {
            primaryColor: '#004f7c'
        },
        opioid: {
            primaryColor: '#6bc8ea'
        },
        opioidReversal: {
            parentColor: 'opioid',
            striped: true
        },
        sedativeHypnotic: {
            primaryColor: '#f7e20a'
        },
        sevoflurane: {
            primaryColor: '#ffe715'
        },
        succinylcholine: {
            parentColor: 'neuromuscularBlocker',
            highlightColor: '#000'
        }
    } );



    /**
     * DrugPopulation data
     */
    mw.calculators.addDrugPopulations( {
        general: {
            name: 'General',
        },
        general120kg: {
            name: 'General (&GreaterEqual;120kg)',
            abbreviation: '&GreaterEqual;120kg',
            variables: {
                weight: {
                    min: '120 kgwt'
                }
            }
        },
        neonatal: {
            name: 'Neonatal',
            variables: {
                age: {
                    max: '0 yo'
                }
            }
        },
        pediatric: {
            name: 'Pediatric',
            variables: {
                age: {
                    min: '0 yo',
                    max: '17.9 yo'
                }
            }
        },
        geriatric: {
            name: 'Geriatric',
            variables: {
                age: {
                    min: '65 yo'
                }
            }
        }
    } );



    /**
     * DrugRoute data
     */
    mw.calculators.addDrugRoutes( {
        iv: {
            name: 'Intravenous',
            abbreviation: 'IV',
            default: true
        },
        im: {
            name: 'Intramuscular',
            abbreviation: 'IM'
        },
        po: {
            name: 'Oral',
            abbreviation: 'PO'
        },
        pr: {
            name: 'Rectal',
            abbreviation: 'PR'
        }
    } );



    /**
     * DrugIndication data
     */
    mw.calculators.addDrugIndications( {
        abxProphylaxis: {
            name: 'Antimicrobial prophylaxis',
            abbreviation: 'Abx.'
        },
        acls: {
            name: 'ACLS',
            abbreviation: 'ACLS'
        },
        analgesia: {
            name: 'Analgesia',
            abbreviation: 'Analgesia'
        },
        anaphylaxis: {
            name: 'Anaphylaxis',
            abbreviation: 'Anaphylaxis'
        },
        anxiolysis: {
            name: 'Anxiolysis',
            abbreviation: 'Anxiety'
        },
        bradycardia: {
            name: 'Bradycardia',
            abbreviation: 'Bradycardia'
        },
        generalAnesthesia: {
            name: 'General anesthesia',
            abbreviation: 'GA'
        },
        hypotension: {
            name: 'Hypotension',
            abbreviation: 'Hypoten.'
        },
        hypocalcemia: {
            name: 'Hypocalcemia',
            abbreviation: 'Hypo Ca<sup>2+</sup>'
        },
        intubation: {
            name: 'Intubation',
            abbreviation: 'Intubation'
        },
        malignantHyperthermia: {
            name: 'Malignant hyperthermia',
            abbreviation: 'MH'
        },
        neuromuscularBlockade: {
            name: 'Neuromuscular blockade',
            abbreviation: 'NMB'
        },
        neuromuscularBlockadeReversal: {
            name: 'Neuromuscular blockade reversal',
            abbreviation: 'NMB reversal'
        },
        mac: {
            name: 'Monitored anesthesia care',
            abbreviation: 'MAC'
        },
        ponv: {
            name: 'Postoperative nausea & vomiting',
            abbreviation: 'PONV'
        },
        tiva: {
            name: 'Total intravenous anesthesia',
            abbreviation: 'TIVA'
        }
    } );



    /**
     * Drug data
     */



    /**
     * Acetaminophen
     */
    mw.calculators.addDrugs( {
        acetaminophen: {
            name: 'Acetaminophen',
            dosages: [
                {
                    indication: 'analgesia',
                    population: 'general',
                    description: 'Max dose 4 g/day. Use caution in hepatic impairment.',
                    dose: {
                        dose: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'general',
                    route: 'po',
                    description: 'Max dose 4 g/day. Use caution in hepatic impairment.',
                    dose: {
                        min: '650 mg',
                        max: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'general',
                    route: 'pr',
                    description: 'Max dose 4 g/day. Use caution in hepatic impairment.',
                    dose: {
                        min: '650 mg',
                        max: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    description: 'Max 75 mg/kg/day or 4 g/day (whichever is less). Use caution in hepatic impairment.',
                    dose: {
                        dose: '15 mg/kg',
                        absoluteMax: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    route: 'po',
                    description: 'Max 75 mg/kg/day or 4 g/day (whichever is less). Use caution in hepatic impairment.',
                    dose: {
                        dose: '15 mg/kg',
                        absoluteMax: '1 g'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    route: 'pr',
                    description: 'Max 100 mg/kg/day or 4 g/day (whichever is less). Use caution in hepatic impairment.',
                    references: [
                        'Patrick K. Birmingham, AF1-0567, Michael J. Tobin, Dennis M. Fisher, Thomas K. Henthorn, Steven C. Hall, Charles J. Coté; Initial and Subsequent Dosing of Rectal Acetaminophen in Children: A 24-Hour Pharmacokinetic Study of New Dose Recommendations. Anesthesiology 2001; 94:385–389 doi: https://doi.org/10.1097/00000542-200103000-00005'
                    ],
                    dose: [
                        {
                            name: 'Load',
                            dose: '40 mg/kg',
                            absoluteMax: '1 g'
                        }, {
                            name: 'Maintenance',
                            dose: '20 mg/kg',
                            absoluteMax: '1 g'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/mL'
                }
            ]
        }
    } );



    /**
     * Atropine
     */
    mw.calculators.addDrugs( [
        {
            id: 'atropine',
            name: 'Atropine',
            color: 'anticholinergic',
            description: 'Low doses may cause paradoxical bradycardia',
            dosages: [
                {
                    indication: 'bradycardia',
                    population: 'general',
                    description: 'Repeat as needed to a maximum total dose of 3 mg',
                    dose: {
                        min: '0.5 mg',
                        max: '1 mg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'bradycardia',
                    population: 'pediatric',
                    description: 'Repeat as needed to a maximum total dose of 1 mg',
                    dose: {
                        min: '10 mcg/kg',
                        max: '20 mcg/kg',
                        absoluteMin: '40 mcg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'acls',
                    population: 'general',
                    description: 'Repeat as needed to a maximum total dose of 3 mg',
                    dose: {
                        dose: '1 mg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'acls',
                    population: 'pediatric',
                    description: 'Repeat as needed to a maximum total dose of 1 mg',
                    dose: {
                        dose: '20 mcg/kg',
                        absoluteMin: '100 mcg',
                        absoluteMax: '500 mcg',
                        frequency: 'q3-5m'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '0.1 mg/mL'
                }, {
                    concentration: '0.4 mg/mL',
                    default:true
                }
            ]
        }
    ] );



    /**
     * Calcium chloride
     */
    mw.calculators.addDrugs( [
        {
            id: 'calciumChloride',
            name: 'Calcium chloride',
            description: '<ul><li>Administer via central line</li><li>A 10 mL ampule of calcium chloride 100 mg/mL contains 272 mg of elemental calcium</li></ul>',
            references: [
                'French S, Subauste J, Geraci S. Calcium abnormalities in hospitalized patients. South Med J. 2012 Apr;105(4):231-7. doi: 10.1097/SMJ.0b013e31824e1737. PMID: 22475676.'
            ],
            dosages: [
                {
                    indication: 'hypocalcemia',
                    population: 'general',
                    dose: {
                        min: '500 mg',
                        max: '1 g',
                        duration: '5-10 min'
                    }
                }, {
                    indication: 'hypocalcemia',
                    population: 'pediatric',
                    dose: {
                        min: '10 mg/kg',
                        max: '20 mg/kg',
                        absoluteMax: '1 g',
                        duration: '5-10 min'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '100 mg/mL'
                }
            ]
        }
    ] );



    /**
     * Calcium gluconate
     */
    mw.calculators.addDrugs( [
        {
            id: 'calciumGluconate',
            name: 'Calcium gluconate',
            description: '<ul><li>Can administer peripherally</li><li>A 10 mL ampule of calcium gluconate 100 mg/mL contains 93 mg of elemental calcium</li></ul>',
            references: [
                'French S, Subauste J, Geraci S. Calcium abnormalities in hospitalized patients. South Med J. 2012 Apr;105(4):231-7. doi: 10.1097/SMJ.0b013e31824e1737. PMID: 22475676.'
            ],
            dosages: [
                {
                    indication: 'hypocalcemia',
                    population: 'general',
                    dose: {
                        min: '1 g',
                        max: '2 g',
                        duration: '5-10 min'
                    }
                }, {
                    indication: 'hypocalcemia',
                    population: 'pediatric',
                    dose: {
                        dose: '30 mg/kg',
                        absoluteMax: '2 g',
                        duration: '5-10 min'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '100 mg/mL'
                }
            ]
        }
    ] );



    /**
     * Cefazolin
     */
    mw.calculators.addDrugs( {
        cefazolin: {
            name: 'Cefazolin',
            dosages: [
                {
                    indication: 'abxProphylaxis',
                    population: 'general',
                    dose: {
                        dose: '2 g',
                        frequency: 'q4h'
                    }
                }, {
                    indication: 'abxProphylaxis',
                    population: 'general120kg',
                    dose: {
                        dose: '3 g',
                        frequency: 'q4h'
                    }
                }, {
                    indication: 'abxProphylaxis',
                    population: 'pediatric',
                    dose: {
                        dose: '30 mg/kg',
                        frequency: 'q4h'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '1 g/vial'
                }
            ]
        }
    } );



    /**
     * Cisatracurium
     */
    mw.calculators.addDrugs( {
        cisatracurium: {
            name: 'Cisatracurium',
            color: 'neuromuscularBlocker',
            dosages: [
                {
                    indication: 'neuromuscularBlockade',
                    population: 'general',
                    dose: {
                        dose: '0.2 mg/kg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '2 mg/mL'
                }, {
                    concentration: '20 mg/mL'
                }
            ]
        }
    } );



    /**
     * Dantrolene
     */
    mw.calculators.addDrugs( {
        dantrolene: {
            name: 'Dantrolene',
            dosages: [
                {
                    indication: 'malignantHyperthermia',
                    population: 'general',
                    dose: {
                        dose: '2.5 mg/kg'
                    },
                    description: 'Repeat up to a cumulative dose of 10 mg/kg'
                }
            ],
            preparations: [
                {
                    concentration: '250 mg/vial'
                }, {
                    concentration: '20 mg/vial'
                }
            ]
        }
    } );



    /**
     * Dexmedetomidine
     */
    mw.calculators.addDrugs( {
        dexmedetomidine: {
            name: 'Dexmedetomidine',
            color: 'sedativeHypnotic',
            dosages: [
                {
                    indication: 'mac',
                    population: 'general',
                    dose: [
                        {
                            name: 'Load',
                            dose: '1 mcg/kg',
                            duration: '10 min'
                        }, {
                            name: 'Maintenance',
                            min: '0.2 mcg/kg/hr',
                            max: '1 mcg/kg/hr'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '4 mcg/mL'
                }, {
                    concentration: '100 mcg/mL',
                    dilutionRequired: true
                }
            ]
        }
    } );



    /**
     * Dexamethasone
     */
    mw.calculators.addDrugs( [
        {
            id: 'dexamethasone',
            name: 'Dexamethasone',
            dosages: [
                {
                    indication: 'ponv',
                    population: 'general',
                    dose: {
                        min: '4 mg',
                        max: '8 mg'
                    }
                }, {
                    indication: 'ponv',
                    population: 'pediatric',
                    dose: {
                        dose: '0.1 mg/kg',
                        absoluteMax: '10 mg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '2 mg/mL'
                }
            ]
        }
    ] );



    /**
     * Dobutamine
     */
    mw.calculators.addDrugs( {
        dobutamine: {
            name: 'Dobutamine',
            color: 'cardiovascularAgonist',
            description: 'First line vasopressor for cardiogenic shock with low cardiac output and maintained blood pressure',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                    ],
                    dose: {
                        min: '0.5 mcg/kg/min',
                        max: '20 mcg/kg/min'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '0.5 mg/mL'
                }, {
                    concentration: '12.5 mg/mL'
                }
            ]
        }
    } );



    /**
     * Dopamine
     */
    mw.calculators.addDrugs( {
        dopamine: {
            name: 'Dopamine',
            color: 'cardiovascularAgonist',
            description: '<ul><li>Predominant receptor activation is dose-dependent:<ul><li><5 mcg/kg/min: Dopaminergic</li><li>5-10 mcg/kg/min: &beta;-1 adrenergic</li><li>>10 mcg/kg/min: &alpha;-1 adrenergic</li></ul></li><li>Low-dose dopamine should not be used for renal protective effect</li></ul>',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.',
                        'Bellomo R, Chapman M, Finfer S, Hickling K, Myburgh J. Low-dose dopamine in patients with early renal dysfunction: a placebo-controlled randomised trial. Australian and New Zealand Intensive Care Society (ANZICS) Clinical Trials Group. Lancet. 2000 Dec 23-30;356(9248):2139-43. doi: 10.1016/s0140-6736(00)03495-4. PMID: 11191541.'
                    ],
                    dose: {
                        min: '2 mcg/kg/min',
                        max: '50 mcg/kg/min'
                    }
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: {
                        min: '5 mcg/kg/min',
                        max: '20 mcg/kg/min'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '1.6 mg/mL'
                }, {
                    concentration: '40 mg/mL'
                }
            ]
        }
    } );



    /**
     * Ephedrine
     */
     mw.calculators.addDrugs( {
        ephedrine: {
            name: 'Ephedrine',
            color: 'cardiovascularAgonist',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    dose: {
                        min: '2.5 mg',
                        max: '25 mg'
                    }
                }, {
                    indication: 'hypotension',
                    population: 'general',
                    route: 'im',
                    dose: {
                        min: '25 mg',
                        max: '50 mg'
                    }
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: {
                        min: '0.02 mg/kg',
                        max: '0.2 mg/kg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '5 mg/mL'
                }, {
                    concentration: '50 mg/mL'
                }
            ]
        }
    } );



    /**
     * Epinephrine
     */
    mw.calculators.addDrugs( {
        epinephrine: {
            name: 'Epinephrine',
            color: 'epinephrine',
            description: 'First line vasopressor for anaphylactic shock',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                    ],
                    dose: [
                        {
                            name: 'Bolus',
                            min: '5 mcg',
                            max: '20 mcg',
                            frequency: 'q1-5m'
                        }, {
                            name: 'Infusion',
                            min: '0.01 mcg/kg/min',
                            max: '2 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    references: [
                        'Marino BS, Tabbutt S, MacLaren G, Hazinski MF, Adatia I, Atkins DL, Checchia PA, DeCaen A, Fink EL, Hoffman GM, Jefferies JL, Kleinman M, Krawczeski CD, Licht DJ, Macrae D, Ravishankar C, Samson RA, Thiagarajan RR, Toms R, Tweddell J, Laussen PC; American Heart Association Congenital Cardiac Defects Committee of the Council on Cardiovascular Disease in the Young; Council on Clinical Cardiology; Council on Cardiovascular and Stroke Nursing; Council on Cardiovascular Surgery and Anesthesia; and Emergency Cardiovascular Care Committee. Cardiopulmonary Resuscitation in Infants and Children With Cardiac Disease: A Scientific Statement From the American Heart Association. Circulation. 2018 May 29;137(22):e691-e782. doi: 10.1161/CIR.0000000000000524. Epub 2018 Apr 23. PMID: 29685887.',
                        'Reiter PD, Roth J, Wathen B, LaVelle J, Ridall LA. Low-Dose Epinephrine Boluses for Acute Hypotension in the PICU. Pediatr Crit Care Med. 2018 Apr;19(4):281-286. doi: 10.1097/PCC.0000000000001448. PMID: 29319635.'
                    ],
                    dose: [
                        {
                            name: 'Bolus',
                            min: '1 mcg/kg',
                            max: '5 mcg/kg',
                            frequency: 'q1-5m'
                        }, {
                            name: 'Infusion',
                            min: '0.02 mcg/kg/min',
                            max: '1 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'acls',
                    population: 'general',
                    dose: {
                        dose: '1 mg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'acls',
                    population: 'pediatric',
                    dose: {
                        dose: '10 mcg/kg',
                        absoluteMax: '1 mg',
                        frequency: 'q3-5m'
                    }
                }, {
                    indication: 'anaphylaxis',
                    population: 'general',
                    dose: [
                        {
                            name: 'Bolus',
                            dose: '10 mcg/kg',
                            absoluteMax: '0.5 mg',
                            frequency: 'q3-5m'
                        }, {
                            name: 'Infusion',
                            min: '0.1 mcg/kg/min',
                            max: '1 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'anaphylaxis',
                    population: 'general',
                    route: 'im',
                    dose: {
                        dose: '10 mcg/kg',
                        frequency: 'q5-15m',
                        absoluteMax: '0.5 mg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '10 mcg/mL'
                }, {
                    concentration: '16 mcg/mL'
                }, {
                    concentration: '100 mcg/mL',
                    default: true
                }, {
                    concentration: '1 mg/mL'
                }
            ]
        }
    } );



    /**
     * Etomidate
     */
    mw.calculators.addDrugs( {
        etomidate: {
            name: 'Etomidate',
            color: 'sedativeHypnotic',
            dosages: [
                {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    dose: {
                        min: '0.2 mg/kg',
                        max: '0.6 mg/kg',
                        weightCalculation: [ 'lbw', 'ibw' ]
                    }
                }
            ],
            preparations: [
                {
                    concentration: '2 mg/mL'
                }
            ]
        }
    } );



    /**
     * Ketamine
     */
    mw.calculators.addDrugs( {
        ketamine: {
            name: 'Ketamine',
            color: 'sedativeHypnotic',
            dosages: [
                {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    dose: {
                        min: '1 mg/kg',
                        max: '2 mg/kg',
                        weightCalculation: [ 'lbw', 'ibw'  ]
                    }
                }, {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    route: 'im',
                    dose: {
                        min: '4 mg/kg',
                        max: '6 mg/kg'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'general',
                    description: 'To prevent prolonged recovery, do not administer in last hour of surgery.',
                    references: [
                        'Sabine Himmelseher, Marcel E. Durieux, Richard B. Weiskopf; Ketamine for Perioperative Pain Management. Anesthesiology 2005; 102:211–220 doi: https://doi.org/10.1097/00000542-200501000-00030'
                    ],
                    dose: [
                        {
                            name: 'Load (before incision)',
                            min: '0.25 mg/kg',
                            max: '0.5 mg/kg'
                        }, {
                            name: 'Maintenance',
                            min: '0.125 mg/kg',
                            max: '0.25 mg/kg',
                            frequency: 'q30m'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/mL'
                }, {
                    concentration: '50 mg/mL'
                }, {
                    concentration: '100 mg/mL'
                }
            ]
        }
    } );



    /**
     * Ketorolac
     */
    mw.calculators.addDrugs( [
        {
            id: 'ketorolac',
            name: 'Ketorolac',
            dosages: [
                {
                    indication: 'analgesia',
                    population: 'general',
                    description: 'A 10 mg dose of ketorolac is as effective for acute pain control as a 15 or 30 mg dose<sup>1</sup>',
                    references: [
                        'Motov S, Yasavolian M, Likourezos A, Pushkar I, Hossain R, Drapkin J, Cohen V, Filk N, Smith A, Huang F, Rockoff B, Homel P, Fromm C. Comparison of Intravenous Ketorolac at Three Single-Dose Regimens for Treating Acute Pain in the Emergency Department: A Randomized Controlled Trial. Ann Emerg Med. 2017 Aug;70(2):177-184. doi: 10.1016/j.annemergmed.2016.10.014. Epub 2016 Dec 16. PMID: 27993418.'
                    ],
                    dose: {
                        min: '10 mg',
                        max: '30 mg'
                    }
                }, {
                    indication: 'analgesia',
                    population: 'pediatric',
                    dose: {
                        min: '0.5 mg/kg',
                        max: '1 mg/kg',
                        absoluteMax: '30 mg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '15 mg/mL'
                }, {
                    concentration: '30 mg/mL',
                    default: true
                }
            ]
        }
    ] );



    /**
     * Lidocaine
     */
    mw.calculators.addDrugs( {
        lidocaine: {
            name: 'Lidocaine',
            color: 'localAnesthetic',
            dosages: [
                {
                    indication: 'intubation',
                    population: 'general',
                    dose: {
                        dose: '1 mg/kg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '1 pct'
                }, {
                    concentration: '2 pct'
                }
            ]
        }
    } );



    /**
     * Midazolam
     */
    mw.calculators.addDrugs( {
        midazolam: {
            name: 'Midazolam',
            color: 'benzodiazepine',
            dosages: [
                {
                    indication: 'anxiolysis',
                    population: 'general',
                    dose: {
                        min: '0.01 mg/kg',
                        max: '0.03 mg/kg'
                    }
                }, {
                    indication: 'anxiolysis',
                    population: 'general',
                    route: 'im',
                    dose: {
                        min: '0.07 mg/kg',
                        max: '0.08 mg/kg'
                    }
                }, {
                    indication: 'anxiolysis',
                    population: 'general',
                    route: 'po',
                    dose: {
                        dose: '0.5 mg/kg',
                        absoluteMax: '20 mg'
                    }
                }, {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    dose: {
                        min: '0.1 mg/kg',
                        max: '0.3 mg/kg',
                        weightCalculation: [ 'lbw', 'ibw' ]
                    }
                }
            ],
            preparations: [
                {
                    concentration: '1 mg/mL'
                }, {
                    concentration: '5 mg/mL'
                }
            ]
        }
    } );



    /**
     * Milrinone
     */
    mw.calculators.addDrugs( {
        milrinone: {
            name: 'Milrinone',
            color: 'cardiovascularAgonist',
            description: '<ul><li>Used in cardiogenic shock</li><li>Dose adjustment needed in renal impairment</li></ul>',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                    ],
                    dose: [
                        {
                            name: 'Load (optional)',
                            dose: '50 mcg/kg',
                            duration: '10 min'
                        }, {
                            name: 'Infusion',
                            min: '0.125 mcg/kg/min',
                            max: '0.75 mcg/kg/min'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '0.2 mg/mL'
                }, {
                    concentration: '1 mg/mL'
                }
            ]
        }
    } );



    /**
     * Neostigmine
     */
    mw.calculators.addDrugs( {
        neostigmine: {
            name: 'Neostigmine',
            color: 'neuromuscularBlockerReversal',
            dosages: [
                {
                    indication: 'neuromuscularBlockadeReversal',
                    population: 'general',
                    description: 'For each 1 mg of neostigmine, give 0.2 mg of glycopyrrolate to avoid bradycardia',
                    dose: {
                        min: '0.03 mg/kg',
                        max: '0.07 mg/kg',
                        absoluteMax: '5 mg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '0.5 mg/mL'
                }, {
                    concentration: '1 mg/mL'
                }
            ]
        }
    } );



    /**
     * Norepinephrine
     */
    mw.calculators.addDrugs( {
        norepinephrine: {
            name: 'Norepinephrine',
            color: 'cardiovascularAgonist',
            description: 'First line vasopressor for septic and hypovolemic shock',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                    ],
                    dose: [
                        {
                            name: 'Bolus',
                            min: '5 mcg',
                            max: '20 mcg'
                        }, {
                            name: 'Infusion',
                            min: '0.05 mcg/kg/min',
                            max: '3.3 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: [
                        {
                            name: 'Bolus',
                            min: '0.05 mcg/kg',
                            max: '0.1 mcg/kg'
                        }, {
                            name: 'Infusion',
                            min: '0.05 mcg/kg/min',
                            max: '2 mcg/kg/min'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mcg/mL'
                }, {
                    concentration: '16 mcg/mL'
                }, {
                    concentration: '1 mg/mL',
                    dilutionRequired: true
                }
            ]
        }
    } );



    /**
     * Ondansetron
     */
    mw.calculators.addDrugs( {
        ondansetron: {
            name: 'Ondansetron',
            dosages: [
                {
                    indication: 'ponv',
                    population: 'general',
                    dose: {
                        dose: '4 mg'
                    }
                }, {
                    indication: 'ponv',
                    population: 'pediatric',
                    dose: {
                        dose: '0.1 mg/kg',
                        absoluteMax: '4 mg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '2 mg/mL'
                }
            ]
        }
    } );



    /**
     * Phenylephrine
     */
    mw.calculators.addDrugs( {
        phenylephrine: {
            name: 'Phenylephrine',
            color: 'cardiovascularAgonist',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    dose: [
                        {
                            name: 'Bolus',
                            min: '50 mcg',
                            max: '200 mcg'
                        }, {
                            name: 'Infusion',
                            min: '0.25 mcg/kg/min',
                            max: '1 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    dose: [
                        {
                            name: 'Bolus',
                            min: '0.5 mcg/kg',
                            max: '1 mcg/kg'
                        }, {
                            name: 'Infusion',
                            min: '0.1 mcg/kg/min',
                            max: '0.5 mcg/kg/min'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mcg/mL'
                }, {
                    concentration: '100 mcg/mL',
                    default: true
                }, {
                    concentration: '160 mcg/mL'
                }, {
                    concentration: '10 mg/mL',
                    dilutionRequired: true
                }
            ]
        }
    } );



    /**
     * Propofol
     */
    mw.calculators.addDrugs( {
        propofol: {
            name: 'Propofol',
            color: 'sedativeHypnotic',
            dosages: [
                {
                    indication: 'generalAnesthesia',
                    population: 'general',
                    dose: [
                        {
                            name: 'Induction',
                            min: '1 mg/kg',
                            max: '2.5 mg/kg',
                            weightCalculation: [ 'lbw', 'ibw' ]
                        }, {
                            name: 'Maintenance',
                            min: '100 mcg/kg/min',
                            max: '200 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'generalAnesthesia',
                    population: 'pediatric',
                    dose: [
                        {
                            name: 'Induction',
                            min: '2.5 mg/kg',
                            max: '3.5 mg/kg',
                            weightCalculation: [ 'lbw', 'ibw' ]
                        }, {
                            name: 'Maintenance',
                            min: '125 mcg/kg/min',
                            max: '300 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'generalAnesthesia',
                    population: 'geriatric',
                    dose: [
                        {
                            name: 'Induction',
                            min: '1 mg/kg',
                            max: '1.5 mg/kg',
                            weightCalculation: [ 'lbw', 'ibw' ]
                        }, {
                            name: 'Maintenance',
                            min: '50 mcg/kg/min',
                            max: '100 mcg/kg/min'
                        }
                    ]
                }, {
                    indication: 'mac',
                    population: 'general',
                    dose: {
                        min: '25 mcg/kg/min',
                        max: '75 mcg/kg/min'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/mL'
                }
            ]
        }
    } );



    /**
     * Remifentanil
     */
    mw.calculators.addDrugs( {
        remifentanil: {
            name: 'Remifentanil',
            color: 'opioid',
            dosages: [
                {
                    indication: 'tiva',
                    population: 'general',
                    dose: [
                        {
                            name: 'Load',
                            min: '1 mcg/kg',
                            max: '2 mcg/kg',
                            weightCalculation: [ 'lbw', 'ibw' ]
                        }, {
                            name: 'Maintenance',
                            min: '0.1 mcg/kg/min',
                            max: '1 mcg/kg/min'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '50 mcg/mL'
                }, {
                    concentration: '1 mg/vial',
                    dilutionRequired: true
                }, {
                    concentration: '2 mg/vial',
                    dilutionRequired: true
                }
            ]
        }
    } );



    /**
     * Rocuronium
     */
    mw.calculators.addDrugs( {
        rocuronium: {
            name: 'Rocuronium',
            color: 'neuromuscularBlocker',
            dosages: [
                {
                    indication: 'neuromuscularBlockade',
                    population: 'general',
                    dose: [
                        {
                            name: 'Standard',
                            dose: '0.6 mg/kg'
                        }, {
                            name: 'Rapid sequence',
                            dose: '1.2 mg/kg'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/mL'
                }
            ]
        }
    } );



    /**
     * Succinylcholine
     */
    mw.calculators.addDrugs( {
        succinylcholine: {
            name: 'Succinylcholine',
            color: 'succinylcholine',
            dosages: [
                {
                    indication: 'neuromuscularBlockade',
                    population: 'general',
                    dose: {
                        min: '1 mg/kg',
                        max: '1.5 mg/kg'
                    }
                }, {
                    indication: 'neuromuscularBlockade',
                    population: 'general',
                    route: 'im',
                    dose: {
                        min: '3 mg/kg',
                        max: '5 mg/kg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '20 mg/mL'
                }, {
                    concentration: '100 mg/mL'
                }
            ]
        }
    } );



    /**
     * Sufentanil
     */
    mw.calculators.addDrugs( {
        sufentanil: {
            name: 'Sufentanil',
            color: 'opioid',
            dosages: [
                {
                    indication: 'tiva',
                    population: 'general',
                    dose: [
                        {
                            name: 'Load',
                            min: '0.25 mcg/kg',
                            max: '2 mcg/kg',
                            weightCalculation: [ 'lbw', 'ibw' ]
                        }, {
                            name: 'Maintenance',
                            min: '0.5 mcg/kg/hr',
                            max: '1.5 mcg/kg/hr'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '5 mcg/mL'
                }, {
                    concentration: '50 mcg/mL'
                }
            ]
        }
    } );



    /**
     * Sugammadex
     */
    mw.calculators.addDrugs( {
        sugammadex: {
            name: 'Sugammadex',
            color: 'neuromuscularBlockerReversal',
            dosages: [
                {
                    indication: 'neuromuscularBlockadeReversal',
                    population: 'general',
                    description: '<ul><li>&ge;2 twitches on TOF: 2 mg/kg</li><li>1-2 posttetanic twitches: 4 mg/kg</li><li>Immediate reversal: 16 mg/kg</li></ul>',
                    dose: {
                        min: '2 mg/kg',
                        max: '16 mg/kg'
                    }
                }
            ],
            preparations: [
                {
                    concentration: '100 mg/mL'
                }
            ]
        }
    } );



    /**
     * Vasopressin
     */
    mw.calculators.addDrugs( {
        vasopressin: {
            name: 'Vasopressin',
            color: 'cardiovascularAgonist',
            dosages: [
                {
                    indication: 'hypotension',
                    population: 'general',
                    description: 'Use caution with sustained infusions >0.04 units/min which can cause cardiac and splanchnic ischemia',
                    references: [
                        'Hollenberg SM. Vasoactive drugs in circulatory shock. Am J Respir Crit Care Med. 2011 Apr 1;183(7):847-55. doi: 10.1164/rccm.201006-0972CI. Epub 2010 Nov 19. PMID: 21097695.'
                    ],
                    dose: [
                        {
                            name: 'Bolus',
                            min: '0.5 units',
                            max: '1 unit'
                        }, {
                            name: 'Infusion',
                            min: '0.01 units/min',
                            max: '0.07 units/min'
                        }
                    ]
                }, {
                    indication: 'hypotension',
                    population: 'pediatric',
                    references: [
                        'Choong K, Kissoon N. Vasopressin in pediatric shock and cardiac arrest. Pediatr Crit Care Med. 2008 Jul;9(4):372-9. doi: 10.1097/PCC.0b013e318172d7c8. PMID: 18496412.'
                    ],
                    dose: [
                        {
                            name: 'Bolus',
                            min: '0.005 units/kg',
                            max: '0.01 units/kg'
                        }, {
                            name: 'Infusion',
                            min: '0.0002 units/kg/min',
                            max: '0.008 units/kg/min'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '1 units/mL'
                }, {
                    concentration: '20 units/mL'
                }
            ]
        }
    } );



    /**
     * Vecuronium
     */
    mw.calculators.addDrugs( {
        vecuronium: {
            name: 'Vecuronium',
            color: 'neuromuscularBlocker',
            dosages: [
                {
                    indication: 'neuromuscularBlockade',
                    population: 'general',
                    dose: [
                        {
                            name: 'Standard',
                            dose: '0.1 mg/kg'
                        }, {
                            name: 'Rapid sequence',
                            dose: '1.2 mg/kg'
                        }
                    ]
                }
            ],
            preparations: [
                {
                    concentration: '10 mg/vial'
                }
            ]
        }
    } );
}() );