DrM Heallthland

Productivity enhancements to Healthland Centriq EHR

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        DrM Heallthland
// @namespace   jewelmirror.com
// @include     http://hlapp/Healthlandweb/*
// @include     https://pmp.doj.ca.gov/pdmp/*
// @version     1.1
// @description Productivity enhancements to Healthland Centriq EHR
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_setClipboard
// @grant       GM_xmlhttpRequest
// @require     https://code.jquery.com/jquery-2.0.3.min.js
// @require     https://code.jquery.com/ui/1.8.2/jquery-ui.js
// @requre      http://hlapp/Healthlandweb/Scripts/telerik/Input/DateInput/RadDateInputScript.js
// ==/UserScript==

/*
 * $Source: /Users/cvsroot/DrM_Heallthland/DrM_Heallthland.user.js,v $
 * $Author: marcin $
 * $Revision: 1.11 $
 * 
 * History
 * Version 1.0
 *      Original release.  Support for keyboard shortcuts, calculator for Mini Mental and ED Outpatient Level of 
 *      service, CURES
 * Version 1.1
 *      CURES
 *          DrM Logo in cures
 *      New shortcuts
 *          p - problem list
 *          m - home medications
 *      Calculators
 *          Warfarin dosing calculator
 *---------------------------------------------------------------------------
        @licstart  The following is the entire license notice for the 
        JavaScript code in this page.

        Copyright (C) 2025  Marcin Matuszkiewicz - [email protected]

        The JavaScript code in this page is free software: you can
        redistribute it and/or modify it under the terms of the GNU
        General Public License (GNU GPL) as published by the Free Software
        Foundation, either version 3 of the License, or (at your option)
        any later version.  The code is distributed WITHOUT ANY WARRANTY;
        without even the implied warranty of MERCHANTABILITY or FITNESS
        FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.

        As additional permission under GNU GPL version 3 section 7, you
        may distribute non-source (e.g., minimized or compacted) forms of
        that code without the copy of the GNU GPL normally required by
        section 4, provided you include this license notice and a URL
        through which recipients can access the Corresponding Source.   


        @licend  The above is the entire license notice
        for the JavaScript code in this page
 */


/********************************************************************
 * CURES Specific functions and data
 ********************************************************************/
var CURESpages = {
    index : 'index.do',
    search_input : 'list.do',
    search_results : 'search.do',
    report: 'listPatients.do'
};

function CURESSelectAllOnChange() {
    cb = document.getElementById('checkall_id');
    if (cb.checked) {
        CURESSelectAll();
    } else {
        CURESDeselectAll();
    }
}

function CURESSelectAll() {
    ids = document.getElementsByName('ids');

    for ( i = 0; i < ids.length; i++) {
        ids[i].checked = true;
    }
}

function CURESDeselectAll() {
    ids = document.getElementsByName('ids');

    for ( i = 0; i < ids.length; i++) {
        ids[i].checked = false;
    }
}

function CURESIndex() {
    // You prefill your USERNAME
    document.getElementById('j_username').value = '';
    var pass = document.getElementById('j_password');
    pass.focus();
    // You can set pass.value to fill you PASSWROD
    pass.value = '';
    
    // Auto login
    // $('input:submit').click();
//    var inputs = document.getElementsByTagName('input');
//    for (var i in inputs) {
//        if (i.getAttribute('type') == 'submit') {
//            i.click();
//        }
//    }    
}

function CURESSearchInput() {
    var patientId = GM_getValue('patientId');
    var visitId = GM_getValue('visitId');
    
    if (patientId && visitId) {
        // var btn = $('#middleColumn').prepend('<input id="loadDemo" type="button" value="Load from HL">');
        
        $('[name="search"]').before('<input id="loadDemo" type="button" value="Load from HL">');
        $('#loadDemo').bind('click', loadDemographics);
        $('#loadDemo').before('<div id="loadingDemo">Loading</div>');
        $('#loadingDemo').css('background', 'yellow');
        // Load demographics by default
        loadDemographics();        
    }
    
    var period_sel = document.getElementById('period');
    period_sel.value = '12';

    var disclaimer_cb = document.getElementsByName('disclaimer');
    disclaimer_cb[0].setAttribute('checked', true);    
}

function CURESSearchResults(){
    var tab = document.getElementById('resultsTable');

    var thead = tab.getElementsByTagName('thead');

    var r = thead[0].insertRow(-1);

    var cell0 = r.insertCell(0);
    var cell1 = r.insertCell(1);
    //cell0.setAttribute('colspan', '2');

    var checkall_cb = document.createElement('input');
    checkall_cb.setAttribute('type', 'checkbox');
    checkall_cb.id = "checkall_id";
    checkall_cb.checked = true;
    checkall_cb.value = "SELECTALL";

    cell0.appendChild(checkall_cb);
    cell1.innerHTML = 'Select All';

    checkall_cb.addEventListener("click", CURESSelectAllOnChange, true);

    CURESSelectAll();    
}


