var atomColor = "cpk";
var jmolDebugOn = false;
var bkgdColor = "black";
var rotationPicOn = false;
var colorPicOn = false;
var measPicOn = false;
var memVar1 = "";
var memVar2 = "";
var dbJmeVar = "";
var jmeSmiles1 = "";
var jmeSmiles2 = "";
var loadScpt = "color label pink;select formalCharge <> 0;label %C;set echo top left;font echo 16 sansserif;color echo yellow;select *;";
var appletSize = "small";
var jmolLoaded = false;
var picMinimize = false;
var atomPicState = "11aC";
var bondPicState = "15qp";
var uffOn = true;
var smileJs1 = "";
var smileJs2 = "";
var nameJs1 = "";
var nameJs2 = "";
var ETV2 = "";
var getETV2 = false;
var getETV1 = false;
var ETV1 = "";
var getSmiles = false;
var showSmiles = "";
var probSession = false;
var probSessionMsg = "";
var calcWinTxt = "";
var iupacName = "";
var nihLoadedAction = "nothing";
var nihSMILES = "";
var loadAppend = "";
var pleaseWait = "echo Please wait!|Contacting the NIH Chemical Identifier Resolver...";
var mepMode = 1;

function osrScript(script) {
    script = (!script) ? document.getElementById("script").value : script;
    loadAppend = "";
    var scpt = script;
    var queryStr = "";
    if (scpt.indexOf("appendnih") > -1) { scpt = scpt.replace(/appendnih/i, "loadnih"); loadAppend = "append"; }
    if (scpt.toLowerCase().indexOf("loadvmk") > -1) { libLoad(trim(scpt.replace(/loadvmk/i, ""))); return; }
    if (scpt.toLowerCase().indexOf("smilesvmk") > -1) {
        alert(showSmiles); return;
    }
    if (scpt.indexOf("templatejme") > -1) {
        scpt = trim(scpt.replace(/templatejme/i, ""));
        nihLoadedAction = "jmeTemplate"; loadXmlData2("../models_jme/" + trim(scpt) + ".txt");
    }
    if (scpt.indexOf("loadnih") > -1) {
        scpt = trim(scpt.replace(/loadnih/i, ""));
        //scpt = scpt.replace(/c/ig, 'C');
        jmolScript(pleaseWait);
        queryStr = "molfile=" + escape(trim(scpt));
        nihLoadedAction = "loadmol"; loadXmlData("nih.aspx", queryStr);
    }
    if (scpt.indexOf("namenih") > -1) {
        jmolScript(pleaseWait);
        queryStr = "iupac=" + escape(showSmiles);
        nihLoadedAction = "getname"; loadXmlData("nih.aspx", queryStr);
    }
    if (scpt.indexOf("namesnih") > -1) {
        jmolScript(pleaseWait);
        queryStr = "names=" + escape(showSmiles);
        nihLoadedAction = "getnames"; loadXmlData("nih.aspx", queryStr);
    }
    if (scpt.indexOf("smilesnih") > -1 && ckModNum() == 1) {
        queryStr = escape(showSmiles);
        scpt = trim(scpt.replace(/smilesnih/i, ""));
        if (trim(scpt) != "") { queryStr = escape(trim(scpt)); }
        queryStr = "smiles=" + queryStr;
        jmolScript(pleaseWait);
        nihLoadedAction = "getsmiles"; loadXmlData("nih.aspx", queryStr);
    }
    if (scpt.substring(0, 1) == "~") {
        eval(scpt.substring(1, scpt.length));
    }
    else if ((scpt.indexOf("TRIPOS") > -1 || scpt.indexOf("M  END") > -1 || scpt.indexOf("Jmol version") > -1) && scpt.indexOf("EXTRACT") < 0) { clearMessage(); loadFromString(3); }
    else {
        jmolScript(loadScpt);
        jmolScript(scpt);
    }
}

