// BH 5/16/2013 8:14:47 AM fix for checkbox groups and default radio names
// BH 8:36 AM 7/27/2012 adds name/id for cmd button
// BH 8/12/2012 6:51:53 AM adds function() {...} option for all controls:
// Jmol.jmolButton(jmol, function(jmol) {...}, "xxxx")
(function(Jmol) {
// private
var c = Jmol.controls = {
_hasResetForms: false,
_scripts: [""],
_checkboxMasters: {},
_checkboxItems: {},
_actions: {},
_buttonCount: 0,
_checkboxCount: 0,
_radioGroupCount: 0,
_radioCount: 0,
_linkCount: 0,
_cmdCount: 0,
_menuCount: 0,
_previousOnloadHandler: null,
_control: null,
_element: null,
_appletCssClass: null,
_appletCssText: "",
_buttonCssClass: null,
_buttonCssText: "",
_checkboxCssClass: null,
_checkboxCssText: "",
_radioCssClass: null,
_radioCssText: "",
_linkCssClass: null,
_linkCssText: "",
_menuCssClass: null,
_menuCssText: ""
};
c._addScript = function(appId,script) {
var index = c._scripts.length;
c._scripts[index] = [appId, script];
return index;
}
c._getIdForControl = function(appletOrId, script) {
//alert(appletOrId + " " + typeof appletOrId + " " + script + appletOrId._canScript)
return (typeof appletOrId == "string" ? appletOrId
: !script || !appletOrId._canScript || appletOrId._canScript(script) ? appletOrId._id
: null);
}
c._radio = function(appletOrId, script, labelHtml, isChecked, separatorHtml, groupName, id, title) {
var appId = c._getIdForControl(appletOrId, script);
if (appId == null)
return null;
++c._radioCount;
groupName != undefined && groupName != null || (groupName = "jmolRadioGroup" + (c._radioGroupCount - 1));
if (!script)
return "";
id != undefined && id != null || (id = "jmolRadio" + (c._radioCount - 1));
labelHtml != undefined && labelHtml != null || (labelHtml = script.substring(0, 32));
separatorHtml || (separatorHtml = "");
var eospan = "";
c._actions[id] = c._addScript(appId, script);
var t = "";
if (labelHtml.toLowerCase().indexOf("
")>=0) {
t += eospan;
eospan = "";
}
t += "" +eospan + separatorHtml;
return t;
}
/////////// events //////////
c._scriptExecute = function(element, scriptInfo) {
var applet = Jmol._applets[scriptInfo[0]];
var script = scriptInfo[1];
if (typeof(script) == "object")
script[0](element, script, applet);
else if (typeof(script) == "function")
script(applet);
else
Jmol.script(applet, script);
}
c._commandKeyPress = function(e, id, appId) {
var keycode = (e == 13 ? 13 : window.event ? window.event.keyCode : e ? e.which : 0);
if (keycode == 13) {
var inputBox = document.getElementById(id)
c._scriptExecute(inputBox, [appId, inputBox.value]);
}
}
c._click = function(obj, scriptIndex) {
c._element = obj;
if (arguments.length == 1)
scriptIndex = c._actions[obj.id];
c._scriptExecute(obj, c._scripts[scriptIndex]);
}
c._menuSelected = function(menuObject) {
var scriptIndex = menuObject.value;
if (scriptIndex != undefined) {
c._scriptExecute(menuObject, c._scripts[scriptIndex]);
return;
}
var len = menuObject.length;
if (typeof len == "number")
for (var i = 0; i < len; ++i)
if (menuObject[i].selected) {
c._click(menuObject[i], menuObject[i].value);
return;
}
alert("?Que? menu selected bug #8734");
}
c._cbNotifyMaster = function(m){
//called when a group item is checked
var allOn = true;
var allOff = true;
for (var chkBox in m.chkGroup){
if(m.chkGroup[chkBox].checked)
allOff = false;
else
allOn = false;
}
if (allOn)m.chkMaster.checked = true;
if (allOff)m.chkMaster.checked = false;
if ((allOn || allOff) && c._checkboxItems[m.chkMaster.id])
c._cbNotifyMaster(c._checkboxItems[m.chkMaster.id])
}
c._cbNotifyGroup = function(m, isOn){
//called when a master item is checked
for (var chkBox in m.chkGroup){
var item = m.chkGroup[chkBox]
if (item.checked != isOn) {
item.checked = isOn;
c._cbClick(item);
}
if (c._checkboxMasters[item.id])
c._cbNotifyGroup(c._checkboxMasters[item.id], isOn)
}
}
c._cbSetCheckboxGroup = function(chkMaster, chkboxes, args){
var id = chkMaster;
if(typeof(id)=="number")id = "jmolCheckbox" + id;
chkMaster = document.getElementById(id);
if (!chkMaster)alert("jmolSetCheckboxGroup: master checkbox not found: " + id);
var m = c._checkboxMasters[id] = {};
m.chkMaster = chkMaster;
m.chkGroup = {};
var i0;
if (typeof(chkboxes)=="string") {
chkboxes = args;
i0 = 1;
} else {
i0 = 0;
}
for (var i = i0; i < chkboxes.length; i++){
var id = chkboxes[i];
if(typeof(id)=="number")id = "jmolCheckbox" + id;
checkboxItem = document.getElementById(id);
if (!checkboxItem)alert("jmolSetCheckboxGroup: group checkbox not found: " + id);
m.chkGroup[id] = checkboxItem;
c._checkboxItems[id] = m;
}
}
c._cbClick = function(ckbox) {
c._control = ckbox;
var whenChecked = c._actions[ckbox.id][0];
var whenUnchecked = c._actions[ckbox.id][1];
c._click(ckbox, ckbox.checked ? whenChecked : whenUnchecked);
if(c._checkboxMasters[ckbox.id])
c._cbNotifyGroup(c._checkboxMasters[ckbox.id], ckbox.checked)
if(c._checkboxItems[ckbox.id])
c._cbNotifyMaster(c._checkboxItems[ckbox.id])
}
c._cbOver = function(ckbox) {
var whenChecked = c._actions[ckbox.id][0];
var whenUnchecked = c._actions[ckbox.id][1];
window.status = c._scripts[ckbox.checked ? whenUnchecked : whenChecked];
}
c._mouseOver = function(obj, scriptIndex) {
if (arguments.length == 1)
scriptIndex = c._actions[obj.id];
window.status = c._scripts[scriptIndex];
}
c._mouseOut = function() {
window.status = " ";
return true;
}
// from JmolApplet
c._onloadResetForms = function() {
// must be evaluated ONLY once -- is this compatible with jQuery?
if (c._hasResetForms)
return;
c._hasResetForms = true;
c._previousOnloadHandler = window.onload;
window.onload = function() {
// var c = Jmol.controls;
if (c._buttonCount+c._checkboxCount+c._menuCount+c._radioCount+c._radioGroupCount > 0) {
var forms = document.forms;
for (var i = forms.length; --i >= 0; )
forms[i].reset();
}
if (c._previousOnloadHandler)
c._previousOnloadHandler();
}
}
// from JmolApi
c._getButton = function(appletOrId, script, label, id, title) {
var appId = c._getIdForControl(appletOrId, script);
if (appId == null)
return "";
//_jmolInitCheck();
id != undefined && id != null || (id = "jmolButton" + c._buttonCount);
label != undefined && label != null || (label = script.substring(0, 32));
++c._buttonCount;
c._actions[id] = c._addScript(appId, script);
var t = "";
if (Jmol._debugAlert)
alert(t);
return Jmol._documentWrite(t);
}
c._getCheckbox = function(appletOrId, scriptWhenChecked, scriptWhenUnchecked,
labelHtml, isChecked, id, title) {
var appId = c._getIdForControl(appletOrId, scriptWhenChecked);
if (appId != null)
appId = c._getIdForControl(appletOrId, scriptWhenUnchecked);
if (appId == null)
return "";
//_jmolInitCheck();
id != undefined && id != null || (id = "jmolCheckbox" + c._checkboxCount);
++c._checkboxCount;
if (scriptWhenChecked == undefined || scriptWhenChecked == null ||
scriptWhenUnchecked == undefined || scriptWhenUnchecked == null) {
alert("jmolCheckbox requires two scripts");
return;
}
if (labelHtml == undefined || labelHtml == null) {
alert("jmolCheckbox requires a label");
return;
}
c._actions[id] = [c._addScript(appId, scriptWhenChecked),c._addScript(appId, scriptWhenUnchecked)];
var eospan = ""
var t = ""
if (labelHtml.toLowerCase().indexOf(" | ")>=0) {
t += eospan
eospan = "";
}
t += "" +eospan;
if (Jmol._debugAlert)
alert(t);
return Jmol._documentWrite(t);
}
c._getCommandInput = function(appletOrId, label, size, id, title) {
var appId = c._getIdForControl(appletOrId, "x");
if (appId == null)
return "";
//_jmolInitCheck();
id != undefined && id != null || (id = "jmolCmd" + c._cmdCount);
label != undefined && label != null || (label = "Execute");
size != undefined && !isNaN(size) || (size = 60);
++c._cmdCount;
var t = "";
if (Jmol._debugAlert)
alert(t);
return Jmol._documentWrite(t);
}
c._getLink = function(appletOrId, script, label, id, title) {
var appId = c._getIdForControl(appletOrId, script);
if (appId == null)
return "";
//_jmolInitCheck();
id != undefined && id != null || (id = "jmolLink" + c._linkCount);
label != undefined && label != null || (label = script.substring(0, 32));
++c._linkCount;
var scriptIndex = c._addScript(appId, script);
var t = "" + label + "";
if (Jmol._debugAlert)
alert(t);
return Jmol._documentWrite(t);
}
c._getMenu = function(appletOrId, arrayOfMenuItems, size, id, title) {
var appId = c._getIdForControl(appletOrId, null);
var optgroup = null;
//_jmolInitCheck();
id != undefined && id != null || (id = "jmolMenu" + c._menuCount);
++c._menuCount;
var type = typeof arrayOfMenuItems;
if (type != null && type == "object" && arrayOfMenuItems.length) {
var len = arrayOfMenuItems.length;
if (typeof size != "number" || size == 1)
size = null;
else if (size < 0)
size = len;
var sizeText = size ? " size='" + size + "' " : "";
var t = ""
if (Jmol._debugAlert)
alert(t);
return Jmol._documentWrite(t);
}
})(Jmol);
|