/********************************************************************
 * Healthland specifiction fuctions
 ********************************************************************/
function loadDemographics() {
    console.log('DrM: loading demographics');
    
    $('#loadDemo').hide();
    $('#loadingDemo').show();
    
    var href = 'http://hlapp/Healthlandweb/Demographics/FillDemographics?area=Demographics&patientId=';
    href += GM_getValue('patientId');
    href += '&visitId=';
    href += GM_getValue('visitId');
    console.log(href);
    
    GM_xmlhttpRequest({
    method: "GET",
    url:     href,
    onload: processDemographics
    });  
}

function processDemographics(response) {
    console.log('processing Demographics');
    var demoDOM = new DOMParser().parseFromString(response.responseText, 'text/html');
    
    var dob = demoDOM.getElementById('Actual-DOB').value;
    
    var labels = demoDOM.getElementsByTagName('label');
    var lastName = labels[1].nextSibling.nextSibling.innerHTML.trim();
    var firstName = labels[2].nextSibling.nextSibling.innerHTML.trim();
    
    $('#lastName').val(lastName);
    $('#firstName').val(firstName);
    $('#dob').val(dob);

    $('#loadDemo').show();
    $('#loadingDemo').hide();
    
    console.log(lastName);
    console.log(firstName);
    console.log(dob);
    
}

function addCURES() {
    var ptChartMenu = document.getElementsByClassName('lineBlock')[1];
    
    if (!ptChartMenu) {
        return;
    }
    
    var wr = document.createElement('div');
    wr.setAttribute('class', 'main-button-wrapper');
    
    var el = document.createElement('input');
    el.setAttribute('type', 'button');
    el.setAttribute('id', 'CURES');
    // el.setAttribute('class', 'mainButtons');
    el.setAttribute('title', 'CURES');
    el.setAttribute('value', 'CURES');
    
    wr.appendChild(el);
    ptChartMenu.appendChild(wr);
    
    el.addEventListener('click', function() {
        var patientId = $('#current-patient-id').text().trim();
        var visitId = $('#current-visit-id').text().trim();
    
        if (!patientId.length || !visitId) {
            console.log('Select a ptient');
            return;
        }
        
        GM_setValue('patientId', patientId);
        GM_setValue('visitId', visitId);    
        win = window.open('https://pmp.doj.ca.gov/pdmp/index.do');
        win.focus();            
        });    
}

/********************************************************************
 * ASSESSMENT FUNCTIONS
 ********************************************************************/
function addAssessMiniMentalButton() {
    $('#N_AFControl_18').after('<input id="idCalcScore" type="button" value="Calculate Score">');
    $('#idCalcScore').bind('click', calcAssessMiniMentalScore);
    console.log(btn);
}

function calcAssessMiniMentalScore() {
    console.log('Calculating Minimental');
    var miniMentalTotal = 0;
    var orientationCheckboxes = $('input[groupid="286"]:checkbox');
    var orientationTotalInput = $('input[groupid="286"]:text');
    var miniMentalTotalInput = $('#N_AFControl_18');
    
    var tmpTotal = 0;
    for (var i=0; i < orientationCheckboxes.length; i++) {
        if (orientationCheckboxes[i].checked) {
            miniMentalTotal++;
            tmpTotal++;
        }
    }
    orientationTotalInput.val(tmpTotal);
    
    var sel = $('#N_AFControl_4 option:selected').text();
    if (sel.indexOf('-select-') >= 0) {
        tmpTotal = 0;
    } else {
       tmpTotal = parseInt(sel.split('=')[0]);
    }
    miniMentalTotal += tmpTotal;
    // Update Registration total input
    $('#N_AFControl_5').val(tmpTotal);
    
    
    var sel = $('#N_AFControl_6 option:selected').text();
    if (sel.indexOf('-select-') >= 0) {
        tmpTotal = 0;
    } else {
       tmpTotal = parseInt(sel.split('=')[0]);
    }
    miniMentalTotal += tmpTotal;
    // Update Attention total input
    $('#N_AFControl_7').val(tmpTotal);

    var sel = $('#N_AFControl_8 option:selected').text();
    if (sel.indexOf('-select-') >= 0) {
        tmpTotal = 0;
    } else {
       tmpTotal = parseInt(sel.split('=')[0]);
    }
    miniMentalTotal += tmpTotal;
    // Update Attention total input
    $('#N_AFControl_10').val(tmpTotal);

    tmpTotal = 0;
    for (var i = 11; i < 17; i++) {
        var sel = $('#N_AFControl_'+i+' option:selected').text();
        console.log(sel);
        if (sel.indexOf('-select-') >= 0) {
            tmpTotal += 0;
        } else {
           tmpTotal += parseInt(sel.split('=')[0]);
        }
    }
    miniMentalTotal += tmpTotal;
    // Update Attention total input
    $('#N_AFControl_17').val(tmpTotal);
           
    miniMentalTotalInput.val(miniMentalTotal);    
}

