Clazz.declarePackage("JS");
Clazz.load(["J.api.JmolScriptFunction", "java.util.Hashtable", "JU.Lst"], "JS.ScriptFunction", ["JU.AU", "$.SB", "JS.SV", "$.T"], function(){
var c$ = Clazz.decorateAsClass(function(){
this.pt0 = 0;
this.chpt0 = 0;
this.cmdpt0 = -1;
this.typeName = null;
this.name = null;
this.nParameters = 0;
this.names = null;
this.tok = 0;
this.variables = null;
this.returnValue = null;
this.aatoken = null;
this.lineIndices = null;
this.lineNumbers = null;
this.script = null;
this.isPrivate = false;
Clazz.instantialize(this, arguments);}, JS, "ScriptFunction", null, J.api.JmolScriptFunction);
Clazz.prepareFields (c$, function(){
this.names =  new JU.Lst();
this.variables =  new java.util.Hashtable();
});
Clazz.makeConstructor(c$, 
function(){
});
Clazz.makeConstructor(c$, 
function(name, tok){
this.set(name, tok);
this.typeName = JS.T.nameOf(tok);
}, "~S,~N");
Clazz.defineMethod(c$, "isVariable", 
function(ident){
return this.variables.containsKey(ident);
}, "~S");
Clazz.defineMethod(c$, "set", 
function(name, tok){
this.name = name;
this.tok = tok;
}, "~S,~N");
Clazz.defineMethod(c$, "setVariables", 
function(contextVariables, params){
var nParams = (params == null ? 0 : params.size());
for (var i = this.names.size(); --i >= 0; ) {
var name = this.names.get(i).toLowerCase();
var $var = (i < this.nParameters && i < nParams ? params.get(i) : null);
if ($var != null && $var.tok != 7) $var = JS.SV.newT($var);
contextVariables.put(name, ($var == null ? JS.SV.newS("").setName(name) : $var));
}
if (this.tok != 364558) {
contextVariables.put("_argcount", JS.SV.newI(params == null ? 0 : params.size()));
contextVariables.put("_arguments", (params == null ? JS.SV.getVariableAI( Clazz.newIntArray(-1, [])) : JS.SV.getVariableList(params)));
}contextVariables.put("_retval", JS.SV.newI(this.tok == 364558 ? 2147483647 : 0));
}, "java.util.Map,JU.Lst");
Clazz.defineMethod(c$, "unsetVariables", 
function(contextVariables, params){
var nParams = (params == null ? 0 : params.size());
var nNames = this.names.size();
if (nParams == 0 || nNames == 0) return;
for (var i = 0; i < nNames && i < nParams; i++) {
var global = params.get(i);
if (global.tok != 7) continue;
var local = contextVariables.get(this.names.get(i).toLowerCase());
if (local.tok != 7) continue;
global.value = local.value;
}
}, "java.util.Map,JU.Lst");
Clazz.defineMethod(c$, "addVariable", 
function(name, isParameter){
this.variables.put(name, name);
this.names.addLast(name);
if (isParameter) this.nParameters++;
}, "~S,~B");
c$.setFunction = Clazz.defineMethod(c$, "setFunction", 
function($function, script, ichCurrentCommand, pt, lineNumbers, lineIndices, lltoken){
var cmdpt0 = $function.cmdpt0;
var chpt0 = $function.chpt0;
var nCommands = pt - cmdpt0;
$function.setScript(script.substring(chpt0, ichCurrentCommand));
var aatoken = $function.aatoken =  new Array(nCommands);
$function.lineIndices = JU.AU.newInt2(nCommands);
$function.lineNumbers =  Clazz.newShortArray (nCommands, 0);
var line0 = (lineNumbers[cmdpt0] - 1);
for (var i = 0; i < nCommands; i++) {
$function.lineNumbers[i] = (lineNumbers[cmdpt0 + i] - line0);
$function.lineIndices[i] =  Clazz.newIntArray(-1, [lineIndices[cmdpt0 + i][0] - chpt0, lineIndices[cmdpt0 + i][1] - chpt0]);
aatoken[i] = lltoken.get(cmdpt0 + i);
if (aatoken[i].length > 0) {
var tokenCommand = aatoken[i][0];
if (JS.T.tokAttr(tokenCommand.tok, 102400)) tokenCommand.intValue -= (tokenCommand.intValue < 0 ? -cmdpt0 : cmdpt0);
}}
for (var i = pt; --i >= cmdpt0; ) {
lltoken.removeItemAt(i);
lineIndices[i][0] = lineIndices[i][1] = 0;
}
}, "JS.ScriptFunction,~S,~N,~N,~A,~A,JU.Lst");
Clazz.defineMethod(c$, "setScript", 
function(s){
this.script = s;
if (this.script != null && this.script !== "" && !this.script.endsWith("\n")) this.script += "\n";
}, "~S");
Clazz.overrideMethod(c$, "toString", 
function(){
var s =  new JU.SB().append("/*\n * ").append(this.name).append("\n */\n").append(this.getSignature()).append(" {\n");
if (this.script != null) s.append(this.script);
s.append("}\n");
return s.toString();
});
Clazz.overrideMethod(c$, "getSignature", 
function(){
if (this.typeName == null) return JS.T.nameOf(this.tok);
var s =  new JU.SB().append(this.typeName).append(" ").append(this.name).append("(");
for (var i = 0; i < this.nParameters; i++) {
if (i > 0) s.append(", ");
s.append(this.names.get(i));
}
s.append(")");
return s.toString();
});
Clazz.overrideMethod(c$, "geTokens", 
function(){
return this.aatoken;
});
Clazz.overrideMethod(c$, "getName", 
function(){
return this.name;
});
Clazz.overrideMethod(c$, "getTok", 
function(){
return this.tok;
});
});
;//5.0.1-v7 Mon Jul 28 06:27:19 CDT 2025