function processMessage(appNum, messageString, indexNum) {
    if (jmolDebugOn) { alert(messageString); }
    messageString = "" + messageString + "";
    if (getETV2 == true) { ETV2 = messageString; getETV2 = false; }
    if (getETV1 == true) { ETV1 = messageString; getETV1 = false; }
    if (getSmiles == true) { showSmiles = messageString; getSmiles = false; }
    if (messageString.indexOf("echo @etv1") > -1) { getETV1 = true; }
    if (messageString.indexOf("echo @etv2") > -1) { getETV2 = true; }
    if (messageString.indexOf("print {*}.find('SMILES');") > -1) { getSmiles = true; }
    if (messageString.indexOf("assign atom") > -1) { picMinimize = true; }
    if (messageString.indexOf("assign connect") > -1) { picMinimize = true; }
    if (messageString.indexOf("new bonds") > -1) { picMinimize = true; }
    if (messageString.indexOf("assign bond") > -1) { picMinimize = true; }
    if (messageString.indexOf("Script completed") > -1 && picMinimize == true) { picMinimize = false; doUFF(-35); }
}

function processPick(appNum, messageString, indexNum) {
    var scpt = "";
    if (colorPicOn) {
        scpt = "select atomIndex = _atomPicked;color " + atomColor + ";select;";
        jmolScript(scpt);
    }
    if (rotationPicOn == true) {
        jmolScript("set modelkitMode false;");
        setRot(2);
    }
}

function surfaceOff() {
    jmolScript("mo delete;isosurface delete;select *;");
}

function copyMol(x) {
    jmolScript("select *");
    if (x < 3) {
        eval("memVar" + x + " = jmolGetPropertyAsString('extractModel', 'all').replace('EXTRACT', 'MODELKIT')");
        jmolScript("echo The current model has been saved to memory M" + x + ".|It can be reloaded by clicking 'Restore: M" + x + ".';delay 3;echo;");
    }
    if (x == 3) {
        document.getElementById("script").value = jmolGetPropertyAsString("extractModel", "all").replace("EXTRACT", "MODELKIT");
    }
    if (x == 4) {
        jmolScript("delete hydrogen;echo The structure depicted on the JME canvas is 2D with no|stereo bonds. Stereo bonds can be added in the JME|structure drawing applet prior to reloading or emailing.");
        setTimeout("document.getElementById(jme1).readMolFile(jmolGetPropertyAsString('extractModel', 'all').replace('EXTRACT', 'MODELKIT'))", 1000);
        setTimeout("calculateH()", 2000);
    }
    if (x == 5 && ckModNum() == 1) { var url = "http://cactus.nci.nih.gov/chemical/structure/" + escape(getJme(1)) + "/file?format=sdf&get3d=True"; var winNm = window.open(url, "nihWin", "width=500,height=300,toolbar=0"); winNm.focus(); }
    if (x == 6 && ckModNum() == 1) { var url2 = "http://cactus.nci.nih.gov/chemical/structure/" + escape(showSmiles.replace(/c/ig, 'C')) + "/file?format=sdf&get3d=True"; var winNm2 = window.open(url2, "nihWin2", "width=500,height=300,toolbar=0"); winNm2.focus(); }
}

function pasteMol(x) {
    var flag = false;
    jmkLnksOff("x");
    jmolScript("select *"); mepsData = false;
    if (x == 1 && memVar1.indexOf("MODELKIT") > -1) { loadFromString(4); flag = true; }
    if (x == 2 && memVar2.indexOf("MODELKIT") > -1) { loadFromString(5); flag = true; }
    if (!flag) { jmolScript("echo No model is currently saved in this memory.;delay 3;echo;"); }
    jmkLnksOff("x"); setTimeout("lnkSwitch()", 1000);
}

function resetParam() {
    jmolScript("reset;echo;select all;color cpk;isosurface off;mo off;measure delete;color label pink;background " + bkgdColor + ";")
}

function loadMol(x) {
    var ldFolder = "models";
    var ldMid = "mid2";
    mepsData = false; mepMode = 1;
    if (x == 2) { ldFolder = "meps"; ldMid = "mid"; }
    var loadString = 'load "../' + ldFolder + '/' + document.getElementById(ldMid).options[document.getElementById(ldMid).selectedIndex].value;
    loadString += '";' + loadScpt + 'hover off;background ' + bkgdColor + ';';
    mepsData = true;
    jmolScript('set appendNew false;' + loadString + 'javascript "getCharData()"');
    setTimeout("getFormula()", 2000);
}

function getCharData() {
    var fileNm = jmolGetPropertyAsString("filename", "all"); fileNm = fileNm.substring(fileNm.lastIndexOf("/") + 1, fileNm.lastIndexOf("."));
    nihLoadedAction = "getData"; loadXmlData2("../meps/" + fileNm + "_data.txt");
}

