// JmolApplet.js -- Jmol._Applet and Jmol._Image // BH 1/28/2018 7:15:09 AM adding _notifyAudioEnded // BH 2/14/2016 12:31:02 PM fixed local reader not disappearing after script call // BH 2/14/2016 12:30:41 PM Info.appletLoadingImage: "j2s/img/JSmol_spinner.gif", // can be set to "none" or some other image // BH 2/14/2016 12:27:09 PM Jmol.setCursor, proto._getSpinner // BH 1/15/2016 4:23:14 PM adding Info.makeLiveImage // BH 4/17/2015 2:33:32 PM update for SwingJS // BH 10/19/2014 8:08:51 PM moved applet._cover and applet._displayCoverImage to // BH 5/8/2014 11:20:21 AM trying to fix AH nd JG problem with multiple applets // BH 1/27/2014 8:36:43 AM adding Info.viewSet // BH 12/13/2013 9:04:53 AM _evaluate DEPRECATED (see JSmolApi.js Jmol.evaulateVar // BH 11/24/2013 11:41:31 AM streamlined createApplet, with added JNLP for local reading // BH 10/11/2013 7:17:10 AM streamlined and made consistent with JSV and JSME // BH 7/16/2012 1:50:03 PM adds server-side scripting for image // BH 8/11/2012 11:00:01 AM adds Jmol._readyCallback for MSIE not in Quirks mode // BH 8/12/2012 3:56:40 AM allows .min.png to be replaced by .all.png in Image file name // BH 8/13/2012 6:16:55 PM fix for no-java message not displaying // BH 11/18/2012 1:06:39 PM adds option ">" in database query box for quick command execution // BH 12/17/2012 6:25:00 AM change ">" option to "!" ;(function (Jmol, document) { // _Applet -- the main, full-featured, Jmol object Jmol._Applet = function(id, Info, checkOnly){ window[id] = this; this._jmolType = "Jmol._Applet" + (Info.isSigned ? " (signed)" : ""); this._viewType = "Jmol"; this._isJava = true; this._syncKeyword = "Select:"; this._availableParams = ";progressbar;progresscolor;boxbgcolor;boxfgcolor;allowjavascript;boxmessage;\ ;messagecallback;pickcallback;animframecallback;appletreadycallback;atommovedcallback;\ ;echocallback;evalcallback;hovercallback;language;loadstructcallback;measurecallback;\ ;minimizationcallback;resizecallback;scriptcallback;statusform;statustext;statustextarea;\ ;synccallback;usecommandthread;syncid;appletid;startupscript;menufile;"; if (checkOnly) return this; this._isSigned = Info.isSigned; this._readyFunction = Info.readyFunction; this._ready = false; this._isJava = true; this._isInfoVisible = false; this._applet = null; this._memoryLimit = Info.memoryLimit || 512; this._canScript = function(script) {return true;}; this._savedOrientations = []; this._initialize = function(jarPath, jarFile) { var doReport = false; Jmol._jarFile && (jarFile = Jmol._jarFile); if(this._jarFile) { var f = this._jarFile; if(f.indexOf("/") >= 0) { alert ("This web page URL is requesting that the applet used be " + f + ". This is a possible security risk, particularly if the applet is signed, because signed applets can read and write files on your local machine or network."); var ok = prompt("Do you want to use applet " + f + "? ", "yes or no") if(ok == "yes") { jarPath = f.substring(0, f.lastIndexOf("/")); jarFile = f.substring(f.lastIndexOf("/") + 1); } else { doReport = true; } } else { jarFile = f; } this_isSigned = Info.isSigned = (jarFile.indexOf("Signed") >= 0); } this._jarPath = Info.jarPath = jarPath || "."; this._jarFile = Info.jarFile = (typeof(jarFile) == "string" ? jarFile : (jarFile ? "JmolAppletSigned" : "JmolApplet") + "0.jar"); if (doReport) alert ("The web page URL was ignored. Continuing using " + this._jarFile + ' in directory "' + this._jarPath + '"'); Jmol.controls == undefined || Jmol.controls._onloadResetForms(); } this._create(id, Info); return this; } ;(function(Applet, proto) { Applet._get = function(id, Info, checkOnly) { // note that the variable name the return is assigned to MUST match the first parameter in quotes // applet = Jmol.getApplet("applet", Info) checkOnly || (checkOnly = false); Info || (Info = {}); var DefaultInfo = { color: "#FFFFFF", // applet object background color, as for older jmolSetBackgroundColor(s) width: 300, height: 300, addSelectionOptions: false, serverURL: "http://your.server.here/jsmol.php", defaultModel: "", script: null, src: null, readyFunction: null, use: "HTML5",//other options include JAVA, WEBGL, and IMAGE jarPath: "java", jarFile: "JmolApplet0.jar", isSigned: false, j2sPath: "j2s", coverImage: null, // URL for image to display makeLiveImage: null, // URL for small image to click to make live (defaults to j2s/img/play_make_live.jpg) coverTitle: "", // tip that is displayed before model starts to load coverCommand: "", // Jmol command executed upon clicking image deferApplet: false, // true == the model should not be loaded until the image is clicked deferUncover: false, // true == the image should remain until command execution is complete disableJ2SLoadMonitor: false, disableInitialConsole: true, // new default since now we have the spinner 2/14/2016 12:26:28 PM //appletLoadingImage: "j2s/img/JSmol_spinner.gif", // can be set to "none" or some other image debug: false }; Jmol._addDefaultInfo(Info, DefaultInfo); Jmol._debugAlert = Info.debug; Info.serverURL && (Jmol._serverUrl = Info.serverURL); var javaAllowed = false; var applet = null; var List = Info.use.toUpperCase().split("#")[0].split(" "); for (var i = 0; i < List.length; i++) { switch (List[i]) { case "JAVA": javaAllowed = true; if (Jmol.featureDetection.supportsJava()) applet = new Applet(id, Info, checkOnly); break; case "WEBGL": applet = Applet._getCanvas(id, Info, checkOnly, true); break; case "HTML5": if (Jmol.featureDetection.allowHTML5){ applet = Applet._getCanvas(id, Info, checkOnly, false); } else { List.push("JAVA"); } break; // case "IMAGE": // applet = new Jmol._Image(id, Info, checkOnly); // break; } if (applet != null) break; } if (applet == null) { if (checkOnly || !javaAllowed) applet = {_jmolType : "none" }; else if (javaAllowed) applet = new Applet(id, Info); } // keyed to both its string id and itself return (checkOnly ? applet : Jmol._registerApplet(id, applet)); } Applet._getCanvas = function(id, Info, checkOnly, webGL) { Info._isLayered = false; Info._platform = "J.awtjs2d.Platform"; if (webGL && Jmol.featureDetection.supportsWebGL()) { Jmol._Canvas3D.prototype = Jmol.GLmol.extendApplet(Jmol._jsSetPrototype(new Applet(id, Info, true))); return new Jmol._Canvas3D(id, Info, "Jmol", checkOnly); } if (!webGL) { Jmol._Canvas2D.prototype = Jmol._jsSetPrototype(new Applet(id, Info, true)); return new Jmol._Canvas2D(id, Info, "Jmol", checkOnly); } return null; }; /* AngelH, mar2007: By (re)setting these variables in the webpage before calling Jmol.getApplet(), a custom message can be provided (e.g. localized for user's language) when no Java is installed. */ Applet._noJavaMsg = "Either you do not have Java applets enabled in your webbrowser or your browser is blocking this applet.\ Check the warning message from your browser and/or enable Java applets in\ your web browser preferences, or install the Java Runtime Environment from www.java.com"; Applet._setCommonMethods = function(p) { p._showInfo = proto._showInfo; p._search = proto._search; p._getName = proto._getName; p._readyCallback = proto._readyCallback; } Applet._createApplet = function(applet, Info, params) { applet._initialize(Info.jarPath, Info.jarFile); var jarFile = applet._jarFile; var jnlp = "" if (Jmol._isFile) { // local installations need jnlp here and should reference JmolApplet(Signed).jar, not JmolApplet(Signed)0.jar jarFile = jarFile.replace(/0\.jar/,".jar"); //jnlp = " jnlp_href=\"" + jarFile.replace(/\.jar/,".jnlp") + "\""; } // size is set to 100% of containers' size, but only if resizable. // Note that resizability in MSIE requires: // var w = (applet._containerWidth.indexOf("px") >= 0 ? applet._containerWidth : "100%"); var h = (applet._containerHeight.indexOf("px") >= 0 ? applet._containerHeight : "100%"); var widthAndHeight = " style=\"width:" + w + ";height:" + h + "\" "; var attributes = "name='" + applet._id + "_object' id='" + applet._id + "_object' " + "\n" + widthAndHeight + jnlp + "\n" params.codebase = applet._jarPath; params.codePath = params.codebase + "/"; if (params.codePath.indexOf("://") < 0) { var base = document.location.href.split("#")[0].split("?")[0].split("/"); base[base.length - 1] = params.codePath; params.codePath = base.join("/"); } params.archive = jarFile; params.mayscript = 'true'; params.java_arguments = "-Xmx" + Math.round(Info.memoryLimit || applet._memoryLimit) + "m"; params.permissions = (applet._isSigned ? "all-permissions" : "sandbox"); params.documentLocation = document.location.href; params.documentBase = document.location.href.split("#")[0].split("?")[0]; params.jarPath = Info.jarPath; Jmol._syncedApplets.length && (params.synccallback = "Jmol._mySyncCallback"); applet._startupScript && (params.script = applet._startupScript); var t = "\n"; for (var i in params) if(params[i]) t += " \n"; if (Jmol.featureDetection.useIEObject || Jmol.featureDetection.useHtml4Object) { t = "" : " type='application/x-java-applet'>") + t + "\n" + Applet._noJavaMsg + "\n"; } else { // use applet tag t = "\n" + t + "\n" + Applet._noJavaMsg + "\n"; } if (applet._deferApplet) applet._javaCode = t, t=""; t = Jmol._getWrapper(applet, true) + t + Jmol._getWrapper(applet, false) + (Info.addSelectionOptions ? Jmol._getGrabberOptions(applet) : ""); if (Jmol._debugAlert) alert (t); applet._code = Jmol._documentWrite(t); } proto._newApplet = function(viewerOptions) { if (!this._is2D) viewerOptions.put("script", (viewerOptions.get("script") || "") + ";set multipleBondSpacing 0.35;"); this._viewerOptions = viewerOptions; return new J.appletjs.Jmol(viewerOptions); } proto._addCoreFiles = function() { Jmol._addCoreFile("jmol", this._j2sPath, this.__Info.preloadCore); if (!this._is2D) { Jmol._addExec([this, null, "J.export.JSExporter","load JSExporter"]) // Jmol._addExec([this, this.__addExportHook, null, "addExportHook"]) } if (Jmol._debugCode) Jmol._addExec([this, null, "J.appletjs.Jmol", "load Jmol"]); } proto._create = function(id, Info){ Jmol._setObject(this, id, Info); var params = { syncId: Jmol._syncId, progressbar: "true", progresscolor: "blue", boxbgcolor: this._color || "black", boxfgcolor: "white", boxmessage: "Downloading JmolApplet ...", script: (this._color ? "background \"" + this._color +"\"": ""), code: "JmolApplet.class" }; Jmol._setAppletParams(this._availableParams, params, Info); function sterilizeInline(model) { model = model.replace(/\r|\n|\r\n/g, (model.indexOf("|") >= 0 ? "\\/n" : "|")).replace(/'/g, "'"); if(Jmol._debugAlert) alert ("inline model:\n" + model); return model; } params.loadInline = (Info.inlineModel ? sterilizeInline(Info.inlineModel) : ""); params.appletReadyCallback = "Jmol._readyCallback"; if (Jmol._syncedApplets.length) params.synccallback = "Jmol._mySyncCallback"; params.java_arguments = "-Xmx" + Math.round(Info.memoryLimit || this._memoryLimit) + "m"; this._initialize(Info.jarPath, Info.jarFile); Applet._createApplet(this, Info, params); } proto._restoreState = function(clazzName, state) { System.out.println("\n\nasynchronous restore state for " + clazzName + " " + state) var applet = this; var vwr = applet._applet && applet._applet.viewer; switch (state) { case "setOptions": return function(_setOptions) {applet.__startAppletJS(applet)}; case "render": return function() {setTimeout(function(){vwr.refresh(2)},10)}; default: switch (clazzName) { // debug mode only, when core.z.js has not been loaded and prior to start case "J.shape.Balls": case "J.shape.Sticks": case "J.shape.Frank": return null; } //if (vwr.rm.repaintPending) //return function() {setTimeout(function(){vwr.refresh(2)},10)}; if (vwr && vwr.isScriptExecuting && vwr.isScriptExecuting()) { if (Jmol._asyncCallbacks[clazzName]) { System.out.println("...ignored"); return 1; } var sc = vwr.getEvalContextAndHoldQueue(vwr.eval); var pc = sc.pc - 1; sc.asyncID = clazzName; Jmol._asyncCallbacks[clazzName] = function(pc) {sc.pc=pc; System.out.println("sc.asyncID="+sc.asyncID+" sc.pc = " + sc.pc);vwr.eval.resumeEval(sc)}; vwr.eval.pc = vwr.eval.pcEnd; System.out.println("setting resume for pc=" + sc.pc + " " + clazzName + " to " + Jmol._asyncCallbacks[clazzName] + "//" ) return function() {System.out.println("resuming " + clazzName + " " + Jmol._asyncCallbacks[clazzName]);Jmol._asyncCallbacks[clazzName](pc)}; } System.out.println(clazzName + "?????????????????????" + state) return function() {setTimeout(function(){vwr.refresh(2)},10)}; //return null; } } proto._notifyAudioEnded = function(htParams) { this._applet.notifyAudioEnded(htParams); } proto._readyCallback = function(id, fullid, isReady) { if (!isReady) return; // ignore -- page is closing Jmol._setDestroy(this); this._ready = true; var script = this._readyScript; if (this._defaultModel) Jmol._search(this, this._defaultModel, (script ? ";" + script : "")); else if (script) this._script(script); else if (this._src) this._script('load "' + this._src + '"'); this._showInfo(true); this._showInfo(false); Jmol.Cache.setDragDrop(this); this._readyFunction && this._readyFunction(this); Jmol._setReady(this); var app = this._2dapplet; if (app && app._isEmbedded && app._ready && app.__Info.visible) { var me = this; // for some reason, JSME doesn't get the width/height correctly the first time me._show2d(true);me._show2d(false);me._show2d(true); } Jmol._hideLoadingSpinner(this); } proto._showInfo = function(tf) { if(tf && this._2dapplet) this._2dapplet._show(false); Jmol.$html(Jmol.$(this, "infoheaderspan"), this._infoHeader); if (this._info) Jmol.$html(Jmol.$(this, "infodiv"), this._info); if ((!this._isInfoVisible) == (!tf)) return; this._isInfoVisible = tf; // 1px does not work for MSIE if (this._isJava) { var x = (tf ? 2 : "100%"); Jmol.$setSize(Jmol.$(this, "appletdiv"), x, x); } Jmol.$setVisible(Jmol.$(this, "infotablediv"), tf); Jmol.$setVisible(Jmol.$(this, "infoheaderdiv"), tf); this._show(!tf); } proto._show2d = function(tf) { this._2dapplet._show2d(tf); if (this._2dapplet._isEmbedded) { this._showInfo(false); this._show(!tf); // for whatever reason this must be here this._2dapplet.__showContainer(true, true); } } proto._getSpinner = function() { return (this.__Info.appletLoadingImage || this._j2sPath + "/img/JSmol_spinner.gif"); } proto._getAtomCorrelation = function(molData, isC13) { // get the first atom mapping available by loading the model structure into model 2, var n = this._evaluate("{*}.count"); if (n == 0)return; this._loadMolData(molData, "atommap = compare({1.1} {2.1} 'MAP' " + (isC13 ? "" : "'H'") + "); zap 2.1", true); var map = this._evaluate("atommap"); var A = []; var B = []; // these are Jmol atom indexes. The second number will be >= n, and all must be incremented by 1. for (var i = 0; i < map.length; i++) { var c = map[i]; A[c[0] + 1] = c[1] - n + 1; B[c[1] - n + 1] = c[0] + 1; } return {fromJmol:A, toJmol:B}; // forward and rev. } proto._show = function(tf) { var x = (!tf ? 2 : "100%"); Jmol.$setSize(Jmol.$(this, "object"), x, x); if (!this._isJava) Jmol.$setVisible(Jmol.$(this, "appletdiv"), tf); } proto._clearConsole = function () { if (this._console == this._id + "_infodiv") this.info = ""; if (!self.Clazz)return; Jmol._setConsoleDiv(this._console); Clazz.Console.clear(); } proto._addScript = function(script) { this._readyScript || (this.readyScript = ""); this._readyScript && (this._readyScript += ";"); this._readyScript += script; return true; } proto._script = function(script) { if (!this._ready) return this._addScript(script); Jmol._setConsoleDiv(this._console); Jmol._hideLocalFileReader(this); this._applet.script(script); } proto._syncScript = function(script) { this._applet.syncScript(script); } proto._scriptCheck = function(script) { return this._ready && this._applet.scriptCheck(script); } proto._scriptWait = function(script, noReturn) { var Ret = this._scriptWaitAsArray(script); var s = ""; if (!noReturn) for(var i = Ret.length; --i >= 0; ) for(var j = 0, jj = Ret[i].length; j < jj; j++) s += Ret[i][j] + "\n"; return s; } proto._scriptEcho = function(script) { // returns a newline-separated list of all echos from a script var Ret = this._scriptWaitAsArray(script); var s = ""; for(var i = Ret.length; --i >= 0; ) for(var j = Ret[i].length; --j >= 0; ) if(Ret[i][j][1] == "scriptEcho") s += Ret[i][j][3] + "\n"; return s.replace(/ \| /g, "\n"); } proto._scriptMessage = function(script) { // returns a newline-separated list of all messages from a script, ending with "script completed\n" var Ret = this._scriptWaitAsArray(script); var s = ""; for(var i = Ret.length; --i >= 0; ) for(var j = Ret[i].length; --j >= 0; ) if(Ret[i][j][1] == "scriptStatus") s += Ret[i][j][3] + "\n"; return s.replace(/ \| /g, "\n"); } proto._scriptWaitOutput = function(script) { var ret = ""; try { if(script) { ret += this._applet.scriptWaitOutput(script); } } catch(e) { } return ret; } proto._scriptWaitAsArray = function(script) { var ret = ""; try { this._getStatus("scriptEcho,scriptMessage,scriptStatus,scriptError"); if(script) { ret += this._applet.scriptWait(script); ret = Jmol._evalJSON(ret, "jmolStatus"); if( typeof ret == "object") return ret; } } catch(e) { } return [[ret]]; } proto._getStatus = function(strStatus) { return Jmol._sortMessages(this._getPropertyAsArray("jmolStatus",strStatus)); } proto._getPropertyAsArray = function(sKey,sValue) { return Jmol._evalJSON(this._getPropertyAsJSON(sKey,sValue),sKey); } proto._getPropertyAsString = function(sKey,sValue) { sValue == undefined && ( sValue = ""); return this._applet.getPropertyAsString(sKey, sValue) + ""; } proto._getPropertyAsJSON = function(sKey,sValue) { sValue == undefined && ( sValue = ""); try { return (this._applet.getPropertyAsJSON(sKey, sValue) + ""); } catch(e) { return ""; } } proto._getPropertyAsJavaObject = function(sKey,sValue) { sValue == undefined && ( sValue = ""); return this._applet.getProperty(sKey,sValue); } proto._evaluate = function(expr) { expr != null || (expr = ""); return this._getPropertyAsArray("variableInfo", expr); } proto._evaluateDEPRECATED = function(molecularMath) { // DEPRECATED!!! // DEPRECATED!!! //carries out molecular math on a model var result = "" + this._getPropertyAsJavaObject("evaluate", molecularMath); var s = result.replace(/\-*\d+/, ""); if(s == "" && !isNaN(parseInt(result))) return parseInt(result); var s = result.replace(/\-*\d*\.\d*/, "") if(s == "" && !isNaN(parseFloat(result))) return parseFloat(result); return result; // DEPRECATED!!! } proto._saveOrientation = function(id) { return this._savedOrientations[id] = this._getPropertyAsArray("orientationInfo","info").moveTo; } proto._restoreOrientation = function(id) { var s = this._savedOrientations[id]; if(!s || s == "") return s = s.replace(/1\.0/, "0"); return this._scriptWait(s); } proto._restoreOrientationDelayed = function(id,delay) { arguments.length < 1 && ( delay = 1); var s = this._savedOrientations[id]; if(!s || s == "") return s = s.replace(/1\.0/, delay); return this._scriptWait(s); } proto._resizeApplet = function(size) { // See _jmolGetAppletSize() for the formats accepted as size [same used by jmolApplet()] // Special case: an empty value for width or height is accepted, meaning no change in that dimension. /* * private functions */ function _getAppletSize(size, units) { /* Accepts single number, 2-value array, or object with width and height as mroperties, each one can be one of: percent (text string ending %), decimal 0 to 1 (percent/100), number, or text string (interpreted as nr.) [width, height] array of strings is returned, with units added if specified. Percent is relative to container div or element (which should have explicitly set size). */ var width, height; if(( typeof size) == "object" && size != null) { width = size[0]||size.width; height = size[1]||size.height; } else { width = height = size; } return [_fixDim(width, units), _fixDim(height, units)]; } function _fixDim(x, units) { var sx = "" + x; return (sx.length == 0 ? (units ? "" : Jmol._allowedJmolSize[2]) : sx.indexOf("%") == sx.length - 1 ? sx : (x = parseFloat(x)) <= 1 && x > 0 ? x * 100 + "%" : (isNaN(x = Math.floor(x)) ? Jmol._allowedJmolSize[2] : x < Jmol._allowedJmolSize[0] ? Jmol._allowedJmolSize[0] : x > Jmol._allowedJmolSize[1] ? Jmol._allowedJmolSize[1] : x) + (units ? units : "") ); } var sz = _getAppletSize(size, "px"); var d = Jmol._getElement(this, "appletinfotablediv"); d.style.width = sz[0]; d.style.height = sz[1]; this._containerWidth = sz[0]; this._containerHeight = sz[1]; if (this._is2D) Jmol.repaint(this, true); } proto._search = function(query, script){ Jmol._search(this, query, script); } proto._searchDatabase = function(query, database, script, _jmol_searchDatabase){ if (this._2dapplet && this._2dapplet._isEmbedded && !Jmol.$(this, "appletdiv:visible")[0]) return this._2dapplet._searchDatabase(query, database, script); this._showInfo(false); if (query.indexOf("?") >= 0) { Jmol._getInfoFromDatabase(this, database, query.split("?")[0]); return; } script || (script = Jmol._getScriptForDatabase(database)); var dm = database + query; this._currentView = null; this._searchQuery = dm; this._loadFile(dm, script, dm); } proto._loadFile = function(fileName, script, chemID, _jmol_loadFile){ this._showInfo(false); script || (script = ""); this._thisJmolModel = "" + Math.random(); this._fileName = fileName; if (!this._scriptLoad(fileName, script)) { // we load the data here instead of in Jmol in the case of // JSmol/Java/Sandboxed or when part of a view set var me = this; Jmol._loadFileData(this, fileName, function(data){me.__loadModel(data, script, chemID)}, function() {me.__loadModel(null)} ); } } proto._scriptLoad = function(file, script, _jmol_scriptLoad) { script || (script = ""); var doscript = (this._isJava || !this._noscript); if (doscript) this._script("zap;set echo middle center;echo Retrieving data..."); if (!this._isSigned || this._viewSet != null) return false; if (doscript) this._script("load async \"" + file + "\";" + script); else this._applet.openFile(file); this._checkDeferred(""); return true; } proto.__loadModel = function(mol, script, chemID, _jmol__loadModel) { if (mol == null) return; if (this._viewSet != null) { script || (script = ""); // first component only script += ";if ({*}.molecule.max > 1 || {*}.modelindex.max > 0){ delete molecule > 1 or modelindex > 0;x = getProperty('extractModel',{*});load inline @x};" } if (!script && this._noscript) { this._applet.loadInlineString(mol, "", false); } else { this._loadMolData(mol, script, false); } if (this._viewSet != null) { Jmol.View.updateView(this, {chemID:chemID, data:mol}); } } proto._loadMolData = function(mol, script, isAppend) { script || (script = ""); var name = (isAppend ? "append" : "model"); script = 'load DATA "' + name + '"' + mol + '\nEND "'+ name +'" ;' + script; this._applet.scriptWait(script); } proto._loadModelFromView = function(view, _jmol_loadModelFromView) { // request from Jmol.View to update view with view.JME.data==null or needs changing this._currentView = view; var rec = view.Jmol; if (rec.data != null) { this.__loadModel(rec.data, null, view.info.chemID); return; } if (view.info.chemID != null) { Jmol._searchMol(this, view.info.chemID, null, false); return; } rec = view.JME; if (rec) { rec.applet._show2d(false, this); return; } } proto._reset = function(_jmol_resetView) { this._scriptWait("zap", true); } proto._updateView = function(_jmol_updateView) { if (this._viewSet == null || !this._applet) return; // called from model change without chemical identifier, possibly by user action and call to Jmol.updateView(applet) chemID = "" + this._getPropertyAsJavaObject("variableInfo","script('show chemical inchiKey')"); if (chemID.length < 36) // InChIKey=RZVAJINKPMORJF-BGGKNDAXNA-N chemID = null; else chemID = chemID.substring(36).split('\n')[0]; Jmol.View.updateView(this, {chemID:chemID, data: "" + this._getPropertyAsJavaObject("evaluate", "extractModel", "{visible}")}); } proto._atomPickedCallback = function(imodel, iatom, _jmol_atomPickedCallback) { // direct callback from Jmol HTML5 applet if (iatom < 0) { // TODO could be a model change? } else { var A = [iatom + 1]; Jmol.View.updateAtomPick(this, A); this._updateAtomPick(A); } } proto._updateAtomPick = function(A) { this._script(A.length == 0 ? "select none" : "select on visible and (@" + A.join(",@") + ")"); } proto._isDeferred = function () { return !this._canvas && this._cover && this._isCovered && this._deferApplet } proto._checkDeferred = function(script) { if (this._isDeferred()) { this._coverScript = script; this._cover(false); return true; } return false; } proto._cover = function (doCover) { if (doCover || !this._deferApplet) { this._displayCoverImage(doCover); return; } // uncovering UNMADE applet upon clicking image var s = (this._coverScript ? this._coverScript : ""); this._coverScript = ""; if (this._deferUncover) s += ";refresh;javascript " + this._id + "._displayCoverImage(false)"; this._script(s, true); if (this._deferUncover && this._coverTitle == "activate 3D model") Jmol._getElement(this, "coverimage").title = "3D model is loading..."; if (!this._isJava) this._newCanvas(false); if (this._defaultModel) Jmol._search(this, this._defaultModel); this._showInfo(false); if (!this._deferUncover) this._displayCoverImage(false); if (this._isJava) Jmol.$html(Jmol.$(this, "appletdiv"), this._javaCode); if (this._init) this._init(); }; proto._displayCoverImage = function(TF) { if (!this._coverImage || this._isCovered == TF) return; this._isCovered = TF; Jmol._getElement(this, "coverdiv").style.display = (TF ? "block" : "none"); }; proto._getSmiles = function() { return this._evaluate("{visible}.find('SMILES')"); } proto._getMol = function() { return this._evaluate("getProperty('ExtractModel',{visible})"); } proto._getMol2D = function() { return this._evaluate("script('select visible;show chemical sdf')"); // 2D equivalent no longer! } })(Jmol._Applet, Jmol._Applet.prototype); /* **************************************** // _Image -- an alternative to _Applet // commented out here, as it has found no use Jmol._Image = function(id, Info, checkOnly){ this._jmolType = "image"; if (checkOnly) return this; this._create(id, Info); return this; } ;(function (Image, proto) { Jmol._Applet._setCommonMethods(proto); proto._create = function(id, Info) { Jmol._setObject(this, id, Info); thisnfo); this._src || (this._src = ""); var t = Jmol._getWrapper(this, true) + '' + Jmol._getWrapper(this, false) + (Info.addSelectionOptions ? Jmol._getGrabberOptions(this) : ""); if (Jmol._debugAlert) alert (t); this._code = Jmol._documentWrite(t); this._ready = false; if (Jmol._document) this._readyCallback(id, null, this._ready = true, null); } proto._canScript = function(script) { var slc = script.toLowerCase().replace(/[\",\']/g, ''); var ipt = slc.length; return (script.indexOf("#alt:LOAD") >= 0 || slc.indexOf(";") < 0 && slc.indexOf("\n") < 0 && (slc.indexOf("script ") == 0 || slc.indexOf("load ") == 0) && (slc.indexOf(".png") == ipt - 4 || slc.indexOf(".jpg") == ipt - 4)); } proto._script = function(script) { var slc = script.toLowerCase().replace(/[\",\']/g, ''); // single command only // "script ..." or "load ..." only // PNG or PNGJ or JPG only // automatically switches to .all.png(j) from .min.png(j) var ipt = slc.length; if (slc.indexOf(";") < 0 && slc.indexOf("\n") < 0 && (slc.indexOf("script ") == 0 || slc.indexOf("load ") == 0) && (slc.indexOf(".png") == ipt - 4 || slc.indexOf(".pngj") == ipt - 5 || slc.indexOf(".jpg") == ipt - 4)) { var imageFile = script.substring(script.indexOf(" ") + 1); ipt = imageFile.length; for (var i = 0; i < ipt; i++) { switch (imageFile.charAt(i)) { case " ": continue; case '"': imageFile = imageFile.substring(i + 1, imageFile.indexOf('"', i + 1)) i = ipt; continue; case "'": imageFile = imageFile.substring(i + 1, imageFile.indexOf("'", i + 1)) i = ipt; continue; default: imageFile = imageFile.substring(i) i = ipt; continue; } } imageFile = imageFile.replace(/\.min\.png/,".all.png") document.getElementById(this._id + "_image").src = imageFile } else if (script.indexOf("#alt:LOAD ") >= 0) { imageFile = script.split("#alt:LOAD ")[1] if (imageFile.indexOf("??") >= 0) { var db = imageFile.split("??")[0]; imageFile = prompt(imageFile.split("??")[1], ""); if (!imageFile) return; if (!Jmol.db._DirectDatabaseCalls[imageFile.substring(0,1)]) imageFile = db + imageFile; } this._loadFile(imageFile); } } proto._show = function(tf) { Jmol._getElement(this, "appletdiv").style.display = (tf ? "block" : "none"); } proto._loadFile = function(fileName, params){ this._showInfo(false); this._thisJmolModel = "" + Math.random(); params = (params ? params : ""); var database = ""; if (Jmol._isDatabaseCall(fileName)) { database = fileName.substring(0, 1); fileName = Jmol._getDirectDatabaseCall(fileName, false); } else if (fileName.indexOf("://") < 0) { var ref = document.location.href var pt = ref.lastIndexOf("/"); fileName = ref.substring(0, pt + 1) + fileName; } var src = Jmol._serverUrl + "?call=getImageForFileLoad" + "&file=" + escape(fileName) + "&width=" + this._width + "&height=" + this._height + "¶ms=" + encodeURIComponent(params + ";frank off;"); Jmol._getElement(this, "image").src = src; } proto._searchDatabase = function(query, database, script){ if (query.indexOf("?") == query.length - 1) { Jmol._getInfoFromDatabase(this, database, query.split("?")[0]); return; } this._showInfo(false); script || (script = Jmol._getScriptForDatabase(database)); var src = Jmol._serverUrl + "?call=getImageFromDatabase" + "&database=" + database + "&query=" + query + "&width=" + this._width + "&height=" + this._height + "&script=" + encodeURIComponent(script + ";frank off;"); Jmol._getElement(this, "image").src = src; } })(Jmol._Image, Jmol._Image.prototype); ************************************ */ Jmol.jmolSmiles = function(jmol, withStereoChemistry) { return jmol._getSmiles(); } })(Jmol, document);
\n" + Applet._noJavaMsg + "