/**
 * 住院医生站ip地址
 * @type {string}
 */
var checkServerIpInHos = "10.10.9.66";
/**
 * 住院医生站端口号
 * @type {string}
 */
var checkServerPortInHos = "9010";
/**
 * 门诊医生站ip地址
 * @type {string}
 */
var checkServerIpOutHos = "10.10.9.66";
/**
 * 门诊医生站端口号
 * @type {string}
 */
var checkServerPortOutHos = "8010";
/**
 * 说明书地址
 * @type {string}
 */
var disUrl = 'http://10.10.9.66:8221/drugs/@code@?show_navbar=true&amp;show_header=true';

/**
 * 在处方预审前，是否需要弹窗填充患者的身高、体重、妊娠等信息<br/>
 * 如果需要，配置为true，否则，配置为false<br/>
 * <b>配置为true时</b>，在处方预审前，首先会调用后台接口，根据处方中包含的药品信
 * 息，判断是否需要补全患者的身高、体重等信息。<br/>
 * 如果需要，则弹窗，由医生手动将患者的身高体重等信息录入，填充到处方
 * 中，再去执行预审逻辑。<br/>
 * 如果不需要，则不弹窗，直接执行预审逻辑。
 *
 * @type {boolean}
 *
 * @see DoctorCheck
 */
var fillInfoBeforeCheck = false;

/********************************************************************
 ************************* 以下内容请勿随意改动 *************************
 ********************************************************************/
/**
 * 当前JS文件的版本号
 * @type {string}
 */
var tjJsVersion = "v20230131";

/**
 * 医生站程序的域名
 * @type {string}
 */
var tjContext = "DCStation";

/**
 * 请求医生站接口时，允许等待的最大超时时间(单位：毫秒，默认值：5000)<br/>
 * 如果医生站程序在指定时间内没有响应，则中断请求
 * @type {number}
 */
var timeStrapDoc = 5000;
/**
 * 请求药师站接口时，允许等待的最大超时时间(单位：毫秒，默认值：5000)<br/>
 * 如果药师站程序在指定时间内没有响应，则中断请求
 * @type {number}
 */
var timeStrapPhar = 5000;

/**
 * 记录当前访问的医生站IP地址。<b>请不要手动修改此字段<b/>
 *
 * @see checkServerIpOutHos
 * @see checkServerIpInHos
 * @see setInHosFlag
 */
var checkServerIp;

/**
 * 记录当前访问的医生站端口号。<b>请不要手动修改此字段<b/>
 *
 * @see checkServerPortOutHos
 * @see checkServerPortInHos
 * @see setInHosFlag
 */
var checkServerPort;

/**
 * 获取界面元素的锚点
 *
 * @see findCheckResultDiv
 */
var TJAnchorPoint = "";

/**
 * 医生站预审问题展示界面
 * @type {string}
 */
var checkResultTemp =
    '<div id="tj_bg" style="display: none;position: absolute;top: 0%;left: 0%;width: 100%;' +
    'height: 100%;background-color: black;z-index: 1001; -moz-opacity: 0;opacity: 0;' +
    'filter: alpha(opacity=0);"></div>' +
    '<div id="tj_show" style=" box-sizing:content-box;display: none;cursor:move;position: absolute;margin:auto;' +
    'top: 50%; left: 50%; margin-top:-290px;margin-left:-500px;width: 1000px;' +
    'height: 580px;background-color:#fafafa;border-radius:8px;z-index: 1002;' +
    '">' +
    '<iframe id="tj_iframe" src="about:blank" name="showPlace" frameborder=0 height=580 width=1000 marginheight=0 marginwidth=0 scrolling=no></iframe>' +
    '</div>' +
    '<a style="display: none" id="checkResultButton" href="@(url)" target="showPlace">在左框中打开链接</a>';

/**
 * 药师站审核结果展示界面
 * @type {string}
 */
var pharmacistCheckResultTemp =
    '<div id="tj_bg" style="display: none;cursor:move;position: absolute;top: 0%;left: 0%;width: 100%;' +
    'height: 100%;background-color: black;z-index: 1001; -moz-opacity: 0;opacity: 0;' +
    'filter: alpha(opacity=0);"></div>' +
    '<div id="tj_show" style=" box-sizing:content-box;display: none;position: absolute;margin:auto;' +
    'top: 50%; left: 50%; margin-top:-290px;margin-left:-500px;width: 1000px;' +
    'height: 700px;padding: 8px;border: 8px solid #E8E9F7;background-color: white;z-index: 1002;' +
    '">' +
    '<iframe id="tj_iframe" src="about:blank" name="showPlace" frameborder=0 height=700 width=1000 marginheight=0 marginwidth=0 scrolling=no></iframe>' +
    '</div>' +
    '<a style="display: none" id="checkResultButton" href="@(url)" target="showPlace">在左框中打开链接</a>';

/**
 * 身高体重数据补全界面
 * @type {string}
 */