var picDataString = "";
function getPic(sz) {
    var tempStr = "<img width='" + sz + "' height='" + sz + "' src='data:image/jpeg;base64" + "," + picDataString + "' />";
    tempStr = "<p style='text-align: center'>" + tempStr + "</p>";
    feedback(tempStr, "2");
}

function takePic(sz, typ) {
    sz = (!sz) ? 300 : sz;
    sz = "" + sz;
    if (typ == 2) {
        var tempStr = "<img width='" + sz + "' height='" + sz + "' src='http://cactus.nci.nih.gov/chemical/structure/" + escape(showSmiles) + "/image' />";
        tempStr = "<p style='text-align: center'>" + tempStr + "</p>";
        feedback(tempStr, "2"); return;
    }
    picDataString = jmolGetPropertyAsString("image", "all");
    if (typ == 1) { getPic(sz); return; }
}

function setRot(num) {
    assignSet('16qrotateBond');
    if (num == 1) { jmolScript("echo Click a bond to select it for rotation. After the bond is|selected, shift/drag empty space to either side|of the bond to rotate branches around the bond axis."); }
}

function doWireFrame() {
    jmolScript("select; wireframe 0.03; spacefill 1%;");
}

function doBallStick() {
    jmolScript("select; wireframe 0.15; spacefill 23%;");
}

function mep(num) {
    if (mepMode == 2) {num = 2; }
    var colors = "roygb"; var charges = ""; var range = "";
    if (num == 2) { range = "color range all "; }
    if (num == 3) { charges = "label %P;"; }
    if (num == 4) { range = "color range all "; charges = "label %P;"; }
    if (mepsData == false) {
        alert("Some models [e.g. Edited, Restored, JME, and ChemSketch.] do not contain partial charge or MO data.");
    }
    else {
        doClean();
        jmolScript("select *;echo Calculating...;" + charges + "isosurface delete " + range + "COLORSCHEME '" + colors + "' resolution 0 solvent map MEP translucent;delay 2;echo;");
    }
}

function doClean() {
    jmolScript("measure delete;mo off;isosurface off;echo;label \"\";select formalCharge <> 0;label %C");
}

function doVdw() {
    var vdw = "select;isosurface select {*} resolution 6 MOLECULAR area;isosurface translucent;delay 2;isosurfaceArea = \"vdw surface area = \" + isosurfaceArea % 0 + \" \u212B<sup>2</sup>\";echo @isosurfaceArea";
    doClean();
    jmolScript(vdw);
}

function wyfc() {
    var clr = prompt("Enter a common color name to change the model background default color. If the color you enter is too exotic, the background will not change.", "Blue");
    if (clr == "" || clr == null) { clr = bkgdColor; }
    bkgdColor = clr;
    jmolScript("background " + bkgdColor);
}

function doUFF(num) {
    num = parseInt(num);
    if (num == 0) { jmolScript("echo Auto optimization is now off.|Click the 'optimize' link to reactivate optimization."); uffOn = false; }
    if (uffOn == false) { return; }
    mepsData = false;
    var scpt = "select *;wireframe 0.15;spacefill 23%;boundbox {*};centerat boundbox;";
    if (num == 1) { jmolScript(scpt); setTimeout("getFormula();", 2000); return; }
    if (num > 0) {
        scpt += "echo Please wait while Jmol|optimizes the structure...;delay 1;";
        scpt += "set minimizationRefresh false;set useMinimizationThread false;set minimizationSteps " + num + ";minimize; delete hydrogen;calculate hydrogens;";
    }
    else {
        scpt += "echo Please wait while Jmol|optimizes the structure...;delay .5;";
        scpt += "set minimizationRefresh false;set useMinimizationThread false;set minimizationSteps " + -1 * num + ";minimize addHydrogens;";
    }
    scpt += "select *;wireframe 0.15;spacefill 23%;boundbox {*};centerat boundbox;echo;";
    osrScript(scpt);
    setTimeout("getFormula();", 2000);
}