function addEDOutpatientLevelButton() {
    $('#N_AFControl_73').after('<input id="idCalcScore" type="button" value="Calculate Score">');
    $('#idCalcScore').bind('click', calcEDOutpatientLevel);
}

function calcEDOutpatientLevel() {
    var total = 0;
    
    for (var i = 1; i < 73; i++) {
        var sel = $('#N_AFControl_'+i+' option:selected').text();
        console.log(i+': '+sel);
        if (sel.indexOf('-select-') >= 0) {
            total += 0;
        } else {
           total += parseInt(sel);
        }
    }
    
    $('#N_AFControl_73').val(total);    
}

function addDMVAudiometryButton() {
    $('#N_AFControl_1').after('<input id="idCalcScore" type="button" value="Calculate Score">');
    $('#idCalcScore').bind('click', calcDMVAudiometry);    
}

function calcDMVAudiometry() {
    var avgRt = 0, avgLt = 0;
    
    for (var i = 2; i < 5; i++) {
        var sel = $('#N_AFControl_'+i+' option:selected').text();
        if (sel.indexOf('-select-') >= 0) {
            avgRt += 0;
        } else {
           avgRt += parseInt(sel);
        }        
    }
    avgRt = Math.round(avgRt/3);
    
    console.log(avgLt);
    for (var i = 6; i < 9; i++) {
        var sel = $('#N_AFControl_'+i+' option:selected').text();
        if (sel.indexOf('-select-') >= 0) {
            avgLt += 0;
        } else {
           avgLt += parseInt(sel);
        }        
    }
    console.log(avgLt);
    avgLt = Math.round(avgLt/3);
    
    $('#N_AFControl_5').val(avgRt);
    $('#N_AFControl_9').val(avgLt);
    
    var yes = $('#N_AFControl_1 option:nth-child(2)').val();
    var no = $('#N_AFControl_1 option:nth-child(3)').val();
    if (avgRt <= 40 || avgLt <= 40) {
        $('#N_AFControl_1').val(yes); // Select YES
    } else {
        $('#N_AFControl_1').val(no); // Select NO
    }         
}

function KeyboardShortcuts(event) {
    console.log('DrM: Processing Shortcuts');
    if ($('INPUT:focus, SELECT:focus, TEXTAREA:focus').length) // disable hotkeys if focused on a form control
        return;

    var patientId = $('#current-patient-id').text().trim();
    var visitId = $('#current-visit-id').text().trim();
    var loc = '';
    
    var ch = String.fromCharCode(event.which).toLowerCase();
    console.log(ch);
    if (ch == 'v') {
        // key - 'v'
        loc = 'http://hlapp/Healthlandweb/PatientChart/Chart/VitalSigns?patientId='+patientId;
        loc += '&visitId='+visitId;
    } else if (ch == 'a') {
        // key - 'a'
        loc = 'http://hlapp/Healthlandweb/PatientChart/Chart/Assessments?patientId='+patientId;
        loc += '&visitId='+visitId;      
    } else if (ch == 'n') {
        // key - 'n'
        loc = 'http://hlapp/Healthlandweb/PatientChart/Chart/ChartNotes?patientId='+patientId;
        loc += '&visitId='+visitId; 
    } else if (ch == 'l') {
        // key - 'l'
        loc = 'http://hlapp/Healthlandweb/PatientChart/Chart/LabResults?patientId='+patientId;
        loc += '&visitId='+visitId;            
    } else if (ch == 'd') {
        // key - 'd'
        loc = 'http://hlapp/Healthlandweb/PatientChart/Chart/Documents?patientId='+patientId;
        loc += '&visitId='+visitId;                    
    } else if (ch == 'o') {
        // key - 'o'
        loc = 'http://hlapp/Healthlandweb/CPOE/WHOrders/Orders?patientId='+patientId;
        loc += '&visitId='+visitId;
    } else if (ch == 'p') {
        // key = - 'p'
        loc = 'http://hlapp/Healthlandweb/History/MedicalHistory?patientId='+patientId;
        loc += '&initialTab=Problem';
    } else if (ch == 'm') {
        // key = - 'm'
        loc = 'http://hlapp/Healthlandweb/History/MedicalHistory?patientId='+patientId;
        loc += '&initialTab=HomeMedication';        
    } else if (ch == 's') {
        // key = 's'
        console.log('Launching summary');
        // $('#current-patient-bar-quick-view').click();
        $('.quick-view').click();
        return;
    } else if (ch == 'c') {
        // key = 'c';
        // Will try to assessment calculator
        var assessTitleCtrl = $('label.header:first');
        console.log(assessTitleCtrl);
        
        if (!assessTitleCtrl.length) {
            console.log('DrM: No assesement found');
            return;
        }
        
        var assessTitle = assessTitleCtrl.text().trim();
        
        console.log('"'+assessTitle+'"');
        console.log(assessTitle == 'Warfarin Flowsheet - INR 2.0 - 3.0');
        if (assessTitle == 'Mini Mental Status Exam') {
            console.log('DrM: Detected Mini Mental Status Exam');
            addAssessMiniMentalButton();
        } else if (assessTitle == 'ED Outpatient Level Of Acuity Assignment') {
            console.log('DrM: Dected ED Outpatient Level Of Acuity Assignment');
            addEDOutpatientLevelButton();
        } else if (assessTitle == 'DMV Audiometry') {
            console.log('DrM: Detected DMV Audiometry Assessment');
            addDMVAudiometryButton();
        } else if (assessTitle == 'Warfarin Flowsheet - INR 2.0 - 3.0') {
            console.log('DrM: Detected Warfarin Flowsheet - INR 2.0 - 3.0');
            Warfarin.UI.initINRCalc1();
        }
        
        return;
    } else {
        return;
    }
    
    
    window.location.href = loc;        
}