var checkFillInfoTemp =
    '<div id="tj_bg" style="display: none;cursor:move;position: absolute;top: 0%;left: 0%;width: 100%;' +
    'height: 100%;background-color: black;z-index: 1001; -moz-opacity: 0;opacity: 0;' +
    'filter: alpha(opacity=0);"></div>' +
    '<div id="tj_show" style=" box-sizing:content-box;display: none;position: absolute;margin:auto;' +
    'top: 50%; left: 50%; margin-top:-195px;margin-left:-210px;width: 420px;' +
    'height: 390px;padding: 8px;border: 8px solid #E8E9F7;background-color: white;z-index: 1002;' +
    '">' +
    '<iframe src="about:blank" name="showPlace" frameborder=0 height=390 width=420 marginheight=0 marginwidth=0 scrolling=no></iframe>' +
    '</div>' +
    '<a style="display: none" id="checkResultButton" href="@(url)" target="showPlace">在左框中打开链接</a>';

/**
 * 记录HIS提供的回调函数。<br/>
 * 该函数将在审核通过后被回调。称作：下一步函数
 *
 * @see global_next_func_args
 * @see execHisNextFunction
 */
var global_next_func_name;
/**
 * HIS提供的“下一步函数”的参数。<br/>
 * 该参数会在审核通过后，回调“下一步函数”时，作为函数的第一个参数返回
 *
 * @see global_next_func_name
 * @see execHisNextFunction
 */
var global_next_func_args;
/**
 * 记录HIS提供的回调函数。<br/>
 * 该函数将在审核未通过（医生选择返回修改）时被回调。称作：返回修改函数
 *
 * @see global_back_func_args
 * @see execHisBackFunction
 */
var global_back_func_name;
/**
 * HIS提供的“返回修改函数”的参数。<br/>
 * 该参数会在审核未通过（医生选择返回修改），回调“返回修改函数”时，作为函数的第一个参数返回
 */
var global_back_func_args;
/**
 * 记录处方标识。<br/>
 * 在处方预审结束后，如果处方存在问题，则需要弹窗展示预审结果。此时，将处方的标识记录到该字段。<br/>
 * 弹窗后，JS中会开启一个轮询函数，调用后台接口，通过该字段记录的标识去查询医生在弹窗中所作的操作（“返回修改”或“下一步”）。
 *
 * @see DoctorCheckForChrome
 * @see checkIsQuit
 *
 * @type {string}
 */
var presId;
/**
 *
 * @see DoctorCheckForChrome
 * @see checkIsQuit
 *
 * @type {null}
 */
var checkIsQuitState = null;
/**
 *
 * @see DoctorCheck
 * @see checkFillInfoIsQuit
 *
 * @type {null}
 */
var checkFillInfoQuitState = null;
var t1;

/**
 * 测试普通的审核模式
 * @param tag 1：预审；2：提交；
 * @param inHosFlag 门诊住院标识
 */
function testCheck(tag, inHosFlag) {
    var dcdtXml = document.getElementById("dcdt").value;
    var value = DoctorCheck(tag, dcdtXml, test_next, '继续保存', test_back, '返回修改', inHosFlag);
    console.log('DoctorCheck()函数的返回值：' + value);
}

/**
 * 中山七院审核模式测试接口<br/>
 *
 * @param tag
 * @param inHosFlag
 *
 * @deprecated 已过时。测试接口请访问{@link testCheck}
 */
function testZSQY(tag, inHosFlag) {
    alert('中山七院审核模式仅支持dcdt_IE.js');
}

/**
 * 江苏省中模式测试接口
 * 江苏省中模式，策略字段strategy值为3
 * 该策略需要：
 *  1. 生成详尽的审核结果；
 *  2. 审核结果作为回调函数的第二个参数返回给HIS
 *
 *  @deprecated 已过时。测试接口请访问{@link testCheck}
 */
function testJSSZ(tag, inHosFlag) {
    var dcdtXml = document.getElementById("dcdt").value;
    var result = DoctorCheck(tag, dcdtXml, test_next, '继续保存', test_back, '返回修改', inHosFlag, 3);
    console.log("DoctorCheck返回值：" + result);
}

/**
 * 供HIS调用的审核接口<br/>
 *
 * @param tag 预审：1，提交：2
 * @param xml 处方xml
 * @param next_func_name 审核通过后调用的回调函数名称。称作：下一步函数。
 * @param next_fun_args “下一步函数”的参数。审核通过后，回调“下一步函数”时，该参数会作为回调函数的第一个参数返回
 * @param back_func_name 审核未通过（医生返回修改）时调用的回调函数名称。称作：返回修改函数
 * @param back_func_args “返回修改函数”的参数。审核未通过，回调“返回修改函数”时，该参数会作为回调函数的第一个参数返回
 * @param inHosFlag 门诊住院标识。门诊：0，住院：1。如果不传，默认为1
 * @returns {number|*} 错误码。门诊住院标识错误：-4，访问医生站程序失败：-3，访问中间层程序失败：-2。如果正常审核，则返回undefined
 */
