//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// debug alerts through # 6
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

var AtomId = "";

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
function writeJmolApplet(spt, alignTo)
{
	var jmoltag =
"<applet name='jmolApplet0' id='jmolApplet0'  code='JmolApplet'\n";

//alert("moldoc.js #1 top.usingSignedApplet=" + top.usingSignedApplet);

if (top.usingSignedApplet)
	jmoltag += "archive='JmolAppletSigned_i18n.jar,JmolAppletSigned0.jar,JmolAppletSigned1.jar,JmolAppletSigned2.jar,JmolAppletSigned3.jar,JmolAppletSigned4.jar,JmolAppletSigned5.jar,JmolAppletSigned6.jar'\n";
else
	jmoltag += "archive='JmolApplet_i18n.jar,JmolApplet0.jar,JmolApplet1.jar,JmolApplet2.jar,JmolApplet3.jar,JmolApplet4.jar,JmolApplet5.jar,JmolApplet6.jar'\n";

var jarpath = top.jmolJarPathOnServer;
if (!top.isServed)
	jarpath = ".";

jmoltag += 
"	codebase='" + jarpath + "'\n" +

"	width='" + top.jmolWidth + "' height='" + top.jmolHeight + "'\n" +

"	mayscript='true'\n";

if (alignTo != "")
	jmoltag += "align='" + alignTo + "'\n";

jmoltag +=
" \/>\n\
		<PARAM name='progressbar' value='true' \/>\n\
		<PARAM name='progresscolor' value='blue' \/>\n\
		<PARAM name='boxmessage' value='Downloading JmolApplet ...' \/>\n\
		<PARAM name='boxbgcolor' value='black' \/>\n\
		<PARAM name='boxfgcolor' value='white' \/>\n\
		<PARAM name='ReadyCallback' value='_jmolReadyCallback' \/>\n\
		<PARAM name='pickCallBack' value='jmolPickCallback' \/>\n\
		<PARAM name='script' value='" + spt + "' \/>\n\
<\/applet>\n";

	document.writeln(jmoltag);
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

var jmolFooter =

"<a href=\"javascript: top.showHelp('makeTroubleHelp()')\">Can't \
see the molecule?</a> \
&nbsp; \
&nbsp; \
&nbsp; \
&nbsp; \
&nbsp; \
<a href='http://www.bioinformatics.org/firstglance' \
target='fgijwin'>FirstGlance in Jmol</a> \
 \
<br> \
After resizing this window, use the browser's Reload/Refresh to \
force Jmol to resize accordingly. \
Please wait until you see the molecule before reloading/refreshing. \
(<a href=\"javascript: top.showHelp('makeTroubleHelp()')\">Why?</a>) \
";


//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
var nonChainSelectAlerted = false;
var nonChainHideAlerted = false;


function jmolPickCallback(p1, pTwo, p3, p4)
{
//	alert("moldoc.js #3: entering jmolPickCallback()\n" +
//		p1 + "\n" + p2 + "\n" + p3 + "\n" + p4);

// p1 = jmolApplet0
// p2 = [HIS]53:A.CA #1141 or [CD]41.CD #1714 (no chain)
// p3 = integer close atom number, but not it ??!!
// p4 = undefined

	if (toggleIsDown[slabIndex])
	{
		top.scriptToJmol(makeEchoSpt("Sorry, can't identify with Slab on."));
		return;
	}

	var p2 = "" + pTwo; // for Safari

	var iclosebracket = p2.indexOf("]");
	var icolon = p2.indexOf(":");
	var idot = p2.indexOf(".");
	var ipound = p2.indexOf("#");
	var ispace = p2.indexOf(" ");
	var iatomend = ispace;
	if (ispace == -1)
		iatomend = ipound;
	var ichainend = icolon;
	if (icolon == -1)
		ichainend = idot;

//	alert("moldoc.js #6: p2=" + p2 + "\n" + "iclosebracket=" + iclosebracket);

	var cchain, cgroup3, cgroupfull, catom, atomid, catomserial;	
	var seqnum;

//	if (iclosebracket == -1 || idot == -1 || ipound == -1)
//			return;

	// GROUP
	cgroup3 = p2.substring(1, iclosebracket); // [GRP] -> GRP
	atomid = cgroup3;
	cgroupfull = p2.substring(0, idot);
	//alert(cgroupfull);

	// SEQUENCE NUMBER
	seqnum = p2.substring(iclosebracket + 1, ichainend);
	atomid += " " + seqnum;

	// CHAIN (may be absent)
	if (icolon != -1)
	{
		cchain = p2.substring(icolon + 1, icolon + 2);
		atomid += " Chain=" + cchain;
	}
	else
		cchain = "";

	// ATOM (should be Element, but can't get it easily)
	// and MODEL
	var atomString = p2.substring(idot + 1, iatomend);
	var islash = atomString.indexOf("/");
	var modelString = "";
	if (islash != -1)
	{
		// must be before atomString is trimmed!
		modelString = atomString.substring(islash + 1);
		atomString = atomString.substring(0, islash);
	}
	atomid += " Atom=" + atomString;

	if (modelString != "")
		atomid += " Model=" + modelString;

	catomserial = p2.substring(ipound + 1);

	// HIDE MOIETIES?

//	var hideClickedSpt = "";
	if (hideMode == "c")
	{
		if (cchain != "")
		{
			var nonStdResChain = false;

			// IF THE RESIDUE IS NONSTANDARD, DON'T HIDE A CHAIN.
			// EXAMPLE: HEM HAS A CHAIN NAME IN 2HHD.
			if (!isStdAA(cgroup3) && !isStdNucleotide(cgroup3))
				nonStdResChain = true;
			else // standard residue with chain name
			{
				// nonstandard residues or ligand in a chain remain visible.
				// Don't increment the hidden chain count if they are clicked.
				var alreadyHidden = false;
				var ih;
				for (ih = 0; ih < top.hiddenChains.length; ih++)
					if (("" + top.hiddenChains[ih]) == cchain)
						alreadyHidden = true;

				if (!alreadyHidden)
				{
//				hideClickedSpt += "restrict not (:" + cchain + " and not hetero);\n";
					atomid = "Chain " + cchain + " Hidden";
					top.hiddenChains[top.hiddenChains.length] = cchain;
				}
			}
		}

		// NO CHAIN, OR NON-STANDARD RESIDUE WITH CHAIN NAME
		if (cchain == "" || nonStdResChain)
		{
			// HIDE UNNAMED CHAINS IF STD RESIDUE CLICKED
			// UNNAMED PROTEIN CHAIN
			if (isStdAA(cgroup3))
			{
				if (hiddenChains.length == 0)
				{
					atomid += "; Protein Hidden";
					hiddenChains[0] = "Protein";
				}
				else
				{
					atomid += "; Protein Re-Displayed";
					hiddenChains.length = 0;
				}
			}
			else if (isStdNucleotide(cgroup3))
			{
				if (hiddenChains.length == 0)
				{
					atomid += "; Nucleic Acid Hidden";
					hiddenChains[0] = "Nucleic";
				}
				else
				{
					atomid += "; Nucleic Acid Re-Displayed";
					hiddenChains.length = 0;
				}
			}

			// ALERT IF CLICK NON-STD RESIDUE, OR NON-CHAIN
			else //if (cchain == "") // && !nonChainHideAlerted)
			{
				alert(
					"To hide this, please change radio button\n" +
					"at left to Residues/Groups or Atoms,\n" +
					"then click again.");
				nonChainHideAlerted = true;
			}
		}
	}
	if (hideMode == "g")
	{
		var alreadyHiddenGroup = false;
		var ih, iht;
		for (ih = 0; ih < top.hiddenGroups.length; ih++)
		{
			if (("" + top.hiddenGroups[ih]) == cgroupfull) 
			{
				alreadyHiddenGroup = true;
				atomid = "Group Already Hidden - Please Click Elsewhere";
			}
		}

		if (!alreadyHiddenGroup)
		{
			atomid = "Residue/Group " + cgroupfull + " Hidden";
			top.hiddenGroups[top.hiddenGroups.length] = cgroupfull;
		}
	}
	if (hideMode == "a")
	{
		// BUILD ATOMID
		atomid = "Atom=" + atomString + " (in " + cgroup3 + " " + seqnum;
		if (cchain != "")
			atomid += " Chain=" + cchain;
		// you can hide an atom per model in the all models display
		if (modelString != "")
			atomid += " Model=" + modelString;
		atomid += ")";

		// IS IT ALREADY HIDDEN? (can still be clickable in smoothed traces)
		var alreadyHiddenAtom = false;
		var ih, iht;
		for (ih = 0; ih < top.hiddenAtoms.length; ih++)
		{
			var sas = firstWord(top.hiddenAtoms[ih]);
			if (sas == catomserial) // works in Gecko, Safari
				alreadyHiddenAtom = true;
		}

		if (!alreadyHiddenAtom) // SAVE atomid!
		{
			top.hiddenAtoms[top.hiddenAtoms.length] = catomserial + " " + atomid;
			atomid += " Hidden";
		}
		else // already hidden, now can replace atomid
			atomid = "Atom Already Hidden - Please Click Elsewhere";
	}
	// This is to workaround a bug in Jmol 10.00.48.
	// It should be fixed in a future Jmol release.
//	if (hideClickedSpt.length > 0)
//		hideClickedSpt = "set bondmode or;\n" + hideClickedSpt;

	// SELECT TARGET FOR CONTACTS?
	if (selectMode == "c") // cchain = clicked chain
	{
		var nonStdResChain = false;
		if (cchain != "")
		{
			// IF THE RESIDUE IS NONSTANDARD, DON'T SELECT A CHAIN.
			// EXAMPLE: HEM HAS A CHAIN NAME IN 2HHD.
			if (!isStdAA(cgroup3) && !isStdNucleotide(cgroup3))
				nonStdResChain = true;
			else
			{
				atomid = "Chain " + cchain;

				var alreadySelected = false;
				var ih, iht;
				// IS CHAIN ALREADY SELECTED?
				for (ih = 0; ih < top.selectedChains.length; ih++)
				{
//alert(selectedChains[ih] + " " + selectedChains[ih].length + "\n" + cchain + " " + cchain.length);
//alert("|" + selectedChains[ih] + "|\n|" + cchain + "|");

					if (("" + top.selectedChains[ih]) == cchain) // otherwise fails in Gecko, Safari
					{
						alreadySelected = true;
						// toggle selection off for this chain
						// move higher chains down to replace current slot
						for (iht = ih + 1; iht < top.selectedChains.length; iht++)
							top.selectedChains[iht - 1] = top.selectedChains[iht];
						top.selectedChains.length--;
						atomid += " Deselected";
					}
				}

				// ADD THIS CHAIN TO SELECTED ARRAY
				if (!alreadySelected)
				{
					atomid += " Selected";
					top.selectedChains[top.selectedChains.length] = cchain;
				}
			} // end standard residue in chain
		} // end non-blank chain name

		// NO CHAIN, OR NON-STANDARD RESIDUE WITH CHAIN NAME
		if (cchain == "" || nonStdResChain)
		{
			// SELECT UNNAMED CHAINS IF STD RESIDUE CLICKED
			// UNNAMED PROTEIN CHAIN
			if (isStdAA(cgroup3))
			{
				if (selectedChains.length == 0)
				{
					atomid += "; Protein Selected";
					selectedChains[0] = "Protein";
				}
				else
				{
					atomid += "; Protein Deselected";
					selectedChains.length = 0;
				}
			}
			// UNNAMED NUCLEIC ACID CHAIN
			else if (isStdNucleotide(cgroup3))
			{
				if (selectedChains.length == 0)
				{
					atomid += "; Nucleic Acid Selected";
					selectedChains[0] = "Nucleic";
				}
				else
				{
					atomid += "; Nucleic Acid Deselected";
					selectedChains.length = 0;
				}
			}

			// ALERT IF CLICK NON-STD RESIDUE, OR NON-CHAIN
			else //if (!nonChainSelectAlerted)
			{
				alert(
					"To select " + cgroup3 +", please change radio button\n" +
					"at left to Residues/Groups or Atoms,\n" +
					"then click again.");
				nonChainSelectAlerted = true;
			}
		}
	} // end select mode == chain

	if (selectMode == "g")
	{
		atomid = "Residue/Group " + cgroupfull;

		var alreadySelected = false;
		var ih, iht;
		for (ih = 0; ih < top.selectedGroups.length; ih++)
		{
			if (("" + top.selectedGroups[ih]) == cgroupfull) 
			{
				alreadySelected = true;
				// toggle selection off
				// move higher items down to replace current slot
				for (iht = ih + 1; iht < top.selectedGroups.length; iht++)
					top.selectedGroups[iht - 1] = top.selectedGroups[iht];
				top.selectedGroups.length--;
				atomid += " Deselected";
			}
		}

		if (!alreadySelected)
		{
			atomid += " Selected";
			top.selectedGroups[top.selectedGroups.length] = cgroupfull;
		}
	}
	if (selectMode == "a")
	{
//		atomid = "Atom Serial #" + catomserial;

		atomid = "Atom=" + atomString + " (in " + cgroup3 + " " + seqnum;
		if (cchain != "")
			atomid += " Chain=" + cchain;
		// you can hide an atom per model in the all models display
		if (modelString != "")
			atomid += " Model=" + modelString;
		atomid += ")";

		var alreadySelected = false;
		var ih, iht;
		for (ih = 0; ih < top.selectedAtoms.length; ih++)
		{
			var sas = firstWord(top.selectedAtoms[ih]);
			if (sas == catomserial) // works in Gecko, Safari
			{
				alreadySelected = true;
				// toggle selection off
				// move higher items down to replace current slot
				for (iht = ih + 1; iht < top.selectedAtoms.length; iht++)
					top.selectedAtoms[iht - 1] = top.selectedAtoms[iht];
				top.selectedAtoms.length--;
				atomid += " Deselected";
			}
		}

		if (!alreadySelected)
		{
			top.selectedAtoms[top.selectedAtoms.length] = catomserial +
				" " + atomid;
			atomid += " Selected";
		}
	}
	// RANGE: IF CHAIN NAMED, "11-48:A"
	// IF UNNAMED CHAIN, "11-48 and protein" or "11-48 and nucleic"
	// selectedRangeStart format "11 and protein" or "11 and nucleic"
	if (selectMode == "r") // RANGE
	{
		if (cchain == "" && !isStdAA(cgroup3) && !isStdNucleotide(cgroup3))
		{
				alert("What you clicked on appears not\n" +
					"to be a member of a chain. Please\n" +
					"click on a standard residue in a chain.");
		}
		else // cchain != "" || isStdAA(cgroup3) || isStdNucleotide(cgroup3)
		{
			var chainType = " and protein";
			if (isStdNucleotide(cgroup3))
				chainType = " and nucleic";

			// DETECT A CLICK WITHIN AN ALREADY RECORDED RANGE TO DESELECT IT
			var alreadyRanged = false;
			var alreadyRangedIndex;
			var ir;
			for (ir = 0; ir < selectedRanges.length; ir++)
			{
				// EXTRACT r1 (startNumber), r2 (endNumber), and rc (chain name)
				// from each already-recorded range.
				var rr = selectedRanges[ir];
				var r1 = rr.substring(0, rr.indexOf("-"));
				if (cchain == "")
					var r2 = rr.substring(rr.indexOf("-") + 1, rr.indexOf(" "));
				else
					var r2 = rr.substring(rr.indexOf("-") + 1, rr.indexOf(":"));
				if (cchain != "") // get chain name
					var rc = rr.substring(rr.indexOf(":") + 1);

//				alert("moldoc.js #4 r1=" + r1 + " r2=" + r2 + " rc=" + rc);

				var rn1 = parseInt(r1);
				var rn2 = parseInt(r2);
				// put in numeric order
				if (rn1 > rn2) // order reversed
				{
					var rtmp = rn1;
					rn1 = rn2;
					rn2 = rtmp;
				}
//				alert("moldoc.js #4a rn1=" + rn1 + " rn2=" + rn2);

				var nclicked = parseInt(seqnum);
//				alert("moldoc.js #4b rc=" + rc + " cchain=" + cchain
//					+ " nclicked=" + nclicked);
				if (rc == cchain || cchain == "")
				{
					if (nclicked >= rn1 && nclicked <= rn2)
					{
						alreadyRanged = true;
						alreadyRangedIndex = ir;
					}
				}
			}

			if (alreadyRanged) // deselect it
			{
				atomid = "Range " + selectedRanges[alreadyRangedIndex] + " Deselected";
				for (ir = alreadyRangedIndex; (ir + 1) < selectedRanges.length; ir++)
				{
					selectedRanges[ir] = selectedRanges[ir + 1];
				}
				selectedRanges.length--;
			}

			else // NEW RANGE, RECORD IT
			{
				// START A NEW RANGE
				if (selectedRangeStart == "")
				{
					if (cchain == "") // single unnamed chain
						selectedRangeStart = seqnum + chainType; // format "11 and protein"
					else
						selectedRangeStart = seqnum + ":" + cchain; // format "11:A"
					atomid = "Range Started at " + selectedRangeStart;
				}
				else // COMPLETE RANGE STARTED ON PREVIOUS CLICK
				{
					// CHECK FOR CHAIN MISMATCH
					var chainMismatch = false;

					// SAME CHAIN NAME?
					if (cchain != "")
					{
						var startchain = 
							selectedRangeStart.substring(selectedRangeStart.indexOf(":") + 1);
						if (startchain != cchain)
						{
							alert("The range starts in chain " + startchain +
								"\n but your second click was on chain " + cchain +
								".\n A range must begin and end in the same chain.\n" +
								"Please try the second click again, or Cancel.");
							chainMismatch = true;
						}
					}
					else // BLANK CHAIN: both protein or nucleic?
					{
						// startType format " and protein"
						var startType =
							selectedRangeStart.substring(selectedRangeStart.indexOf(" "));
						if (startType != chainType)
						{
							var mmm = "The range starts in " +
							(startType == "p"? "protein":"nucleic acid") +
							"\n but your second click was on "
							(chainType == "p"? "protein":"nucleic acid") +
							".\n Please try the second click again, or Cancel.";
							chainMismatch = true;
						}
					}
					
					// CHAINS MATCH: COMPLETE RANGE
					if (!chainMismatch)
					{
						var startnum;
						if (cchain == "") // Start format "11 and protein"
							startnum =
								selectedRangeStart.substring(0, selectedRangeStart.indexOf(" "));
						else // Start format "11:A"
							startnum = 
								selectedRangeStart.substring(0, selectedRangeStart.indexOf(":"));
		
						if (startnum == seqnum)
							alert("You clicked on sequence number " + seqnum + " twice."
								+ "\n A range must start and end at different numbers."
								+ "\n Please try the second click again, or Cancel.");
						else
						{
							if (cchain == "")
							{
								selectedRanges[selectedRanges.length] =
									startnum + "-" + seqnum + chainType;
							}
							else
							{
								selectedRanges[selectedRanges.length] =
									startnum + "-" + seqnum + ":" + cchain;
							}
							selectedRangeStart = "";
//							alert("moldoc.js #5: added range\n" +
//								selectedRanges[selectedRanges.length - 1]);

							atomid = "Range " + 
								selectedRanges[selectedRanges.length - 1] +
								" Selected";
						}
					} // chain finished
				} // start or finish range
			} // not alreadyRanged
		} // cchain blank?
	} // (selectMode == "r")

	// CONSTRUCT SCRIPT: ECHO ATOM ID TO JMOL 

	var echoId = makeEchoSpt(atomid);

//	alert("moldoc.js #2 echoId=\n" + echoId);

	// SEND SCRIPT TO JMOL

	var targCurrentSpt = makeSelectSpt(); // need to define ~targ_current

	if (contactsShowing)
		targCurrentSpt =
			"select ~targ_current;\n" + // ~targ_current already defined
			markSelected();

	var finalSpt = "# jmolPickCallback();\n" +
		targCurrentSpt + echoId;
	
	doMolViewSpt(finalSpt); // jmolPickCallback(), per-click hiding

	if (selectMode != "")
		top.showHelp2("makePreContactsHelp()"); // in jmolPickCallback()
	else if (hideMode != "")
		top.showHelp2("makeHideHelp()");

	// SEND ATOM ID TO STATUS LINE
	// This must go after the echo, because it puts "Jmol script completed"
	// in the status line.
	//status = atomid;
	// still trumped by "Jmol script completed"
	// try a delay

	AtomId = atomid;

	// Windows 98SE, 10 msec is borderline (sometimes works, sometimes doesn't).
	// 100 msec works. Use 200 to be safe.

	setTimeout("AtomIdToStatus()", 200);

//	if (!top.centerMode)
//		return;

//	alert("moldoc.js: pickcallback centerMode true");

// This method produced unwanted zoom changes.
//	var cspt = p2.substring(p2.indexOf("#") + 1);
//	cspt = "center atomno=" + cspt + ";\n";
//	alert (cspt);

// Attempt to turn of centering after one click failed because
// Jmol does not call pickCallback in set picking center mode!
// See cancelCentering().
//	centeredAtom = p2;
//	cspt = "set picking ident;"

//	scriptToJmol(cspt);
//	top.centerMode = false;
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
function AtomIdToStatus()
{
	status = AtomId;
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