function createHelp() {
    $('body').append('<div id="msg"></div>');
    $('#msg').hide();
    $('#msg').append('<table id="tblHelp"></table>');
    var tb = $('#tblHelp');
    tb.append('<tr><td colspan="2" class="helpheader">Shortcuts</td><td></td></tr>');
    tb.append('<tr><td class="helpshortcut">a</td><td>Assesments</td></tr>');
    tb.append('<tr><td class="helpshortcut">c</td><td>Add Assement Calculator</td></tr>');
    tb.append('<tr><td class="helpshortcut">d</td><td>Documents</td></tr>');
    tb.append('<tr><td class="helpshortcut">l</td><td>Lab Results</td></tr>');
    tb.append('<tr><td class="helpshortcut">n</td><td>Lab Results</td></tr>');
    tb.append('<tr><td class="helpshortcut">o</td><td>CPOE</td></tr>');
    tb.append('<tr><td class="helpshortcut">p</td><td>Problem List</td></tr>');
    tb.append('<tr><td class="helpshortcut">m</td><td>Home Medications (good place to lauch ePrescribe)</td></tr>');
    tb.append('<tr><td class="helpshortcut">s</td><td>Patietn Summary</td></tr>');
    tb.append('<tr><td colspan="2" class="helpheader">Assessments Calculators</td><td></td></tr>');
    tb.append('<tr><td colspan="2">ED Outpatient Level Of Acuity Assignment</td><td></td></tr>');
    tb.append('<tr><td colspan="2">Mini Mental Status Exam</td><td></td></tr>');
    $('.helpheader').css('font-weight', 'bold');
    $('.helpshortcut').css('color', 'blue');
    $('.helpshortcut').css('font-weight', 'bold');
}


/********************************************************************
 * MAIN script
 ********************************************************************/

console.log('DrM: Loading');

// Add DrM to pages so users know functionality is avaiable
$('body').append('<div id="logoDrM">DrM</div>');
var style = {position:'absolute',
    top: '1px',
    left: '1px',
    border:'1px solid black',
    padding:'10px',
    background: 'lightblue',
    'z-index': '3000'
};
$('#logoDrM').css(style);
$('#logoDrM').on('click', function() {    
    $('#msg').dialog({title: "DrM Enhancements v1.1", draggable: true});
});

createHelp();

var loc = window.location.href;

if (loc.indexOf('doj.ca.gov') >= 0) { // we are handling CURES
    if (loc.indexOf(CURESpages['index']) >= 0) {
        CURESIndex();
    } else if (loc.indexOf(CURESpages['search_input']) >= 0) {
        CURESSearchInput();
    } else if (loc.indexOf(CURESpages['search_results']) >= 0) {
        CURESSearchResults();
    } else if (loc.indexOf(CURESpages['report']) >= 0) {
        var th = document.getElementById('ReportDate');
        var tbody = th.parentNode.parentNode;
        var row_header = tbody.children[0];
        var row_pt = tbody.children[1];
    
        console.log(tbody);
    
        var row = tbody.insertRow(-1);
    
        cell0 = row.insertCell(0);
        cell1 = row.insertCell(1);
        cell1.setAttribute('colspan', '3');
    
        cell0.innerHTML = "PDF Name";
        
        var LastName = row_pt.children[1].innerHTML.trimLeft().trimRight();
        var FirstName = row_pt.children[2].innerHTML.trimLeft().trimRight();
        var DOB = row_pt.children[3].innerHTML.trimLeft().trimRight();
        var ReportDate = row_pt.children[0].innerHTML.trimLeft().trimRight().split(" ")[0];
        
        var PDFName = LastName+" "+FirstName+" "+DOB+" "+ReportDate;
       
        cell1.innerHTML = PDFName;
        GM_setClipboard(PDFName);    
    }
} else { // we are handling Healthland
    console.log('DrM: about to add cures');
    addCURES();
    var counter = GM_getValue('counter');
    console.log(counter);
    GM_setValue('counter', ++counter);
    
    // Keyboard shortcuts
    console.log('DrM: Binding keyboard shortcuts');
    document.addEventListener('keypress', KeyboardShortcuts);        
}

/***************************************************************************
 * WARFARIN
 */