function loadFromString(num) {
    if (num == 7 && ajaxReturnTxt.indexOf("Sorry. We cannot locate that model.") > -1) { jmolScript("echo The requested model data could not be found.;delay 3;echo;"); return; }
    var modStr = "";
    var mods;
    var modMove = "";
    if (num == 1) {
        mepsData = false;
        modStr = document.getElementById(jme1).jmeFile();
        mods = modStr.split("|");
        var modA = mods[0]; var modB = mods[1];
        jmolScript("mod1 = '" + modA + "';mod2 = '" + modB + "';load '@mod1';" + loadScpt + "hover off;set appendNew false;load APPEND '@mod2';select *;wireframe 0.15;spacefill 23%;boundbox {*};centerat boundbox;");
        setTimeout("getFormula()", 2000); return;
    }
    if (num == 2) { modStr = document.getElementById(jme1).jmeFile(); mepsData = false; }
    if (num == 3) { modStr = document.getElementById("script").value; mepsData = false; }
    if (num == 4) { modStr = memVar1; mepsData = false; }
    if (num == 5) { modStr = memVar2; mepsData = false; }
    if (num == 6) { modStr = dbJmeVar; mepsData = false; }
    if (num == 7) { modStr = ajaxReturnTxt; mepsData = false; if (loadAppend == "append") { modMove = "translateSelected {7 7 0}"; } jmolScript("select *;" + modMove); }
    jmolScript("set appendNew false;mod1 = '" + modStr + "';load " + loadAppend + " '@mod1';" + loadScpt + "hover off;select *;wireframe 0.15;spacefill 23%;boundbox {*};centerat boundbox;");
    if (num == 6 || num == 7) {
        setTimeout("lnkSwitch();getFormula()", 2000);
    }
    else {
        setTimeout("getFormula()", 2000);
    }
}

function getFormula() {
    var info = "";
    var infoArr;
    var infoHold = "";
    var cmdStr = "";
    var f = new Array();
    var i;
    var j;
    try {
        for (i = 1; i < 6; i++) {
            cmdStr = 'moleculeInfo[' + i + '].mf';
            info = eval('jmolGetPropertyAsString("' + cmdStr + '")');
            if (info == null || info == "") { break; }
            if (info.indexOf(" ") > -1) {
                infoArr = info.substring(info.indexOf("\"") + 1, info.length - 1).split(" ");
                for (j = 0; j < infoArr.length; j++) {
                    f[j] = infoArr[j];
                }
                if (f[0] == "H" && f[2] == "C") { infoArr[0] = f[2]; infoArr[1] = f[3]; infoArr[2] = f[0]; infoArr[3] = f[1]; }
                info = infoArr.join(" ") + " ";
                infoHold += info.replace(/ 1 /g, "").split(" ").join("") + "+";
            }
        }
        document.getElementById("calcDisplay").value = infoHold.substring(0, infoHold.length - 1);
        calcWinTxt = infoHold.substring(0, infoHold.length - 1);
        //if (document.getElementById('script').value.indexOf("Sorry. We cannot locate that model.") > -1) {
        //jmolScript("echo The requested file was not located.;"); document.getElementById('script').value = "";
        //}
        //else {
        osrScript("echo;print {*}.find('SMILES');");
        //}
    }
    catch (e) {
        //alert(e);
        jmolScript("boundbox {*};centerat boundbox;");
    }
}

function openHelpWindow() {
    window.open("../code/jme/helpfs.html", "", "toolbar=no,menubar=no,scroolbars=no,resizable=yes,width=500,height=600");
}

function lnkSwitch(x) {
    x = (!x) ? 3 : x;
    if (x == 4) { jmolScript("set picking off;set picking on;set bondpicking false;axes off;hover off; echo;"); picsOff(); }
    if (x == 1) { jmolScript("set picking off;set picking on;set bondpicking true;axes off;hover off; echo;"); picsOff(); jmkLnksOff("x"); setKitDefault(); }
    if (x == 2) { jmolScript("set picking off;set picking on;set bondpicking false;axes off;hover off; echo;"); picsOff(); colorPicOn = true; }
    if (x == 3) { jmolScript("set picking off;set picking on;set bondpicking true;axes off;hover off; echo;"); picsOff(); jmkLnksOff("x"); setKitDefault(); }
}

function loadBaseMol(bsmol, num) {
    num = parseInt(num);
    var scpt = "";
    jmkLnksOff("x");
    if (num == 0) {
        jmolScript("axes off");
        scpt = "Load '../models/" + bsmol + ".txt';" + loadScpt + ";";
        jmolScript(scpt);
        mepsData = true;
        setTimeout("lnkSwitch();getFormula()", 1000);
    }
    else {
        scpt = "select *;translateSelected {7 7 0};set appendNew false;load append '../models/" + bsmol + ".txt';";
        scpt += "hover off;select *;wireframe 0.15;spacefill 23%;boundbox {*};centerat boundbox;";
        jmolScript(scpt);
        setTimeout("lnkSwitch();getFormula()", 1000);
        //doUFF(50);
    }
}