function DoctorCheck(tag, xml, next_func_name, next_fun_args, back_func_name, back_func_args, inHosFlag) {
    if(setInHosFlag(inHosFlag) == -4) {
        return -4;
    }

    // 将HIS传递进来的回调函数及其参数赋值到全局变量
    loacl_next_func(next_func_name, next_fun_args, back_func_name, back_func_args);

    //tag不为1（不是预审）时，不需要执行补全身高体重的逻辑，直接调用审核接口。
    if(tag != 1) {
        return DoctorCheckForChrome(tag, xml);
    }

    // 如果不需要补充患者的身高体重等信息，直接执行预审操作
    if (fillInfoBeforeCheck == undefined || !fillInfoBeforeCheck) {
        return DoctorCheckForChrome(tag, xml);
    }

    // 请求后台接口，判断是否需要弹窗补全身高体重等信息
    var url = getSendFillInfo();
    var data = "xml=" + encodeURIComponent(xml) + '&' + 'tag=' + tag;
    var resultData = sendAjaxRequestForDoc(data, url);
    if(resultData == -3) {
        return -3;
    }
    var isFillInfo = JSON.parse(resultData);
    if(isFillInfo.flag) {//连接成功
        if(isFillInfo.data.show){//弹框补全患者信息
            var pageUrl = getCheckFillInfoUrl(isFillInfo.data);
            drawCheckFillInfoElem(pageUrl);
            // 不断轮询判断此key是否信息补全成功，若成功继续执行其他步骤
            var isFillKey = isFillInfo.data.key;
            checkFillInfoQuitState = window.setInterval(function() {
                checkFillInfoIsQuit(isFillKey,tag,xml, strategy)
            },1000);
        }else{//无需补全患者信息
            return DoctorCheckForChrome(tag, xml);
        }
    }else{
        alert(isFillInfo.message)
    }
}

/**
 * 根据门诊、住院标识，将门诊医生站或住院医生站的IP以及端口赋值给全局变量
 * @param inHosFlag 门诊、住院标识。门诊为0、住院为1。如果不传，默认为1
 * @return {number} 正常返回0，如果门急诊住院标识不正确，则返回-4
 */
function setInHosFlag(inHosFlag) {
    if (inHosFlag == undefined) {
        inHosFlag = 1;
    }

    if (inHosFlag == 0) {
        checkServerIp = checkServerIpOutHos;
        checkServerPort = checkServerPortOutHos;
        return 0;
    }
    if (inHosFlag == 1) {
        checkServerIp = checkServerIpInHos;
        checkServerPort = checkServerPortInHos;
        return 0;
    }
    return -4;
}

/**
 * 将HIS传递过来的回调函数赋值到全局变量
 * @param next_func_name 执行下一步时，调用的函数。
 * @param next_func_args 下一步函数所需要的参数
 * @param back_func_name 执行返回修改时，调用的函数
 * @param back_func_args 返回函数所需要的参数
 */
function loacl_next_func(next_func_name, next_func_args, back_func_name, back_func_args) {
    global_next_func_name = eval(next_func_name);
    global_next_func_args = next_func_args;
    global_back_func_name = eval(back_func_name);
    global_back_func_args = back_func_args;
}

function checkFillInfoIsQuit(key,tag,xml, strategy) {
    var url = assemble("/submit/status/" + key);
    var xmlhttp = initXmlHttp();
    var data='';
    xmlhttp.open("POST", url, false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
    xmlhttp.send(data);
    var checkData = xmlhttp.responseText;
    checkData = JSON.parse(checkData);
    if (checkData.flag && checkData.data) {
        window.clearInterval(checkFillInfoQuitState);
        hidediv();
        DoctorCheckForChrome(tag, xml, strategy);
    }
}

function getRetValUrl() {
    return assemble("/submit/getRetValue");
}

/**
 * 查询医生在审核结果界面上所执行的操作的接口<br/>
 * 操作包括：
 * <pre>
 *     1. 返回修改
 *     2. 下一步
 * </pre>
 * 两种操作均会导致审核结果界面关闭。
 * @returns {string} 接口地址
 */
function getActionUrl() {
    return assemble("/audit/action");
}

/**
 * 轮询检测审核结果界面是否已经关闭<br/>
 */
function checkIsQuit() {
    // 获取医生的操作
    var url = getActionUrl();
    var data = presId;
    var xmlhttp = initXmlHttp();
    xmlhttp.open("POST", url, false);
    xmlhttp.setRequestHeader("Content-type", "text/html;charset=UTF-8");
    xmlhttp.send(data);
    var checkData = xmlhttp.responseText;
    checkData = eval("(" + checkData + ")");
    if (checkData.data != null) {
        var checkResult = getCheckResult(data);
        if (checkData.data == 0) {//审核通过，允许发药
            window.clearInterval(checkIsQuitState);
            check_for_next(checkResult);
        } else if (checkData.data == -1 || checkData.data == -2) {//拒绝，不允许发药
            window.clearInterval(checkIsQuitState);
            check_for_back(checkResult);
        }
    }
}

/**
 * 根据处方ID获取审核结果
 * @param presId 处方ID
 * @return
 */
function getCheckResult(presId) {
    var xmlHttp = initXmlHttp();
    xmlHttp.open("POST", getRetValUrl(), false);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
    xmlHttp.send('presId=' + presId);
    return xmlHttp.responseText;
}

/**
 * 初始化XMLHttpRequest对象
 * @return {XMLHttpRequest}
 */
function initXmlHttp() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        //  IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return xmlhttp;
}