/*
 * Module: warfarin.js
 * Version: 1.0
 * 
 * Description: This modules calculates warfarin dose based on INR results and INR target
 * 
 * Reference: http://www.aafp.org/fpm/2005/0500/p77.html
 * 
 * History: Original revision
 * 
 * API functions
 *      Warfarin.UI.initCalc1() - INR target of 2.0 - 3.0
 * 
 */


var Warfarin;

if (!Warfarin) {
    Warfarin = {};
} else {
    throw new Error('Warfarin already exists');
}

if (!Warfarin.UI) {
    Warfarin.UI = {};
} else {
    throw new Error('Warfarin.UI already exists');
}

Warfarin.dosingSchedule = {
    // "2.5": ["0.5","0","0","0","0","0","0"],
    // "5.0": ["0.5","0","0","0","0.5","0","0"],
    // "7.5": ["0.5","0","0.5","0","0.5","0","0"],
    "10.0": ["0.5","0","0.5","0","0.5","0","0.5"],
    "12.5": ["0.5","0","0.5","0","0.5","0.5","0.5"],
    "15.0": ["0.5","0","0.5","0.5","0.5","0.5","0.5"],
    "17.5": ["0.5","0.5","0.5","0.5","0.5","0.5","0.5"],
    "20.0": ["1","0.5","0.5","0.5","0.5","0.5","0.5"],
    "22.5": ["1","0.5","0.5","0.5","1","0.5","0.5"],
    "25.0": ["1","0.5","1","0.5","1","0.5","0.5"],
    "27.5": ["0.5","1","0.5","1","0.5","1","1"],
    "30.0": ["0.5","1","1","1","0.5","1","1"],
    "32.5": ["0.5","1","1","1","1","1","1"],
    "35.0": ["1","1","1","1","1","1","1"],
    "37.5": ["1.5","1","1","1","1","1","1"],
    "40.0": ["1.5","1","1","1","1.5","1","1"],
    "42.5": ["1.5","1","1.5","1","1.5","1","1"],
    "45.0": ["1","1.5","1","1.5","1","1.5","1.5"],
    "47.5": ["1","1.5","1.5","1.5","1","1.5","1.5"],
    "50.0": ["1","1.5","1.5","1.5","1.5","1.5","1.5"],
    "52.5": ["1.5","1.5","1.5","1.5","1.5","1.5","1.5"],
    "55.0": ["2","1.5","1.5","1.5","1.5","1.5","1.5"],
    "57.5": ["2","1.5","1.5","1.5","2","1.5","1.5"],
    "60.0": ["2","1.5","2","1.5","2","1.5","1.5"],
    "62.5": ["1.5","2","1.5","2","1.5","2","2"],
    "65.0": ["1.5","2","2","2.0","1.5","2","2"],
    "67.5": ["1.5","2","2","2","2","2","2"],
    "70.0": ["2","2","2","2","2","2","2"],
    "72.5": ["2.5","2","2","2","2","2","2"],
    "75.0": ["2.5","2","2","2","2.5","2","2"],
    "77.5": ["2.5","2","2.5","2","2.5","2","2"],
    "80.0": ["2","2.5","2","2.5","2","2.5","2.5"]
};

/*
 * getDoseString
 * 
 * Returns string with daily warfarin dosing based on a weekly dose
 */
Warfarin.getDoseString = function(dose) {
    var weeklySchedule, str;
    
    if (typeof dose == 'number') {
        dose = dose.toFixed(1);
    }
    
    if (!(dose in Warfarin.dosingSchedule)) {
        throw "getDoseString: Invalid dose: "+dose;
    }
    
    weeklySchedule = Warfarin.dosingSchedule[dose];
    
    str = 'Mon: '+weeklySchedule[0]+', ';
    str += 'Tue: '+weeklySchedule[1]+', ';
    str += 'Wed: '+weeklySchedule[2]+', ';
    str += 'Thr: '+weeklySchedule[3]+', ';
    str += 'Fri: '+weeklySchedule[4]+', ';
    str += 'Sat: '+weeklySchedule[5]+', ';
    str += 'Sun: '+weeklySchedule[6];
    
    return str;
};

/*
 * calcNewDose1
 * 
 * This function will calculate a new weekly warfarin dose and determine schedule
 * for next INR check INR goal of 2.0 - 3.0
 * Reference: http://www.aafp.org/fpm/2005/0500/p77.html
 * 
 * Reteruns
 * { 
 *      dose: - new weekly warfarin dose
 *      nextInr - num of days in which next INR should be drawn
 *      instructions - special instructiosn
 * }
 * 
 */