function dupMod() {
    var modTxt = "mod1 = '" + jmolGetPropertyAsString("extractModel", "all") + "'";
    jmolScript(modTxt); setTimeout("dupMod2()", 1000);
}

function dupMod2() {
    var modelTxt = "" + jmolGetPropertyAsString("extractModel", "all") + "";
    var scpt = "var i = {*}.atomIndex.max + 1;var t = {*}.atomIndex.min;select within(branch, {atomIndex = i}, {atomIndex=t});var x = {selected}.size;var y={*}.size;var z = y - x;";
    scpt += "if (y > 40 || z != 0){echo This feature is limited to a single model with|less than 40 atoms.;delay 3;echo;}";
    scpt += "else{var sz = 3;if (y > 4){sz = 4};if (y > 10){sz = 5};if (y > 30){sz = 7};set appendNew false;";
    scpt += "select *;translateSelected {@sz @sz 0};load APPEND '@mod1';";
    scpt += "mod1='';hover off;}";
    mepsData = false;
    jmolScript(scpt);
    doUFF(1);
    setTimeout("lnkSwitch()", 1000);
}

function emailCode() {
    var qs = "" + document.getElementById(jme1).jmeFile() + "";
    if (qs != "") {
        qs = escape(qs);
        qs = "mail.aspx?jme=" + qs;
        window.open(qs, '_blank');
    }
}

function picsOff() {
    rotationPicOn = false; colorPicOn = false; measPicOn = false;
}

function calculateH() {
    jmolScript("delete hydrogen;calculate hydrogens;");
}

function jmolInit() {
    mepMode = 1;
    jmolScript("var flg1 = '';var namp = '';var smip = '';var nam1 = '';var nam2 = '';var smi1 = '';var smi2 = '';var etv1 = '';var etv2 = '';var  mod1 = '';var  mod2 = '';hover off;color label pink;select formalCharge <> 0;label %C;set echo top left;font echo 16 sansserif;color echo yellow;echo;set PickCallBack 'processPick';set MessageCallBack 'processMessage';select *;set debugscript true; load MENU 'menu.txt'");
    var fileNm = jmolGetPropertyAsString("filename", "all");fileNm = fileNm.substring(fileNm.lastIndexOf("/") + 1, fileNm.lastIndexOf("."));
    nihLoadedAction = "getData";loadXmlData2("../meps/" + fileNm + "_data.txt");
    setTimeout("getFormula()", 3000);
}

function assignSet(sfx) {
    jmolScript("set modelkitMode false;");
    if (sfx != "16qrotateBond" && bondPicState == "16qrotateBond") { bondPicState = "17qbondpickoff"; }
    var w = "";
    var idNum = sfx.substring(0, 2);
    var idAlpha = sfx.substring(2, 3);
    var objId = idAlpha + idNum;
    if (idAlpha == "a") { atomPicState = sfx; }
    if (idAlpha == "q") { bondPicState = sfx; }
    var AidNum = atomPicState.substring(0, 2);
    var AidAlpha = atomPicState.substring(2, 3);
    var AobjId = AidAlpha + AidNum;
    var Aact = atomPicState.substring(3, atomPicState.length);
    var QidNum = bondPicState.substring(0, 2);
    var QidAlpha = bondPicState.substring(2, 3);
    var QobjId = QidAlpha + QidNum;
    var Qact = bondPicState.substring(3, bondPicState.length);
    jmkLnksOff("x"); objColor(AobjId, " #ffc0cb"); objColor(QobjId, " #ffc0cb");
    picsOff();
    jmolScript("set picking off;set picking on;set bondpicking true;axes off;hover off;");
    if (bondPicState == "17qbondpickoff") { jmolScript("set bondpicking false;"); }
    if (Aact == "Q") {
        Aact = prompt("Enter the symbol for the element to be reprented by X.", "I");
        if (Aact == "" || Aact == null) { Aact = "I"; }
        atomPicState = "11aC";
    }
    if (Qact.indexOf("rotate") > -1) { jmolScript("set picking " + Qact + ";"); rotationPicOn = true; jmkLnksOff("a"); return; }
    if (Qact == "0" || Qact == "1" || Qact == "2" || Qact == "3" || Qact == "p") { jmolScript("set picking assignBond_" + Qact); }
    if (Aact.indexOf("drag") > -1) { jmolScript("set picking " + Aact); return; }
    if (Aact.indexOf("invert") > -1) { jmolScript("set picking " + Aact); return; }
    jmolScript("set picking assignAtom_" + Aact);
}