function tj_ajax(xmlhttp, _method, _url, _param, _callback) {
    if (typeof xmlhttp == 'undefined')
        return;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            _callback(xmlhttp);
        }
    };
    xmlhttp.open(_method, _url, false);
    if (_method == "POST") {
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
        xmlhttp.send(_param);
    } else {
        xmlhttp.send(null);
    }
}

function sendAjaxRequestForDoc(data, url) {
    var xmlhttp = initXmlHttp();

    var t1;
    function adduserok(xmlhttp) {
        if (t1)
            clearTimeout(t1);
    }
    function connecttoFail() {
        if (xmlhttp)
            xmlhttp.abort();
        // alert("请求服务超时！");
    }
    if(xmlhttp) {
        t1 = setTimeout(connecttoFail, timeStrapDoc);
        try {
            tj_ajax(xmlhttp, "POST", url, data, adduserok);
        }catch (e){
            return -3;
        }
    }else {
        alert("Init xmlhttprequest fail");
    }

    return xmlhttp.responseText;
}

function sendAjaxRequestForPhar(data, url) {
    var xmlhttp = initXmlHttp();

    function adduserok(xmlhttp) {
        if (t1)
            clearTimeout(t1);
    }
    function connecttoFail() {
        if (xmlhttp)
            xmlhttp.abort();
    }
    if(xmlhttp) {
        t1 = setTimeout(connecttoFail, timeStrapPhar);
        try {
            tj_ajax(xmlhttp, "POST", url, data, adduserok);
        }catch (e){
            return -3;
        }
    }else {
        alert("Init xmlhttprequest fail");
    }

    return xmlhttp.responseText;
}

// region 实时审核链接地址相关函数

/**
 * 判断是否需要补全身高体重的链接
 * @return {string}
 */
function getSendFillInfo() {
    return assemble("/submit/fillInfo");
}

/**
 * 补全身高体重界面的链接地址
 * @param data 界面所需参数
 * @return {string}
 */
function getCheckFillInfoUrl(data) {
    return assemble("/submit/fillInfoPage?key=" + data.key + "&tag="+ data.tag);
}

/**
 * 实时审核中，预审处方以及提交处方的链接
 * @return {string}
 */
function getSendCheckUrl() {
    return assemble("/submit/sendCheck");
}

/**
 * 预审结果页面的链接地址。
 * 在预审发现问题时，需要弹出该界面。
 * @param check 预审结果，其中包括处方ID、以及预审是否发现问题
 * @return {string}
 */
function getCheckResultPageUrl(check) {
    return assemble("/submit/checkResultPage?presId=" + check.presId + '&browser=Chrome&random=' + Math.random());
}

// endregion

// region 滨医模式实时审核链接地址相关

// endregion

/**
 * xml传给后台，查询处方是否有问题，无问题给his返回数字，有问题进行下一步操作
 * @param tag
 * @param xml
 * @returns {number|*}
 * @constructor
 */
function DoctorCheckForChrome(tag, xml) {
    var data = "xml=" + encodeURIComponent(xml) + '&tag=' + tag;
    var url = getSendCheckUrl();
    var checkData = sendAjaxRequestForDoc(data, url);
    if(checkData == -3){
        return -3;
    }
    var check = eval("(" + checkData + ")");
    if(check.hasProblem == -2){
        // alert("请求中间层服务异常！");
        return -2;
    }else if (tag == 2) {
        if(t1){
            clearTimeout(t1);
        }
        return check.retValue;
    } else if (check.hasProblem == 0) {//处方无问题
        if(t1){
            clearTimeout(t1);
        }
        nextWithoutError(check.retValue);//his逻辑
    } else if (check.hasProblem == 1) {//处方有问题
        if(t1){
            clearTimeout(t1);
        }
        var url = getCheckResultPageUrl(check);
        presId = check.presId;
        drawCheckResultElem(url);//弹框内容checkResultPage.jsp界面
        checkIsQuitState = window.setInterval("checkIsQuit()", 500);//轮询实时取干预结果
    }
}

function showdiv() {
    findElementById("tj_bg").style.display = "block";

    var box = findElementById("tj_show");
    box.style.display = "block";

    // 将值存在自定义属性上
    box.onmousedown = down;

    function move(ev) {
        // 随时获取当前鼠标的信息，计算盒子的最新位置
        var curL = ev.pageX - this.startX + this.startL,
            curT = ev.pageY - this.startY + this.startT;
        var HTML = document.documentElement,
            minL = 0,
            minT = 0,
            maxL = HTML.clientWidth - this.offsetWidth,
            maxT = HTML.clientHeight - this.offsetHeight;

        // 边界判断 (0,HTML.clientWidth - this.offsetWidth)
        // (0,HTML.clientHeight - this.offsetHeight)
        curL = curL < minL ? minL : (curL > maxL ? maxL : curL);
        curT = curT < minT ? minT : (curT > maxT ? maxT : curT);
        this.style.left = curL + 500 + "px";
        this.style.top = curT+ 290 + "px";
    }

    function down(ev) {
        // 存储鼠标起始位置的信息和盒子的起始位置存储在盒子的自定义属性上
        this.startX = ev.pageX;
        this.startY = ev.pageY;
        this.startL = this.offsetLeft;
        this.startT = this.offsetTop;
        // 鼠标按下的时，给mousemove和mouseup绑定方法
        // 使用bind绑定this为当前元素
        document.onmousemove = move.bind(this);
        document.onmouseup = up.bind(this);
        // this.setCapture(); // chrome不支持

        var iframDiv = findElementById("tj_iframe");
        iframDiv.style.pointerEvents = "none";

    }

    function up(ev) {
        // 鼠标抬起，将move和up的方法绑定的方法移除
        document.onmousemove = null;
        document.onmouseup = null;
        var iframDiv = findElementById("tj_iframe");
        iframDiv.style.pointerEvents = "auto";
    }

}