Warfarin.calcNewDose1 = function(inrRange, dose) {
    var newDose = {dose: null, instructions: null, nextInr: null};
    var min, max;

    if (typeof dose == 'number') {
        dose = dose.toFixed(1);
    }   
    
    if (!(dose in Warfarin.dosingSchedule)) {
        throw "getDoseString: Invalid dose: "+dose;
    }
    
    if (inrRange == '< 1.5') {
        // Increase dose by 10-20%;
        min = dose*1.10;
        max = dose*1.20;
        var a = Math.round(min/2.5)*2.5;
        var b = Math.round(max/2.5)*2.5;
        console.log(min+' '+max);
        console.log(a+' '+b);
        if (a > min) {
            newDose.dose = a;
        } else {
            newDose.dose = b;
        }
        newDose.nextInr = 7;
    } else if (inrRange == '1.5 - 1.9') {
        // Increase dose by 5-10%;
        min = dose*1.05;
        max = dose*1.10;
        var a = Math.round(min/2.5)*2.5;
        var b = Math.round(max/2.5)*2.5;
        console.log(min+' '+max);
        console.log(a+' '+b);
        if (a > min) {
            newDose.dose = a;
        } else {
            newDose.dose = b;
        }
        newDose.nextInr = 14;        
    } else if (inrRange == '2.0 - 3.0') {
        newDose.dose = dose;
        newDose.nextInr = 28;
    } else if (inrRange == '3.1 - 3.9') {
        // Decrease dose by 5-10%;
        min = dose*0.9;
        max = dose*0.95;
        var a = Math.round(min/2.5)*2.5;
        var b = Math.round(max/2.5)*2.5;
        console.log(min+' '+max);
        console.log(a+' '+b);
        if (b < max) {
            newDose.dose = b;
        } else {
            newDose.dose = a;
        }
        newDose.nextInr = 14;        
    } else if (inrRange == '4.0 - 4.9') {
        // Decrease dose by 10%;
        min = dose*0.9;
        newDose.dose = Math.round(min/2.5)*2.5;
        newDose.instructions = "Hold 1 dose";
        newDose.nextInr = 7;
    } else if (inrRange == '>= 5.0') {
        newDose.instructions = "Please check the protocol. Patient may need Vitamin K and/or ER evaluation";
    }
    
    return newDose;
};

/*****************
 * UI FUNCTION
 *****************/

Warfarin.UI.id = {
    dosing5mg: 'N_AFControl_4',
    currentWeeklyDose5mg: 'N_AFControl_5',
    currentWeeklyDoseText: 'N_AFControl_6',
    inrResult: 'N_AFControl_7',
    inrDate: 'N_AFControl_8_Date_dateInput',
    inrTime: 'N_AFControl_8_Time_dateInput',
    doseAdjustment: 'N_AFControl_9',
    newWeeklyDose5mg: 'N_AFControl_10',
    newWeeklyDoseText: 'N_AFControl_11',
    nextINRDate: 'N_AFControl_12_Date_dateInput',
    nextINRTime: 'N_AFControl_12_Time_dateInput',
    nextINRComment: 'N_AFControl_13',
    calcScore: 'calcScore',
    ref: 'ref',
    today: 'today',
    inrMsg: 'inrMsg'
};

Warfarin.UI.refURI = 'http://www.aafp.org/fpm/2005/0500/p77.html';

// Use with Healthand centriq and Use Telerik for time and date controls
Warfarin.UI.hl = true;


Warfarin.UI.isDosing5mg = function() {
    if ($('#'+Warfarin.UI.id.dosing5mg+' option:selected').text() == 'Yes') {
        return true;
    }
    
    return false;
};


/*
 * status - true or false
 */
Warfarin.UI.setDosing5mg = function(status) {
    var yes = $('#'+Warfarin.UI.id.dosing5mg+' option:eq(1)').val();
    var no = $('#'+Warfarin.UI.id.dosing5mg+' option:eq(2)').val();
    
    if (status) {
        $('#'+Warfarin.UI.id.dosing5mg).val(yes);
    } else {
        $('#'+Warfarin.UI.id.dosing5mg).val(no);
    }
};

/*
 * Returns current weekly dose base on 5 mg pills in string format
 */
Warfarin.UI.getCurrentWeeklyDose5mg = function() {
    var dose = $('#'+Warfarin.UI.id.currentWeeklyDose5mg+' option:selected').text();
    
    if (dose == '-select-') {
        return;
    } else {
        return dose.split(' ')[0];
    }
};

Warfarin.UI.setCurrentWeeklyDose5mg = function(dose) {
    var val, txt;
    
    dose = parseFloat(dose);
    
   for (var i = 0; i < $('#'+Warfarin.UI.id.currentWeeklyDose5mg+' option').length; i++) {
        txt = $('#'+Warfarin.UI.id.currentWeeklyDose5mg+' option:eq('+i+')').text();
        if (parseFloat(txt) == dose) {
            val = $('#'+Warfarin.UI.id.currentWeeklyDose5mg+' option:eq('+i+')').val();
            $('#'+Warfarin.UI.id.currentWeeklyDose5mg).val(val);
            break;
        }
    } 
};


Warfarin.UI.setCurrentWeeklyDose = function(dose) {
    $('#'+Warfarin.UI.id.currentWeeklyDoseText).val(dose);
};

Warfarin.UI.onCurrentWeeklyDose5mgChange = function() {
    if (!Warfarin.UI.isDosing5mg()) {
        return;
    }
   
    dose = Warfarin.UI.getCurrentWeeklyDose5mg();
    console.log(dose);
    if (dose) {
        Warfarin.UI.setCurrentWeeklyDose(Warfarin.getDoseString(dose));
    }    
};