function jmkLnksOff(alph) {
    jmolScript("echo");
    alph = (!alph) ? "x" : alph;
    var w = "";
    if (alph == "y") { objColor("a11", "#ffc0cb"); objColor("q15", "#ffc0cb"); return; }
    if (alph == "a" || alph == "x") {
        for (var i = 11; i < 27; i++) {
            w = "a" + i.toString();
            objColor(w, "#ffffcc");
        }
    }
    if (alph == "q" || alph == "x") {
        for (var j = 11; j < 18; j++) {
            w = "q" + j.toString();
            objColor(w, "#ffffcc");
        }
    }
}

function setKitDefault() {
    jmkLnksOff("x"); jmkLnksOff("y"); jmolScript("set picking assignAtom_C;set picking assignBond_p;");
}

function meas() {
    jmolScript("set picking off;set picking on;set bondpicking false;axes off;hover off;");
    picsOff();
    jmkLnksOff("x");
    measPicOn = true;
    scpt = "echo To measure a distance, double-click 2 atoms. To measure|an angle, double-click, click, double-click 3 atoms. To|measure a torsion double-click, click, click, double-click 4|atoms.;";
    jmolScript(scpt + "showMeasurements = true;set pickingstyle MEASURE OFF; set picking OFF;");
}

function toggleSize() {
    if (appletSize == "small") {
        jmolResizeApplet([550, 560]); lnkSwitch(1); showPopMod(4); appletSize = "large";
    }
    else {
        jmolResizeApplet([450, 460]); lnkSwitch(1); showPopMod(4); appletSize = "small";
    }
}

function probBuild(typ, num) {
    num = parseInt(num); var pNum = rand(1, num); var cnt = 0;
    for (var i = 0; i < r.length; i++) {
        if (r[i].indexOf("!*" + typ + "!") > -1) { cnt++; }
        if (cnt == pNum) { break; }
    }
    var pInfo; var nameP; var smileP;
    pInfo = r[i].split("!"); smileJs = pInfo[6]; nameJs = pInfo[13];
    if (pInfo.length > 15) { nameJs = pInfo[14]; }
    var msgTxt = "<p style='text-align:left;'>The model kit can evaluate student success in building a given model. By way of example, "
    msgTxt += "build the model:&nbsp;&nbsp;" + nameJs + ".<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:nullFunction()' onclick='setFeedBack(nameJs,smileJs);'>Start This Problem</a> <b>or</b> <a href='javascript:nullFunction()' onclick='quitProbs();'>End the Problem Session</a></p>";
    feedback(msgTxt, "1");
}

var ia = 0; var tog = 1;
function testProbSet(typ) {
    if (tog == 0) { checkModel(); feedback(ia - 1, "1"); tog = 1; return; }
    for (var i = ia; i < r.length; i++) {
        if (r[i].indexOf("!*" + typ + "!") > -1) {
            var pInfo; var loadFile;
            pInfo = r[i].split("!"); loadFile = pInfo[13];
            libLoad(loadFile);
            ia = i + 1; tog = 0;
            break;
        }
    }
}

function probMenu() {
    feedback('Problem Session ON<br />The problem menu is under construction.', '1');
}

function setFeedBack(n, s) {
    n = (!n) ? "" : n; s = (!s) ? "" : s;
    probSession = true; probSessionMsg = "Target Model: ";
    feedback('Problem Session ON<br />' + probSessionMsg + n, '1');
    jmolScript("smip = '" + s + "';namp = '" + n + "';etv2 = namp;echo @etv2;var y = 'The target model is ' + namp + '.|Build this model and click the check link|to confirm correct construction.';echo @y;");
}

function quitProbs() {
    probSession = false; jmolScript('echo'); feedback('', '1'); probSessionMsg = '';
}