function hidediv() {
    findElementById("tj_bg").style.display = "none";
    findElementById("tj_show").style.display = "none";
}

/**
 * 查找名称为<tt>checkResult</tt>的div
 * @returns {HTMLElement} div
 */
function findCheckResultDiv() {
    var element = document.getElementById("checkResult");
    if (element != null) {
        return element;
    }
    element = parent.document.getElementById("checkResult");
    if (element != null) {
        TJAnchorPoint = parent;
        return element;
    }
    console.log("没有查找到ID为checkResult的div");
}

/**
 * 通过ID获取元素，优先通过锚点获取，如果锚点不存在，则在当前容器中获取
 * @param id ID
 * @returns {HTMLElement} 元素
 */
function findElementById(id) {
    if (TJAnchorPoint != "") {
        // 通过锚点获取
        return TJAnchorPoint.document.getElementById(id);
    }
    // 默认在当前容器中获取
    return document.getElementById(id);
}

/**
 * 绘制补全身高体重的界面
 * @param url 补全身高体重的界面地址
 */
function drawCheckFillInfoElem(url) {
    var checkFillInfoElem = findCheckResultDiv();
    checkFillInfoElem.innerHTML = checkFillInfoTemp.replace('@(url)', url);
    findElementById("checkResultButton").click();
    findElementById("tj_bg").style.display = "block";
    findElementById("tj_show").style.display = "block";
}

/**
 * 绘制审核结果展示界面
 * @param url 审核结果展示界面的地址
 */
function drawCheckResultElem(url) {
    var checkResultElem = findCheckResultDiv();
    checkResultElem.innerHTML = checkResultTemp.replace('@(url)', url);
    findElementById("checkResultButton").click();
    showdiv();
}

/**
 * 当HIS传递过来的处方预审没有发现问题时，调用。
 * 执行HIS传过来的下一步函数
 *
 * @param checkResult 审核结果
 *
 * @see execHisNextFunction
 */
function nextWithoutError(checkResult) {
    // 执行HIS的下一步函数，将审核结果传递过去
    execHisNextFunction(checkResult);
}

/**
 * 医生点击下一步时调用
 * 流程如下：
 *  1. 预审发现问题
 *  2. 医生在预审结果界面，点击继续保存按钮
 *  3. 药师不在线或干预超时，执行该函数。或者在干预过程中，医生点击下一步保存处方
 * @param checkResult 审核结果
 */
function check_for_next(checkResult) {
    hidediv();
    execHisNextFunction(checkResult);
}

/**
 * 执行HIS传递过来的下一步函数
 *
 * @see global_back_func_name
 * @see global_next_func_args
 *
 * @param checkResult 审核结果
 *
 */
function execHisNextFunction(checkResult) {
    global_next_func_name(global_next_func_args, checkResult);
}

/**
 * 医生执行返回修改时调用<br/>
 * 以下场景会触发该函数：
 * <pre>
 *     1. 预审中发现处方存在问题，医生直接执行“返回修改”
 *     2. 预审发现问题，医生将处方提交给药师审核，审核未通过，医生执行“返回修改”
 * </pre>
 * @param checkResult
 */
function check_for_back(checkResult) {
    hidediv();
    execHisBackFunction(checkResult);
}

/**
 * 执行HIS传递过来的返回修改函数<br/>
 *
 * @see global_back_func_name
 * @see global_back_func_args
 *
 * @param checkResult 审核结果
 *
 */
function execHisBackFunction(checkResult) {
    global_back_func_name(global_back_func_args, checkResult);
}

function test_next(val, checkResult) {
    var info = appendAlertInfo("next", val, checkResult);
    console.log(info);
    alert(info);
}

function test_back(val, checkResult) {
    var info = appendAlertInfo("back", val, checkResult);
    console.log(info);
    alert(info);
}

/**
 * 拼接打印结果。测试用
 * @param fun 函数标识
 * @param args 参数
 * @param checkResult 审核结果
 * @return {string}
 */
function appendAlertInfo(fun, args, checkResult) {
    var newline = '\r\n';
    return fun + newline
        + "函数参数 -> " + args + newline
        + "审核结果 -> " + checkResult;
}