/*
 * Returns current weekly dose base on 5 mg pills in string format
 */
Warfarin.UI.getNewWeeklyDose5mg = function() {
    var dose = $('#'+Warfarin.UI.id.newWeeklyDose5mg+' option:selected').text();
    
    if (dose == '-select-') {
        return;
    } else {
        return dose.split(' ')[0];
    }
};

Warfarin.UI.setNewWeeklyDose5mg = function(dose) {
    var val, txt;
    
    dose = parseFloat(dose);
    
   for (var i = 0; i < $('#'+Warfarin.UI.id.newWeeklyDose5mg+' option').length; i++) {
        txt = $('#'+Warfarin.UI.id.newWeeklyDose5mg+' option:eq('+i+')').text();
        if (parseFloat(txt) == dose) {
            val = $('#'+Warfarin.UI.id.newWeeklyDose5mg+' option:eq('+i+')').val();
            $('#'+Warfarin.UI.id.newWeeklyDose5mg).val(val);
            break;
        }
    } 
};

Warfarin.UI.onNewWeeklyDose5mgChange = function () {
    if (!Warfarin.UI.isDosing5mg()) {
        return;
    }
   
    dose = Warfarin.UI.getNewWeeklyDose5mg();
    console.log(dose);
    if (dose) {
        Warfarin.UI.setNewWeeklyDose(Warfarin.getDoseString(dose));
    }    
};

Warfarin.UI.setNewWeeklyDose = function(dose) {
    $('#'+Warfarin.UI.id.newWeeklyDoseText).val(dose);
};

Warfarin.UI.getINRResult = function() {
    return $('#'+Warfarin.UI.id.inrResult+' option:selected').text();
};

Warfarin.UI.setINRResult = function(index) {
    var tmp = $('#'+Warfarin.UI.id.inrResult+' option:eq('+index+')').val();
    
    $('#'+Warfarin.UI.id.inrResult).val(tmp);
};

Warfarin.UI.getINRDate = function() {
    var dateTxt, date;
    
    dateTxt = $('#'+Warfarin.UI.id.inrDate).val();
    
    return new Date(dateTxt);
};

Warfarin.UI.setINRDate = function(date) {
    console.log(date);
    if (Warfarin.UI.hl) {
        if (!(date instanceof Date)) {
            date = new Date(date);
        }
        var dCtl = $find(Warfarin.UI.id.inrDate);
        var tCtl = $find(Warfarin.UI.id.inrTime);
        dCtl.set_selectedDate(date);
        tCtl.set_selectedDate(date);
    } else {
        if (date instanceof Date) {
            $('#'+Warfarin.UI.id.inrDate).val(date.toLocaleDateString()).change();
        } else {
            $('#'+Warfarin.UI.id.inrDate).val(date).change();
        }
    }
};

Warfarin.UI.getDoseAdjustment = function() {
    var yes = $('#'+Warfarin.UI.id.doseAdjustment+' option:eq(1)').val();
    
    return ($('#'+Warfarin.UI.id.doseAdjustment+' option:selected').val() == yes);
};

Warfarin.UI.setDoseAdjustment = function(status) {
    var yes = $('#'+Warfarin.UI.id.doseAdjustment+' option:eq(1)').val();
    var no = $('#'+Warfarin.UI.id.doseAdjustment+' option:eq(2)').val();
    
     $('#'+Warfarin.UI.id.doseAdjustment).val(status ? yes : no);
};

Warfarin.UI.getNextINRDate = function() {
    var dateTxt, date;
    
    dateTxt = $('#'+Warfarin.UI.id.nextINRDate).val();
    
    return new Date(dateTxt);    
};

Warfarin.UI.setNextINRDate = function(date) {
    console.log(date);
    if (Warfarin.UI.hl) {
        if (!(date instanceof Date)) {
            date = new Date(date);
        }
        var dCtl = $find(Warfarin.UI.id.nextINRDate);
        var tCtl = $find(Warfarin.UI.id.nextINRTime);
        dCtl.set_selectedDate(date);
        tCtl.set_selectedDate(date);
    } else {
        if (date instanceof Date) {
            $('#'+Warfarin.UI.id.nextINRDate).val(date.toLocaleDateString()).change();
        } else {
            $('#'+Warfarin.UI.id.nextINRDate).val(date).change();
        }
    }
};

Warfarin.UI.getNextINRDateComment = function() {
    return  $('#'+Warfarin.UI.id.nextINRComment).val();
};

Warfarin.UI.setNextINRDateComment = function(text) {
    $('#'+Warfarin.UI.id.nextINRComment).val(text);
};