function libLoad(strNm) {
    var mods;
    strNm = "!" + strNm.toLowerCase() + "!";
    for (var i = 0; i < r.length; i++) {
        if (r[i].toLowerCase().indexOf(strNm) > -1) {
            mods = r[i].split("!");
            var loadString = "load '../models_sw/" + mods[13].replace(' ', '_') + ".txt";
            loadString += "';" + loadScpt + "hover off;background " + bkgdColor + ";";
            mepsData = false;
            jmolScript("set appendNew false;" + loadString);
            setTimeout("lnkSwitch(); getFormula()", 2000);
        }
    }
}

function NIST() {
    var NISTwin;
    var cmpNm = document.getElementById("mid2").options[document.getElementById("mid2").selectedIndex].value;
    cmpNm = cmpNm.substring(0, cmpNm.indexOf(".txt"));
    cmpNm = cmpNm.replace("_(E)", ""); cmpNm = cmpNm.replace("_(Z)", ""); cmpNm = cmpNm.replace("_(R)", ""); cmpNm = cmpNm.replace("_(S)", "");
    var urlNm = "http://webbook.nist.gov/cgi/cbook.cgi?Name=" + cmpNm + "&Units=SI&cIR=on&cMS=on";
    NISTwin = window.open(urlNm, "NIST", "scrollbars,resizable,menubar,toolbar,location,status,directories,width=500,height=600");
    NISTwin.focus();
}

function checkModel(num) {
    var scpt = "";
    jmolScript("echo");
    if (ckModNum() == 1 && probSession == true && num == 3) {
        scpt = "flg1 = 'incorrect';var i = 'This is NOT the correct model for|' + namp + '.';";
        scpt += "var sf = smip.find('SMILES','MF');var m = {*}.find('SMILES');var mf = m.find('SMILES','MF');";
        scpt += "var ckf = (sf == mf);var cks = {*}.find('SMILES',smip);var bl = (ckf && cks > 1); if(bl){flg1 = 'correct';";
        scpt += "i = 'This is the correct model for|' + namp + '.';};echo @i;";
        jmolScript(scpt);
        scpt = 'if (flg1 == "correct"){javascript "probSession = false;clearMessage()";}';
        jmolScript(scpt);
        return;
    }
    if (ckModNum() == 1 && num == 1) {
        ETV1 = ""; var pInfo1;
        for (var i = 0; i < r.length; i++) {
            pInfo1 = r[i].split("!"); smileJs1 = pInfo1[6]; nameJs1 = pInfo1[13];
            if (pInfo1.length > 15) { nameJs1 = pInfo1[14]; }
            if (pInfo1[1] == calcWinTxt) {
                scpt = "var sm2 = '" + smileJs1 + "';";
                scpt += "var cks = {*}.find('SMILES',sm2);if (cks > 1){etv1 = '" + nameJs1 + "';echo @etv1;echo;}";
                jmolScript(scpt);
                //if (ETV1 != "") { setTimeout("nihJump()", 1000); return; }
            }
        }
        setTimeout("nihJump()", 1000); return;
    }
    if (ckModNum() == 2 && num == 2) {
        scpt = "var i = {*}.atomIndex.max + 1;var t = {*}.atomIndex.min;select within(branch, {atomIndex = i}, {atomIndex=t});var x = compare({selected}, {not selected}, 'ISOMER');"
        scpt += "var y = 'These models are ' + x; if (x == 'NONE'){y = 'These models do not have the|same molecular formula!';};y = y.replace('CONFORMATIONAL ','CONFORMATIONAL|');echo @y"
        jmolScript(scpt);
        return;
    }
    //alert("The compare command is only operative when two models are being evaluated. The command will assess the identity of two models including stereochemistry in this assessment.");
}

function nihJump() { if (ETV1 == "") { osrScript("namenih") } else { fbFilter(ETV1); } }

function ckModNum() { var mods = calcWinTxt.split("+"); return mods.length; }

function clearMessage() { feedback("", "1"); }