function openDiscribLinked(code) {
    var urlTemp = disUrl.replace("@code@", code);
        //获得窗口的垂直位置 
        let iWidth = 800
        let iHeight = 600
        var iTop = (window.screen.availHeight - 30 - iHeight) / 2; 
        //获得窗口的水平位置 
        var iLeft = (window.screen.availWidth - 10 - iWidth) / 2; 
        window.open(urlTemp, '药品说明书', 'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,titlebar=no')
    // window.open(urlTemp, '药品说明书', ' left=0,top=0,width=' + (screen.availWidth - 10) + ',height=' + (screen.availHeight - 50) + ',scrollbars,resizable=yes,toolbar=no,alwaysRaised=yes,z-look=yes');
}

function testPharmacistCheck(inHosFlag) {
    var tag = 1;
    var patientID = document.getElementById("patientID").value;
    var visitDate = document.getElementById("visitDate").value;
    var pharmacistInfo = document.getElementById("pharmacistInfo").value;
    var dcdtXml = document.getElementById("dcdt").value;
    var retValue = PharmacistCheck(tag, patientID, visitDate, pharmacistInfo, dcdtXml, test_pharmacistNext, 1, test_pharmacistBack, 2, inHosFlag);
    console.log("药师站接口返回值：" + retValue);
    if (retValue == -2
        || retValue == -3
        || retValue == -4) {
        alert("药师站接口返回值：" + retValue);
    }
}
function testPharmacistCheckSilent(inHosFlag) {
    var tag = 1;
    var patientID = document.getElementById("patientID").value;
    var visitDate = document.getElementById("visitDate").value;
    var pharmacistInfo = document.getElementById("pharmacistInfo").value;
    var dcdtXml = document.getElementById("dcdt").value;
    var retValue = PharmacistCheckSilent(tag, patientID, visitDate,pharmacistInfo, dcdtXml, test_pharmacistNext, 1, test_pharmacistBack, 2, inHosFlag);
    alert(retValue);
}

function PharmacistCheck(tag, patientID, visitDate, pharmacistInfo, xml, next_func_name, next_fun_args, back_func_name, back_func_args, inHosFlag) {
    if (setInHosFlag(inHosFlag) == -4) {
        return -4;
    } else {
        local_next_func_pharmacist(next_func_name, next_fun_args, back_func_name, back_func_args);
        return PharmacistCheckForChrome(tag, patientID, visitDate, pharmacistInfo, xml);
    }
}

function PharmacistCheckSilent(tag, patientID, visitDate, pharmacistInfo, xml, next_func_name, next_fun_args, back_func_name, back_func_args, inHosFlag) {
    if(setInHosFlag(inHosFlag) == -4){
        return -4;
    }else {
        local_next_func_pharmacist(next_func_name, next_fun_args, back_func_name, back_func_args);
        return PharmacistCheckSilentForChrome(tag, patientID, visitDate, pharmacistInfo, xml);
    }
}

function PharmacistCheckForChrome(tag, patientID, visitDate, pharmacistInfo, xml) {
    var data = "xml=" + encodeURIComponent(xml) + '&' + 'tag=' + tag + '&' + 'patientID=' + patientID + '&' + 'visitDate=' + visitDate + '&' + 'pharmacistInfo=' + pharmacistInfo;
    var url = assemble("/pharmacistSubmit/sendPharmacistCheck");
    var checkData = sendAjaxRequestForPhar(data, url);
    if(checkData == -3){
        return -3;
    }

    var check = eval("(" + checkData + ")");

    if(check.hasProblem == -2) {
        return -2;
    }else if (check.hasProblem == 0) {
        if(t1){
            clearTimeout(t1);
        }
        pharmacistNextWithoutError();
    } else {
        if(t1){
            clearTimeout(t1);
        }
        pharmacist_presId = check.presId;
        drawPharmacistCheckResultElem(assemble("/pharmacistSubmit/" + check.checkResultPage + "?presId=" + check.presId + '&random=' + Math.random()));
        pharmacistCheckIsQuitState = window.setInterval("pharmacistCheckIsQuit()", 500);
    }
}

function PharmacistCheckSilentForChrome(tag, patientID, visitDate, pharmacistInfo, xml) {
    var data = "xml=" + encodeURIComponent(xml) + '&' + 'tag=' + tag + '&' + 'patientID=' + patientID + '&' + 'visitDate=' + visitDate + '&' + 'pharmacistInfo=' + pharmacistInfo;
    var url = assemble("/pharmacistSubmit/sendPharmacistCheck");
    var checkData = sendAjaxRequestForPhar(data, url);
    if(checkData == -3){
        return -3;
    }

    var check = eval("(" + checkData + ")");
    if(check.hasProblem == -2){
        return -2;
    }else {
        if(t1){
            clearTimeout(t1);
        }
        return check.hasProblem;
    }
}

function drawPharmacistCheckResultElem(url) {
    var checkResultElem = findCheckResultDiv();
    checkResultElem.innerHTML = pharmacistCheckResultTemp.replace('@(url)', url);
    findElementById("checkResultButton").click();
    showdiv();
}