Warfarin.UI.clearNewWekklyDose = function() {
    var val = $('#'+Warfarin.UI.id.newWeeklyDose5mg+' option:eq(0)').val();
    $('#'+Warfarin.UI.id.newWeeklyDose5mg).val(val);
    Warfarin.UI.setNewWeeklyDose('');
    Warfarin.UI.setDoseAdjustment(true);
    Warfarin.UI.setNextINRDate('');
    Warfarin.UI.setNextINRDateComment('');
};

Warfarin.UI.addINRButton1 = function() {
    $('#'+Warfarin.UI.id.newWeeklyDose5mg).after('<input id="'+Warfarin.UI.id.calcScore+'" type="button" value="Calculate Score">');
    $('#'+Warfarin.UI.id.calcScore).bind('click', Warfarin.UI.calcINR1);    
};

Warfarin.UI.addRefButton = function() {
    $('#'+Warfarin.UI.id.calcScore).after('<input id="'+Warfarin.UI.id.ref+'" type="button" value="Reference">');
    $('#'+Warfarin.UI.id.ref).bind('click', Warfarin.UI.onRef);
};

Warfarin.UI.addTodayButton = function() {
    // $('#'+Warfarin.UI.id.inrDate).before('<input id="'+Warfarin.UI.id.today+'" type="button" value="Today">');
    $('#N_AFControl_8_Time_wrapper').after('<input id="'+Warfarin.UI.id.today+'" type="button" value="Today">');
    $('#'+Warfarin.UI.id.today).bind('click', Warfarin.UI.onToday);
};

Warfarin.UI.calcINR1 = function() {
    var dose, doseText, inrRange, newDose, inrDate;
    
    if (!Warfarin.UI.isDosing5mg()) {
        Warfarin.UI.msgInr('To use dosing calculator you must use 5 mg dosing schedule.');
        return;
    }
    
    dose = Warfarin.UI.getCurrentWeeklyDose5mg();
    if (dose == '-select-') {
        Warfarin.UI.msgInr('You must select current dose.');
        return;        
    }
    
    inrRange = Warfarin.UI.getINRResult();
    if (inrRange == '-select-') {
        Warfarin.UI.msgInr('You must select INR result.');
        return;        
    }

    newDose = Warfarin.calcNewDose1(inrRange, dose);
    if (newDose.dose) {
        Warfarin.UI.setNewWeeklyDose5mg(newDose.dose);
        if (newDose.instructions) {
            doseText = newDose.instructions+' then\n';
            doseText += Warfarin.getDoseString(newDose.dose);
        } else {
            doseText = Warfarin.getDoseString(newDose.dose);
        }
        if (newDose.dose-dose > 0) {
            doseText += '\nIncrease: ';
            doseText += ((newDose.dose-dose)/dose*100).toFixed(1)+'%';
        } else if(newDose.dose-dose < 0)  {
            doseText += '\nDecrease: ';
            doseText += ((dose-newDose.dose)/dose*100).toFixed(1)+'%';
        }
        Warfarin.UI.setNewWeeklyDose(doseText);
        
        Warfarin.UI.setDoseAdjustment(dose != newDose.dose);
        if (newDose.nextInr) {
            Warfarin.UI.setNextINRDateComment('Check INR in '+newDose.nextInr+' days');
            inrDate = Warfarin.UI.getINRDate();
            if (inrDate.valueOf() !== NaN) {
                inrDate.setDate(inrDate.getDate()+newDose.nextInr);
                Warfarin.UI.setNextINRDate(inrDate);
            }
            
        }
    } else {
        Warfarin.UI.clearNewWekklyDose();
        Warfarin.UI.msgInr(newDose.instructions);
        return;
    }
};

Warfarin.UI.onRef = function() {
    var win = window.open(Warfarin.UI.refURI);
    win.focus();     
};

Warfarin.UI.onToday = function() {
    Warfarin.UI.setINRDate(new Date());
};

Warfarin.UI.msgInr = function(txt) {
    $('#'+Warfarin.UI.id.inrMsg).dialog('option', 'title', 'INR Message');
    if (typeof txt == 'string') {
        $('#'+Warfarin.UI.id.inrMsg).text(txt);
    }
    $('#'+Warfarin.UI.id.inrMsg).dialog('open');    
};

Warfarin.UI.initINRCalc1 = function() {
    Warfarin.UI.addINRButton1();
    Warfarin.UI.addRefButton();
    Warfarin.UI.addTodayButton();
    
    $('#'+Warfarin.UI.id.currentWeeklyDose5mg).bind('change', Warfarin.UI.onCurrentWeeklyDose5mgChange);
    $('#'+Warfarin.UI.id.newWeeklyDose5mg).bind('change', Warfarin.UI.onNewWeeklyDose5mgChange);
       
    $('<div id="inrMsg"></div>').appendTo('body').dialog({autoOpen: false});
    
    /*
     * Testing initalization
     */
    Warfarin.UI.setDosing5mg(true);
    Warfarin.UI.setCurrentWeeklyDose5mg(30);
    Warfarin.UI.setCurrentWeeklyDose(Warfarin.getDoseString(30));
    Warfarin.UI.setINRResult(3);
    Warfarin.UI.setINRDate(new Date());
};