function nihDataAction() {
    if (nihLoadedAction == "nothing") { return; }
    if (nihLoadedAction == "getnames") { jmolScript("echo"); alert(ajaxReturnTxt); nihLoadedAction = "nothing"; return; }
    if (nihLoadedAction == "loadmol") { loadFromString(7); loadAppend = ""; nihLoadedAction = "nothing"; return; }
    if (nihLoadedAction == "getname") { var nihNm = ajaxReturnTxt.replace(/(\r\n|\n|\r)/gm, " "); fbFilter(nihNm); nihLoadedAction = "nothing"; return; }
    if (nihLoadedAction == "getsmiles") { nihSMILES = ajaxReturnTxt; fbFilter(nihSMILES); nihLoadedAction = "nothing"; return; }
    if (nihLoadedAction == "jmeTemplate") { document.getElementById(jme1).readMolecule(ajaxReturnTxt); nihLoadedAction = "nothing"; return; }
    if (nihLoadedAction == "getData") { jmolScript("var x = [" + ajaxReturnTxt + "];{*}.partialCharge = x;"); nihLoadedAction = "nothing";mepMode = 2; return; }
    if (nihLoadedAction == "jmeload") { document.getElementById(jme1).readMolecule(ajaxReturnTxt); jmolScript("echo"); nihLoadedAction = "nothing"; return; }
}

function jmeDataAction() { }

//function nihLdOps() {
    //var msgTxt = "<p style='text-align: left;'>You may <a href='javascript:nullFunction()' onclick='loadAlt(2)'>optimize</a> the current model ";
    //msgTxt += "or load a new model using the NIH server. The script field command <i>loadnih NAME</i> will load a new model - e.g. <i>loadnih ";
    //msgTxt += "acetic acid</i> and clicking Run Script will load acetic acid.</p>"
    //feedback(msgTxt, "1");
//}

function loadAlt(num) {
    var ldMod = "load";
    var queryStr = "";
    var cmdStr = "loadnih ";
    if (num == 4) { ldMod = "append";cmdStr = "appendnih "; }
    if (num == 3 || num == 4) { var qs = prompt("This " + ldMod + " option will search the NIH resolver for a common name, iupac name, or SMILES. For example, the default entry will " + ldMod + " the model of acetic acid. You may also enter NIH load or append commands in the script command field - e.q. loadnih acetic acid OR appendnih acetic acid.", "acetic acid"); }
    if (num == 3 || num == 4) {
        if (trim(qs) != "" && qs != null) { osrScript("loadnih " + trim(qs)); }
        return;
    }
    jmolScript(pleaseWait);
    if (num == 5) { nihLoadedAction = 'jmeload'; queryStr = 'jmefile=' + escape(clnNIH(showSmiles)); loadXmlData('nih.aspx', queryStr); return; }
    nihLoadedAction = 'loadmol';
    //queryStr = 'molfile=' + escape(clnNIH(getJme(1)));
    if (num == 1) { queryStr = 'molfile=' + escape(getJme(1)); }
    if (num == 2) { queryStr = 'molfile=' + escape(clnNIH(showSmiles)); }
    loadXmlData('nih.aspx', queryStr);
}

function getJme(num) {
    num = (!num) ? 4 : num;
    num = parseInt(num);
    var jmeSmiles = "" + document.getElementById(jme1).smiles() + "";
    var jmeFile = "" + document.getElementById(jme1).jmeFile() + "";
    var jmeMol = "" + document.getElementById(jme1).molFile() + "";
    var smils = jmeSmiles.split("."); jmolScript("smi1 = '" + smils[0].replace(/\\/g, '\\\\') + "';"); jmeSmiles1 = smils[0];
    if (smils.length > 1) { jmolScript("smi2 = '" + smils[1].replace(/\\/g, '\\\\') + "';"); jmeSmiles2 = smils[1]; }
    if (num == 1) { return jmeSmiles1; }
    if (num == 2) { return jmeFile; }
    if (num == 3) { return jmeMol; }
    if (num == 4 && smils.length == 2) { jmolScript("echo;var x = 'The editor drawings are ';var y = compare(smi1, smi2, 'ISOMER');y = y.replace('NONE', 'NOT IDENTICAL');x = x + y;echo @x;delay 3;echo"); return; }
    if (num == 4) { return; }
    if (jmeSmiles == "") { return; }
    if (smils.length > 2) { alert("You can only load one or two structures to the model window."); return; }
    if (smils.length == 2) {
        loadFromString(1); return;
    }
    loadFromString(2); return;
}

function fbFilter(str) {
    feedback("", "3"); document.getElementById('script').value = ""; jmolScript("echo");
    if (str.length < 50) { feedback(str, "3"); } else { document.getElementById('script').value = str; feedback("Long data string placed in script field above.", "3"); }
}

function clnNIH(str) {
    //str = str.replace(/c/ig, 'C').replace(/\\/g, "").replace(/\//g, "");
    str = str.replace(/c/ig, 'C');
    return str;
}