function pharmacistCheckIsQuit() {
    var url = assemble("/pharmacistSubmit/getRetValue");
    var data = 'presId=' + pharmacist_presId;
    var xmlhttp = initXmlHttp();
    xmlhttp.open("POST", url, false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
    xmlhttp.send(data);

    var checkData = eval("(" + xmlhttp.responseText + ")");

    if (checkData.action == 'NEXT') {
        window.clearInterval(pharmacistCheckIsQuitState);
        pharmacistCheck_for_next()
    } else if (checkData.action == 'BACK') {
        window.clearInterval(pharmacistCheckIsQuitState);
        pharmacistCheck_for_back();
    }
}

/**
 * 药师站审核无异常时，调用HIS提供的下一步函数
 */
function pharmacistNextWithoutError() {
    pharmacist_global_next_func_name(pharmacist_global_next_func_args);
}

/**
 * 药师站审核发现异常，在异常展示界面，药师选择了“允许发药”，调用HIS提供的下一步函数
 */
function pharmacistCheck_for_next() {
    hidediv();
    pharmacist_global_next_func_name(pharmacist_global_next_func_args);
}

/**
 * 药师站审核发现异常，在异常展示界面，药师了选择了“返回”按钮，调用HIS提供的返回修改函数
 */
function pharmacistCheck_for_back() {
    hidediv();
    pharmacist_global_back_func_name(pharmacist_global_back_func_args);
}

function local_next_func_pharmacist(next_func_name, next_func_args, back_func_name, back_func_args) {
    pharmacist_global_next_func_name = eval(next_func_name);
    pharmacist_global_next_func_args = next_func_args;
    pharmacist_global_back_func_name = eval(back_func_name);
    pharmacist_global_back_func_args = back_func_args;
}

function test_pharmacistNext(val) {
    alert("pharmacistNext:" + val);
}

function test_pharmacistBack(val) {
    alert("pharmacistBack:" + val);
}

/**
 * type等于1，是药师站；type等于2，是滨州药师站
 */
function sendPharmacistInterfere(xml,type) {
    var data = "xml=" + encodeURIComponent(xml);
    var url = assemble("/pharmacistSubmit/sendPharmacistInterfere");
    var checkData = sendAjaxRequestForPhar(data, url);
    if(checkData == -3){
        return -3;
    }
    if(checkData != null || checkData != ""){
        alert("干预成功！");
        hidediv();
        //禁止点击下一步
        if(type==1) {
            $("#next").attr('disabled', 'disabled');
            $("#next").css('background-image', 'url(' + assemble("/image/nextdisabled.png") + ')');
            $("#next").css('background-repeat', 'no-repeat');
            $("#next").css('background-position', 'center');
        }
    }
}

function testNurseCheck() {
    var dcdtXml = document.getElementById("dcdt").value;
    NurseCheck(dcdtXml, test_next, 1, test_back, 2, 0);
}

function NurseCheck(xml, next_func_name, next_fun_args, back_func_name, back_func_args, inHosFlag) {
    if(setInHosFlag(inHosFlag) == -4){
        return -4;
    }else {
        loacl_next_func(next_func_name, next_fun_args, back_func_name, back_func_args);
        return NurseCheckForChrome(xml);
    }
}

function NurseCheckForChrome(xml) {
    var data = "xml=" + encodeURIComponent(xml);
    var url = assemble("/nurseSubmit/sendNurseCheck");
    var checkData = sendAjaxRequestForPhar(data, url);
    if(checkData == -3){
        return -3;
    }

    var check = eval("(" + checkData + ")");

    if(check.hasProblem == -2){
        // alert("请求中间层服务异常！");
        return -2;
    }else if (check.hasProblem == 0) {
        if(t1){
            clearTimeout(t1);
        }
        check_for_next();
    } else {
        if(t1){
            clearTimeout(t1);
        }
        nurse_presId = check.presId;
        drawNurseCheckResultElem(assemble("/nurseSubmit/nurseCheckResultPage?presId=" + check.presId + '&browser=Chrome&random=' + Math.random()));
        nurseCheckIsQuitState = window.setInterval("nurseCheckIsQuit()", 500);
    }
}

function drawNurseCheckResultElem(url) {
    var checkResultElem = findCheckResultDiv();
    checkResultElem.innerHTML = checkResultTemp.replace('@(url)', url);
    findElementById("checkResultButton").click();
    showdiv();
}

function nurseCheckIsQuit() {
    var url = assemble("/nurseSubmit/getRetValue");
    var data = 'presId=' + nurse_presId;
    var xmlhttp = initXmlHttp();
    xmlhttp.open("POST", url, false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
    xmlhttp.send(data);

    var checkData = xmlhttp.responseText;
    checkData = eval("(" + checkData + ")");

    if (checkData == 0) {
        window.clearInterval(nurseCheckIsQuitState);
        pharmacistCheck_for_next()
    } else if (checkData == -1) {
        window.clearInterval(nurseCheckIsQuitState);
        pharmacistCheck_for_back();
    }
}


/**
 * ***********************************************************    滨医bs药师站接口开始     **********************************************************
 */
var pharmacist_global_next_func_name_bz ;
var pharmacist_global_next_func_args_bz ;
var pharmacist_global_back_func_name_bz ;
var pharmacist_global_back_func_args_bz ;

/**
 * 滨医模式药师站测试接口<br/>
 * Chrome.js不支持滨医模式药师站接口
 *
 * @param inHosFlag 门诊住院标识
 *
 * @deprecated
 */
function testPharmacistCheckBZ(inHosFlag) {
    var dcdtXml = document.getElementById("dcdt").value;
    var pharmacistInfo = document.getElementById("pharmacistInfo").value;
    CheckWingBZ(dcdtXml,pharmacistInfo,test_pharmacistNext_bz, 1, test_pharmacistBack_bz, 2);
}

function CheckWingBZ(xml, pharmacistInfo, next_func_name, next_fun_args, back_func_name, back_func_args) {
    local_next_func_pharmacist_bz(next_func_name, next_fun_args, back_func_name, back_func_args);
    return PharmacistCheckForChrome_BZ(xml, pharmacistInfo);
}

function PharmacistCheckForChrome_BZ(xml, pharmacistInfo, inHosFlag) {
    setInHosFlag(inHosFlag);
    var data = "xml=" + encodeURIComponent(xml) + '&' + 'pharmacistInfo=' + pharmacistInfo;
    var url = assemble("/pharmacistSubmit/sendPharmacistCheck_BZ");
    var checkData = sendAjaxRequestForPhar(data, url);


    if(checkData == -3||checkData ==""){
        result = "<OrderList STATE=\"-3\" />";
        return result;
    }
    var check = eval("(" + checkData + ")");
    if(check.hasProblem == -2){
        // alert("请求中间层服务异常！");
        result = "<OrderList STATE=\"-2\" />";
        return result;
    } else if (check.hasProblem == 0){
        if(t1){
            clearTimeout(t1);
        }
        pharmacistCheck_for_next_bz();
    }else {
        if(t1){
            clearTimeout(t1);
        }
        pharmacist_presId_bz = check.presId;
        drawPharmacistCheckResultElem_bz(assemble("/pharmacistSubmit/" + check.checkResultPage + "?presId=" + check.presId + '&type=3&random=' + Math.random()));
        pharmacistCheckIsQuitState = window.setInterval("pharmacistCheckIsQuit_bz()", 500);
    }

}


function drawPharmacistCheckResultElem_bz(url) {
    var checkResultElem = findCheckResultDiv();
    checkResultElem.innerHTML = pharmacistCheckResultTemp.replace('@(url)', url);
    findElementById("checkResultButton").click();
    showdiv();
}

function pharmacistCheckIsQuit_bz() {
    var url = assemble("/pharmacistSubmit/getRetValue_bz");
    var data = 'presId=' + pharmacist_presId_bz;
    var xmlhttp = initXmlHttp();
    xmlhttp.open("POST", url, false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
    xmlhttp.send(data);

    var checkData = xmlhttp.responseText;

    if (checkData == "<OrderList STATE=\"-1\" />") {
        window.clearInterval(pharmacistCheckIsQuitState);
        pharmacistCheck_for_back_bz();
    } else if (checkData != "<OrderList STATE=\"-2\" />") {
        window.clearInterval(pharmacistCheckIsQuitState);
        pharmacistCheck_for_next_bz();
    }

}

function pharmacistCheck_for_next_bz(){
    hidediv();
    pharmacist_global_next_func_name_bz(pharmacist_global_next_func_args_bz);
}

function pharmacistCheck_for_back_bz(){
    hidediv();
    pharmacist_global_back_func_name_bz(pharmacist_global_back_func_args_bz);
}

function local_next_func_pharmacist_bz(next_func_name, next_func_args, back_func_name, back_func_args) {
    pharmacist_global_next_func_name_bz = eval(next_func_name);
    pharmacist_global_next_func_args_bz = next_func_args;
    pharmacist_global_back_func_name_bz = eval(back_func_name);
    pharmacist_global_back_func_args_bz = back_func_args;
}


function test_pharmacistNext_bz(val) {
    alert("pharmacistNext:" + val);
}

function test_pharmacistBack_bz(val) {
    alert("pharmacistBack:" + val);
}



/**
 * *************************************   滨医bs药师站接口结束   *************************
 */
/*****************************      滨医医生站接口开始       **************************
 *
 */

/**
 *
 * @param tag
 * @deprecated
 *
 */
function testBZ(tag) {
    var dcdtXml = document.getElementById("dcdt").value;
    Check_BZRM(tag,dcdtXml,test_next,1,test_back,2,0);
}

function Check_BZRM(tag,xml,next_func_name,next_func_args,back_func_name,back_func_args,inHosFlag) {
    DoctorCheck(tag, xml, next_func_name, next_func_args, back_func_name, back_func_args, inHosFlag);
}

function CheckSingle(xml,next_func_name,next_func_args,back_func_name,back_func_args,inHosFlag) {
    var res = DoctorCheck("1",xml,next_func_name,next_func_args,back_func_name,back_func_args,inHosFlag);
    if(res == 0){
        DoctorCheck("2",xml,next_func_name,next_func_args,back_func_name,back_func_args,inHosFlag);
        return 0;
    }else{
        return res;
    }
}
/*****************************      滨医医生站接口结束       **************************
 *
 */

/**
 * 组装医生站的接口地址
 * @param suffix 接口后缀，必须以“/”开始
 * @return {string} 组装后的接口地址
 */
function assemble(suffix) {
    return "http://" + checkServerIp + ":" + checkServerPort + "/" + tjContext + suffix;
}