//
// JavaScript routines for mongo.htm
// written by Jef Rozenski (1998)
// jef.rozenski@rna.pharm.utah.edu
// v2.05 - February 2004
// last modification : v2.06 - June 15th, 2004
//
window.defaultStatus = '';
var sugarA = 99.109,sugarM = 99.0446;
var result,sq,ma,md,dr,p3,p5,sugar,exted,err,outhead,recno,badseq,seqby;
var S="<A HREF='javascript:opener.SetSeq(\"",V="\")'>",Z="</A>";
var maA="average mass",maM="monoisotopic mass";
var posneg0="negative mode",posneg2="positive mode";
var outrec=new Array();  // this will hold all output records
var bases="CUTAG^:#°~)\\JB=/\"+*`',|{[]>?%$!123456789DEFIKLMOPQRSVWXYZN";

function posB(ch) {return bases.indexOf(ch);}  // shortcut to keep data amount small

function mytrans(theseq) // translation of non ASCII characters in string <>
{
return unescape(theseq);  // (have to change rnat2.cgi first)

//var i=theseq.length,j=0;
//while (i>=0)
//  {
//  i = theseq.lastIndexOf('<');
//  j = theseq.lastIndexOf('>');
//  if ((i>=0) && (j>i)) {theseq = theseq.substring(0,i)+theseq.substring(i+1,j)+theseq.substring(j+1,theseq.length);}
//  }

return theseq;
}

var mAX = new Array(7);  // additional average masses
      mAX[1] = 1.00794;  // hydrogen
      mAX[2] = 18.015;   // H2O
      mAX[3] = 79.980;   // HPO3
      mAX[4] = 80.09;    // furan
      mAX[5] = 15.999;   // oxygen
      mAX[6] = 22.9898;  // sodium
      mAX[7] = 39.0983;  // potassium

var mMX = new Array(7);  // additional monoisotopic masses
      mMX[1] = 1.00782;
      mMX[2] = 18.010;
      mMX[3] = 79.966;
      mMX[4] = 80.0262;
      mMX[5] = 15.995;
      mMX[6] = 22.9898;
      mMX[7] = 38.9637;

var mAB = new Array(bases.length);  // average masses for bases
      mAB[posB("C")] = 110.096;mAB[posB("U")] = 111.081;mAB[posB("T")] = 125.108;
      mAB[posB("A")]=134.121;mAB[posB("G")] = 150.121;mAB[posB(":")]=mAB[posB("A")];
      mAB[posB("^")]=mAB[posB("A")];mAB[posB("P")]=mAB[posB("U")];mAB[posB("=")]=148.15;
      mAB[posB("/")]=mAB[posB("=")];mAB[posB("\"")]=mAB[posB("=")];mAB[posB("+")] = 202.24;
      mAB[posB("*")]=248.33;mAB[posB("`")]=218.24;mAB[posB("6")]=279.24;mAB[posB("[")]=325.33;
      mAB[posB("E")]=293.26;mAB[posB("S")]=170.22;mAB[posB("K")]=164.15;mAB[posB("L")]=mAB[posB("K")];
      mAB[posB("7")]=mAB[posB("K")];mAB[posB("#")]=mAB[posB("G")];mAB[posB("R")]=178.17;
      mAB[posB("|")]=mAB[posB("R")];mAB[posB("W")]=407.36;mAB[posB("Y")]=375.36;
      mAB[posB("'")]=124.12;mAB[posB("?")]=mAB[posB("'")];mAB[posB("B")]=mAB[posB("C")];
      mAB[posB("%")]=126.16;mAB[posB("M")]=152.13;mAB[posB(">")]=138.11;mAB[posB("°")]=mAB[posB(">")];
      mAB[posB("I")]=135.11;mAB[posB("O")]=149.13;mAB[posB("Q")]=276.28;mAB[posB("9")]=438.42;
      mAB[posB("8")]=mAB[posB("9")];mAB[posB("D")]=113.10;mAB[posB("2")]=127.15;
      mAB[posB("4")]=mAB[posB("2")];mAB[posB("F")]=141.17;mAB[posB("X")]=212.19;mAB[posB("5")]=141.11;
      mAB[posB("V")]=185.12;mAB[posB(",")]=199.14;mAB[posB("1")]=183.14;mAB[posB("3")]=199.21;
      mAB[posB("{")]=154.15;mAB[posB("~")]=168.13;mAB[posB("\)")]=198.16;mAB[posB("!")]=mAB[posB(")")];
      mAB[posB("$")]=214.22;mAB[posB("J")]=mAB[posB("U")];mAB[posB("\\")]=mAB[posB("T")];
      mAB[posB("]")]=mAB[posB("T")];mAB[posB("Z")]=mAB[posB("J")];mAB[posB("N")]=0;

var mMB = new Array(bases.length);  // monoisotopic masses for bases
      mMB[posB("C")]=110.0354;mMB[posB("U")]=111.0194;mMB[posB("T")]=125.0351;
      mMB[posB("A")]=134.0467;mMB[posB("G")]=150.0416;mMB[posB(":")]=mMB[posB("A")];
      mMB[posB("^")]=mMB[posB("A")];mMB[posB("P")]=mMB[posB("U")];mMB[posB("=")]=148.0623;
      mMB[posB("/")]=mMB[posB("=")];mMB[posB("\"")]=mMB[posB("=")];mMB[posB("+")]=202.1093;
      mMB[posB("*")]=248.0970;mMB[posB("`")]=218.1042;mMB[posB("6")]=279.0842;mMB[posB("[")]=325.0719;
      mMB[posB("E")]=393.0998;mMB[posB("S")]=170.0388;mMB[posB("K")]=164.0572;mMB[posB("L")]=mMB[posB("K")];
      mMB[posB("7")]=mMB[posB("K")];mMB[posB("#")]=mMB[posB("G")];mMB[posB("R")]=178.0729;
      mMB[posB("|")]=mMB[posB("R")];mMB[posB("W")]=407.1315;mMB[posB("Y")]=375.1417;
      mMB[posB("'")]=124.0511;mMB[posB("?")]=mMB[posB("'")];mMB[posB("B")]=mMB[posB("C")];
      mMB[posB("%")]=126.0126;mMB[posB("M")]=152.0460;mMB[posB(">")]=138.0303;mMB[posB("°")]=mMB[posB(">")];
      mMB[posB("I")]=135.0307;mMB[posB("O")]=149.0463;mMB[posB("Q")]=276.1097;mMB[posB("9")]=438.1625;
      mMB[posB("8")]=mMB[posB("9")];mMB[posB("D")]=113.0351;mMB[posB("2")]=126.9966;
      mMB[posB("4")]=mMB[posB("2")];mMB[posB("F")]=141.0123;mMB[posB("X")]=212.0671;mMB[posB("5")]=141.0300;
      mMB[posB("V")]=185.0198;mMB[posB(",")]=199.0355;mMB[posB("1")]=183.0406;mMB[posB("3")]=199.0177;
      mMB[posB("{")]=154.0616;mMB[posB("~")]=168.0409;mMB[posB(")")]=198.0515;mMB[posB("!")]=mMB[posB(")")];
      mMB[posB("$")]=214.0286;mMB[posB("J")]=mMB[posB("U")];mMB[posB("\\")]=mMB[posB("T")];
      mMB[posB("]")]=mMB[posB("T")];mMB[posB("Z")]=mMB[posB("J")];mMB[posB("N")]=0;

var mAS = new Array(bases.length);  // average mod mass for sugar [if not in list, (deoxy)ribose is assumed]
      mAS[posB(":")]=14.03;mAS[posB("^")]=mAX[3];mAS[posB("°")]=mAS[posB(":")];mAS[posB("|")]=mAS[posB(":")];
      mAS[posB("#")]=mAS[posB(":")];mAS[posB("B")]=mAS[posB(":")];
      mAS[posB("~")]=mAS[posB(":")];mAS[posB(")")]=mAS[posB(":")];mAS[posB("J")]=mAS[posB(":")];
      mAS[posB("\\")]=mAS[posB(":")];mAS[posB("Z")]=mAS[posB(":")];

var mMS = new Array(bases.length+1);  // monoisotopic mod mass for sugar
      mMS[posB(":")]=14.0156;mMS[posB("^")]=mMX[3];mMS[posB("°")]=mMS[posB(":")];mMS[posB("|")]=mMS[posB(":")];
      mMS[posB("#")]=mMS[posB(":")];mMS[posB("B")]=mMS[posB(":")];
      mMS[posB("~")]=mMS[posB(":")];mMS[posB(")")]=mMS[posB(":")];mMS[posB("J")]=mMS[posB(":")];
      mMS[posB("\\")]=mMS[posB(":")];mMS[posB("Z")]=mMS[posB(":")];

var Bref = new Array(bases.length);  // reference in mod database
      Bref[posB("C")]="C";Bref[posB("U")]="U";Bref[posB("T")]=52;
      Bref[posB("A")]="A";Bref[posB("G")]="G";
      Bref[posB(":")]=4;Bref[posB("^")]=16;Bref[posB("P")]=50;Bref[posB("=")]=3;Bref[posB("/")]=2;
      Bref[posB("\"")]=1;Bref[posB("+")]=6;Bref[posB("*")]=7;Bref[posB("`")]=8;Bref[posB("6")]=11;
      Bref[posB("[")]=12;Bref[posB("E")]=13;Bref[posB("S")]=73;Bref[posB("K")]=29;Bref[posB("L")]=30;
      Bref[posB("7")]=31;Bref[posB("#")]=32;Bref[posB("R")]=33;Bref[posB("|")]=35;Bref[posB("W")]=38;
      Bref[posB("Y")]=37;Bref[posB("'")]=20;Bref[posB("?")]=21;Bref[posB("B")]=22;Bref[posB("%")]=23;
      Bref[posB("M")]=24;Bref[posB(">")]=25;Bref[posB("°")]=95;Bref[posB("I")]=17;Bref[posB("O")]=18;
      Bref[posB("Q")]=43;Bref[posB("9")]=45;Bref[posB("8")]=46;Bref[posB("D")]=51;Bref[posB("2")]=57;
      Bref[posB("4")]=58;Bref[posB("F")]=59;Bref[posB("X")]=61;Bref[posB("5")]=63;Bref[posB("V")]=64;
      Bref[posB(",")]=67;Bref[posB("1")]=68;Bref[posB("3")]=70;Bref[posB("{")]=72;Bref[posB("~")]=76;
      Bref[posB(")")]=78;Bref[posB("!")]=77;Bref[posB("$")]=79;Bref[posB("J")]=53;Bref[posB("\\")]=54;
      Bref[posB("]")]=55;Bref[posB("Z")]=56;Bref[posB("N")]=0;

var NN = new Array(bases.length);  // abbreviations
      NN[posB("C")]='C';NN[posB("U")]='U';NN[posB("T")]='T';NN[posB("A")]='A';NN[posB("G")]='G';
      NN[posB(":")]='Am';NN[posB("^")]='Arp';NN[posB("P")]="<FONT FACE='symbol'>Y</FONT>";NN[posB("=")]='m<SUP>6</SUP>A';NN[posB("/")]='m<SUP>2</SUP>A';
      NN[posB("\"")]='m<SUP>1</SUP>A';NN[posB("+")]='i<SUP>6</SUP>A';NN[posB("*")]='ms<SUP>2</SUP>i<SUP>6</SUP>A';NN[posB("`")]='io<SUP>6</SUP>A';NN[posB("6")]='t<SUP>6</SUP>A';
      NN[posB("[")]='ms<SUP>2</SUP>t<SUP>6</SUP>A';NN[posB("E")]='m<SUP>6</SUP>t<SUP>6</SUP>A';NN[posB("S")]='mnm<SUP>5</SUP>s<SUP>2</SUP>U';NN[posB("K")]='m<SUP>1</SUP>G';NN[posB("L")]='m<SUP>2</SUP>G';
      NN[posB("7")]='m<SUP>7</SUP>G';NN[posB("#")]='Gm';NN[posB("R")]='m<SUP>2</SUP><SUB>2</SUB>G';NN[posB("|")]='m<SUP>2</SUP><SUB>2</SUB>Gm';NN[posB("W")]='oyW';
      NN[posB("Y")]='yW';NN[posB("'")]='m<SUP>3</SUP>C';NN[posB("?")]='m<SUP>5</SUP>C';NN[posB("B")]='Cm';NN[posB("%")]='s<SUP>2</SUP>C';
      NN[posB("M")]='ac<SUP>4</SUP>C';NN[posB(">")]='f<SUP>5</SUP>C';NN[posB("°")]='f<SUP>5</SUP>Cm';NN[posB("I")]='I';NN[posB("O")]='m<SUP>1</SUP>I';
      NN[posB("Q")]='Q';NN[posB("9")]='galQ';NN[posB("8")]='manQ';NN[posB("D")]='D';NN[posB("2")]='s<SUP>2</SUP>U';
      NN[posB("4")]='s<SUP>4</SUP>U';NN[posB("F")]='m<SUP>5</SUP>s<SUP>2</SUP>U';NN[posB("X")]='acp<SUP>3</SUP>U';NN[posB("5")]='mo<SUP>5</SUP>U';NN[posB("V")]='cmo<SUP>5</SUP>U';
      NN[posB(",")]='mchm<SUP>5</SUP>U';NN[posB("1")]='mcm<SUP>5</SUP>U';NN[posB("3")]='mcm<SUP>5</SUP>s<SUP>2</SUP>U';NN[posB("{")]='mnm<SUP>5</SUP>U';NN[posB("~")]='ncm<SUP>5</SUP>Um';
      NN[posB(")")]='cmnm<SUP>5</SUP>Um';NN[posB("!")]='cmnm<SUP>5</SUP>U';NN[posB("$")]='cmnm<SUP>5</SUP>s<SUP>2</SUP>U';NN[posB("J")]='Um';NN[posB("\\")]='m<SUP>5</SUP>Um';
      NN[posB("]")]="m<SUP>1</SUP><FONT FACE='symbol'>Y</FONT>";NN[posB("Z")]="<FONT FACE='symbol'>Y</FONT>m";NN[posB("N")]='user defined';

var massX=new Array(bases.length),massS=new Array(bases.length),massB=new Array(bases.length);

var maxlen = new Array(8);  // maximum allowable length of sequence for output
      maxlen[0] = 999999;maxlen[1] = 200;   maxlen[2] = 25;    maxlen[3] = 25; maxlen[4] = 200;
      maxlen[5] = 999999;maxlen[6] = 999999;maxlen[7] = 999999;maxlen[8] = 200;maxlen[9] = 200;
      maxlen[10] = 0;

function SetStatus(nr)  // status bar messages
{
var msgs = new Array();
      msgs[1]= "enter your sequence here";
      msgs[2]= "the average mass is the weighed average of all atom isotopes in the molecule";
      msgs[3]= "the monoisotopic mass is the summ of the masses of the most abundant isotopes in the molecule";
      msgs[4]= "select the approprate ionization mode";
      msgs[5]= "this selects the type of the oligonucleotide";
      msgs[6]= "set the 5' terminal end to OH or to phosphate";
      msgs[7]= "set the 3' terminal end to OH, phosphate (p) or cyclic phosphate (>p)";
      msgs[8]= "checking this option will include a 'close' button in the output";
      msgs[9]= "checking this option will include the current settings in the output";
      msgs[10]= "this option gives more detailed output";
      msgs[11]= "warnings and error messages will be disabled if this option is checked";
      msgs[12]= "checking this option will sort the output by mass";
      msgs[13]= "select the desired calculation and press 'calculate'; see 'help' for more details";
      msgs[14]= "select a memory location to store the sequence and press 'store'; use 'restore' to retrieve the entry";
      msgs[15]= "this determines the output format for a sequence: in groups of 3, 10 or 50 nucleotides";
      msgs[16]= "enter here the base anion mass";
      msgs[17]= "enter here the mass to be added to regular ribose (for RNA) or deoxyribose (for DNA)";
      msgs[18]= "checking this option will also output undercut enzymatic fragments";
window.status = msgs[nr];
}

function HelpMe()  // display help
{
result = window.open("mongohlp.htm","","resizable=1,menubar=1,scrollbars=1,width=600,height=425");
result.document.close();
result.focus();
}

function myalert(nr)  // show alertbox if necessary
{
if (!document.forms[0].alertbt.checked) {return;}
var msgs = new Array();
      msgs[1] = "Please enter a sequence";
      msgs[2] = "Cannot calculate, sequence too long";
      msgs[3] = "You have to select a memory location first in order to store and restore sequences";
      msgs[4] = "Cannot store an empty sequence";
      msgs[100] = "This enzyme works only on RNA.\nContinue anyway?";
      msgs[101] = badseq;
if (nr<100) {alert(msgs[nr]);}
else {if (confirm(msgs[nr])) {--err}}
++err;
}

function storeit()
{
if (document.forms[0].selmem.selectedIndex == 0) {myalert(3);return;}
if (document.forms[0].seq.value.length == 0) {myalert(4);return;}
var shortseq =  (document.forms[0].seq.value.length > 15)?(document.forms[0].seq.value.substring(0,15)+"..."):document.forms[0].seq.value;
eval("document.forms[0].selmem.options[document.forms[0].selmem.selectedIndex].value = document.forms[0].seq.value");
eval("document.forms[0].selmem.options[document.forms[0].selmem.selectedIndex].text = shortseq");
}

function restoreit()
{
if (document.forms[0].selmem.selectedIndex == 0) {myalert(3);return;}
document.forms[0].seq.value = eval("document.forms[0].selmem.options[document.forms[0].selmem.selectedIndex].value");
}

function clearit()
{
for (var i=1;i<6;++i)
  {
  document.forms[0].selmem.options[i].value = "";
  document.forms[0].selmem.options[i].text = i+": (empty)";
  }
}

function RNAmods(i)
{
var outp = bases.charAt(i);
if (i<0)
  {
  outp = "The RNA Modification Database".link("RNAmods/");
  }
if ((typeof Bref[i] == "number") && (Bref[i]>0))
  {
  outp = outp.link("cgi-bin/rnashow.cgi?"+("000"+Bref[i]).substring(("000"+Bref[i]).length-3,("000"+Bref[i]).length));
  }  
if (typeof Bref[i] != "number")
  {
  outp = outp.link("cgi-bin/rnafind.cgi?NAM=1&NUC="+bases.charAt(i));
  }
return outp;
}

function ScanSeq(sq)  // check sequence for errors and unknow residues
{
var i,myseq = "",ch = "";
badseq = "";
for (i=0;i<sq.length;++i)
  {
  ch = sq.charAt(i);
  if (posB(ch)>=0) {myseq += ch;}
  else
    {
    if (ch.length==escape(ch).length)
      {
      badseq += "invalid residue: "+ch+" position: "+(i+1)+"\n";
      }
    }
  }
if (badseq.length>0) {badseq += "Ignore and continue anyway?";myalert(101);}
return myseq;
}

function SetSeq(sq)  // set sequence and options in document form
{
var i,j;
i = (sq.substring(0,1)=='p')?1:0;
document.forms[0].p5[i].click();
if (sq.substring(sq.length-2,sq.length)=='>p') {j=2}
else {j = (sq.substring(sq.length-1,sq.length)=='p')?1:0;}
document.forms[0].p3[j].click();
document.forms[0].seq.value=sq.substring(i,sq.length-j);
document.forms[0].seq.focus();
}

function cleanseq()
{
var bases = 'CTAGU',i,seq, newstr;
seq = document.forms[0].seq.value;
newstr = '';
for (i=0;i<seq.length;++i)
  {
  if (bases.indexOf(seq.charAt(i).toUpperCase()) >= 0)
    {newstr += seq.charAt(i).toUpperCase();}
  }
document.forms[0].seq.value = newstr;
}

function DNA2RNA()
{
var DNAbase = 'CTAG', RNAbase = 'GAUC',i,j,seq, newstr;
seq = document.forms[0].seq.value;
newstr = '';
for (i=0;i<seq.length;++i)
  {
  j = DNAbase.indexOf(seq.charAt(i).toUpperCase());
  if (j >= 0) {newstr += RNAbase.charAt(j);}
  }
document.forms[0].seq.value = newstr;
}

function RNA2DNA()
{
var DNAbase = 'CTAG', RNAbase = 'GAUC',i,j,seq, newstr;
seq = document.forms[0].seq.value;
newstr = '';
for (i=0;i<seq.length;++i)
  {
  j = RNAbase.indexOf(seq.charAt(i).toUpperCase());
  if (j >= 0) {newstr += DNAbase.charAt(j);}
  }
document.forms[0].seq.value = newstr;
}

function CalcSeq(sq,addm)  // calulate mass, addm = offset
{
var i,p;
var mass = addm-massX[3]+massX[2];  // -PO3 + H2O

for (i=0;i<sq.length;i++)
  {
  p = posB(sq.charAt(i));
  mass += (sugar+massB[p]+massX[3]);
  if (massS[p] != null) {mass += massS[p];}
  }
return mass;
}

function str(istr,strlen,dec)  // format a string or value for output
{
var i;
var mystr = ""+istr;
if (str.arguments.length > 2)
  {
  var decpt = mystr.indexOf(".");
  if (decpt<0) {mystr += "."};
  decpt = mystr.indexOf(".");
  if (dec>0)
    {
    for (i=0;i<dec;++i) {mystr += "0";}
    mystr = mystr.substring(0,(decpt+dec+1));
    }
  else
    {
    if (dec<0) {mystr = mystr.substring(0,decpt)}
    else {mystr = mystr.substring(0,decpt+1)}
    }
  for (i=mystr.length;i<strlen;++i) {mystr = " "+mystr;}
  }
else
  {
  for (i=mystr.length;i<strlen;++i) {mystr += " ";}
  }
return mystr;
}

function Calc0()  // molecular mass
{
var charge = sq.length-1;
var addm = 0;
if (p5=="p"){addm += massX[3];++charge;}
if (p3=="p"){addm += massX[3];++charge;}
if (p3==">p"){addm += (massX[3]-massX[2]);++charge;}
var mw = CalcSeq(sq,addm);
outhead += "M ="+str(mw,10,3)+"     [M+H]+ ="+str(mw+massX[1],10,3)+"     [M-H]- ="+str(mw-massX[1],10,3);
}

function Calc1()  // electrospray series
{
var charge = sq.length-1;
var addm = 0;
if (p5=="p"){addm += massX[3];++charge;}
if (p3=="p"){addm += massX[3];++charge;}
if (p3==">p"){addm += (massX[3]-massX[2]);++charge;}
var mw = CalcSeq(sq,addm);
outhead += "   ch     m/z";
if (exted) {outhead += "       M+Na      M+K      M+2Na";}
outhead += "\n\n";
for (i=1;i<=charge;++i)
  {
  outhead += str(md*i,5,-1)+str((mw+md*i*massX[1])/i,10,3);
  if (exted)
    {
    outhead += str((mw+massX[6]-massX[1]+md*i*massX[1])/i,10,3);
    outhead += str((mw+massX[7]-massX[1]+md*i*massX[1])/i,10,3);
    outhead += str((mw+2*massX[6]-2*massX[1]+md*i*massX[1])/i,10,3);
    }
  if (i<charge) {outhead += "\n"};
  }
}

function Calc2()  // CID fragments
{
var i,j,wion,aion,yion,dion,ch5 = 0,ch3 = 0;
var x5 = massX[4]+massX[3];
if (dr=="RNA") {x5 += massX[5];}
var x3 = massX[3];
if (p5=="p"){x5 += massX[3];++ch5}
if (p3=="p"){x3 += massX[3];++ch3;}
if (p3==">p"){x3 += (massX[3]-massX[2]);++ch3;}
if (sorted) {outhead += "     m/z     ion  n   ch";}
else {outhead += "    n   ch      a-B        w";if (exted) {outhead += "         y       d-H2O";}}
outhead += "\n";
for (i=1;i<sq.length;++i)
  {
  wion = CalcSeq(sq.substring(sq.length-i,sq.length),x3);
  yion = CalcSeq(sq.substring(sq.length-i,sq.length),x3-massX[3]);
  aion = CalcSeq(sq.substring(0,i-1),x5+((massS[posB(sq.charAt(i-1))] == null)?0:massS[posB(sq.charAt(i-1))]));
  dion = CalcSeq(sq.substring(0,i),massX[3]-massX[2]);
  charge = (((ch3==1) || (ch5==1))?1:0)+i;
  for (j=1;j<=charge;++j)
    {
    if (sorted)
      {
      if (j<(i+ch5) && (i>1))
        {
        outrec[recno] = str((aion+md*j*massX[1])/j,10,3);
        outrec[recno] += (str("a-"+sq.charAt(i-1),6,-1)+str(i,3,-1)+str("["+md*j+"]",6,-1)).fontcolor("red");
        ++recno;
        }
      if (j<=(i+ch3))
        {
        outrec[recno] = str((wion+md*j*massX[1])/j,10,3);
        outrec[recno] += str("w",6,-1)+str(i,3,-1)+str("["+md*j+"]",6,-1);
        ++recno;
        }
      if ((j<=(i+ch3)) && exted)
        {
        outrec[recno] = str((yion+md*j*massX[1])/j,10,3);
        outrec[recno] += (str("y",6,-1)+str(i,3,-1)+str("["+md*j+"]",6,-1)).fontcolor("purple");
        ++recno;
        }
      if ((j<=(i+ch5)) && exted)
        {
        outrec[recno] = str((dion+md*j*massX[1])/j,10,3);
        outrec[recno] += (str("d-H2O",6,-1)+str(i,3,-1)+str("["+md*j+"]",6,-1)).fontcolor("maroon");
        ++recno;
        }
      }
    else
      {
      if (j==1) {outrec[recno] = str(i,5,-1);} else {outrec[recno] = "     ";}
      outrec[recno] += str(md*j,5,-1);
      if (j<(i+ch5) && (i>1)){outrec[recno] += str((aion+md*j*massX[1])/j,10,3).fontcolor("red");}
      else {outrec[recno] += "          ";}
      if (j<=(i+ch3)) {outrec[recno] += str((wion+md*j*massX[1])/j,10,3);}
      else {outrec[recno] += "          ";}
      if ((j<=(i+ch3)) && exted) {outrec[recno] += str((yion+md*j*massX[1])/j,10,3).fontcolor("purple");}
      else {outrec[recno] += "          ";}
      if ((j<=(i+ch5)) && exted) {outrec[recno] += str((dion+md*j*massX[1])/j,10,3).fontcolor("maroon");}
      else {outrec[recno] += "          ";}
      ++recno;
      }
    }
  }
}

function Calc3()  // internal fragments
{
var i,j,k,mw;
if (sorted) {var charge = 1;outhead += "     m/z         pos  ch   seq\n"}
else
  {
  var charge = Math.min(5,sq.length-2);
  outhead += "       pos";
  for (i=1;i<=charge;++i) {outhead += str(i*md,7,-1)+"   ";}
  outhead += "\n";
  }
for (i=1;i<sq.length;++i)
  {
  for (j=i+1;j<(sq.length);++j)
    {
    mw = CalcSeq(sq.substring(i,j),massX[4]+2*massX[3]+((dr=="RNA")?massX[5]:0))+((massS[posB(sq.charAt(j))] == null)?0:massS[posB(sq.charAt(j))]);
    for (k=1;k<=Math.min((j-i),charge);++k)
      {
      if (sorted)
        {
        outrec[recno] = str((mw+md*k*massX[1])/k,10,3);
        outrec[recno] += str(sq.charAt(i)+(i+1)+":"+sq.charAt(j-1)+j,10,-1)+str("["+md*k+"]",5,-1)+"  ";
        outrec[recno] += "p"+sq.substring(i,j)+"pf";
        ++recno;
        }
      else
        {
        if (k==1) {outrec[recno] = str(sq.charAt(i)+(i+1)+":"+sq.charAt(j-1)+j,10,-1);}
        outrec[recno] += str((mw+md*k*massX[1])/k,10,3);
        }
      }
      if (! sorted) {++recno;}
    }
  }
}

function Calc4()  // base loss
{
var i,j,k;
var charge = sq.length-1;
var addm = 0;
if (p5=="p"){addm += massX[3];++charge;}
if (p3=="p"){addm += massX[3];++charge;}
if (p3==">p"){addm += (massX[3]-massX[2]);++charge;}
var mw = CalcSeq(sq,addm);
outhead += (sorted)? "     m/z       ion  ch\n":" base   ch     M-B       M-BH\n";
for (i=0;i<bases.length;++i)
  {
  k = sq.indexOf(bases.charAt(i));
  if (k>=0)
    {
    for (j=1;j<=charge;++j)
      {
      if (sorted)
        {
        outrec[recno] = str((mw-massB[i]+md*j*massX[1])/j,10,3);
        outrec[recno] += (str("M-"+bases.charAt(i),8,-1)+str("["+md*j+"]",6,-1)).fontcolor("red");
        ++recno;
        outrec[recno] = str((mw-massB[i]-massX[1]+md*j*massX[1])/j,10,3);
        outrec[recno] += str("M-"+bases.charAt(i)+"H",8,-1)+str("["+md*j+"]",6,-1);
        ++recno;
        }
      else
        {
        if (j==1) {outrec[recno] = str(bases.charAt(i),5,-1);}
        else {outrec[recno] = "     ";}
        outrec[recno] += str(md*j,5,-1)+str((mw-massB[i]+md*j*massX[1])/j,10,3).fontcolor("red");
        outrec[recno] += str((mw-massB[i]-massX[1]+md*j*massX[1])/j,10,3);
        ++recno;
        }
      }

    }
  }
}

function Calc5()  // RNAse T1 digest
{
DigestAt("G");
}

function Calc6()  // RNAse U2 digest
{
DigestAt("A");
}

function Calc7()  // RNase A digest
{
DigestAt("TCU");
}

function Calc8()  // 5' exonuclease
{
var i,j,pseq,addm = 0;
outhead += (sorted)?"      mass         pos  sequence\n":"         pos     mass   sequence\n";
if (p3=="p") {addm = massX[3];}
if (p3==">p") {addm = massX[3]-massX[2];}
for (i=0;i<sq.length;++i)
  {
  if (i==0 & p5=="p") {j = massX[3];} else {j = 0;}
  mw = CalcSeq(sq.substring(i,sq.length),addm+j);
  if (sorted)
  {
  outrec[recno] = str(mw,10,3);
  outrec[recno] += str(sq.charAt(i)+(i+1)+":"+sq.charAt(sq.length-1)+(sq.length),12,-1)+"  ";
  }
  else
  {
  outrec[recno] = str(sq.charAt(i)+(i+1)+":"+sq.charAt(sq.length-1)+(sq.length),12,-1);
  outrec[recno] += str(mw,10,3)+"  ";
  }
  pseq = "";
  if (i==0 & (p5 != "OH")) {pseq += p5;}
  pseq += sq.substring(i,sq.length);
  if (p3 != "OH") {pseq += p3;}
  outrec[recno] += S+pseq+V+pseq+Z;;
  ++recno;
  }
}

function Calc9()  // 3' exonuclease
{
var i,j,pseq,addm = 0;
outhead += (sorted)?"      mass         pos  sequence\n":"         pos     mass   sequence\n";
if (p5=="p") {addm = massX[3];}
for (i=sq.length-1;i>=0;--i)
  {
  j = 0;
  if (i==(sq.length-1) & (p3=="p")) {j = massX[3];}
  if (i==(sq.length-1) & (p3==">p")) {j = massX[3]-massX[2];}
  mw = CalcSeq(sq.substring(0,i+1),addm+j);
  if (sorted)
  {
  outrec[recno] = str(mw,10,3);
  outrec[recno] += str(sq.charAt(0)+1+":"+sq.charAt(i)+(i+1),12,-1)+"  ";
  }
  else
  {
  outrec[recno] = str(sq.charAt(0)+1+":"+sq.charAt(i)+(i+1),12,-1);
  outrec[recno] += str(mw,10,3)+"  ";
  }
  pseq = "";
  if (p5 != "OH") {pseq += p5;}
  pseq += sq.substring(0,i+1);
  if (i==(sq.length-1) & (p3 != "OH")) {pseq += p3;}
  outrec[recno] += S+pseq+V+pseq+Z;;
  ++recno;
  }
}

function Calc10()  // modified RNA list
{
var i,amass,bmass,smass;
if (!sorted) {outhead += " symbol";}
outhead +=" base mass sugar mod";
if (exted)
  {
  outhead += "      N         Np       N>p   ";
  }
outhead += (sorted)?" symbol\n":"\n";

for (i=0;i<bases.length;++i)
  {
  smass = (eval("m"+ma+"S["+i+"]")==null)?0.0:eval("m"+ma+"S["+i+"]");
  amass = eval("smass+m"+ma+"B["+i+"]+sugar+m"+ma+"X[2]+md*m"+ma+"X[1]");
  bmass = eval("m"+ma+"B["+i+"]+m"+ma+"X[1]+md*m"+ma+"X[1]");
  if (sorted)
    {
    outrec[recno] = str(bmass,10,3);
    outrec[recno] += (smass == 0)?str(" ",10):str(smass,10,3);
    if (exted)
      {
      outrec[recno] += str(amass,10,3);
      outrec[recno] += str(eval("amass+m"+ma+"X[3]"),10,3);
      outrec[recno] += str(eval("amass+m"+ma+"X[3]-m"+ma+"X[2]"),10,3);
      }
    outrec[recno] += "    "+RNAmods(i)+"   "+NN[i];
    }
  else
    {
    outrec[recno] = "    "+RNAmods(i);
    outrec[recno] += str(bmass,12,3);
    outrec[recno] += (smass == 0)?str(" ",10):str(smass,10,3);
    if (exted)
      {
      outrec[recno] += str(amass,10,3);
      outrec[recno] += str(eval("amass+m"+ma+"X[3]"),10,3);
      outrec[recno] += str(eval("amass+m"+ma+"X[3]-m"+ma+"X[2]"),10,3);
      }
    outrec[recno] += "   "+NN[i];
    }
  ++ recno;
  }
outrec[recno] = "...\n\nsee also the "+RNAmods(-1);
++ recno;
}

function DigestAt(nucs)
{
if (dr != "RNA") {myalert(100);if (err>0) {return;}}
var seq=sq,goon,stopit;
var jj,j,i,mw,s;
var q5="",q3="",addm=0,k=0;
outhead += (sorted)?"      mass         pos":"         pos      mass";
if (!sorted & exted) {outhead += "      3'>p";}
outhead += "  sequence\n";
var goon = true;
while (goon)
  {
  for(i=0;i<seq.length;++i)
    {
    if ((nucs.indexOf(seq.charAt(i))<0) && (i<(seq.length-1))) {continue;}
    j=i;
    s = seq.substring(0,j+1);
    stopit = false;
    for (jj=0;jj<nucs.length;++jj)
      {
      if ((s.indexOf(nucs.charAt(jj)) < (s.length-1)) && (s.indexOf(nucs.charAt(jj)) >= 0))
        {
        stopit = true;
        }
      }
    if ((!document.forms[0].uncutbt.checked) && (stopit)) {break;}
    if (j==seq.length-1) {q3 = "";} else {q3 = "p";}
    if ((k+j)<sq.length-1) {addm = massX[3];} else {addm = 0;}
    if ((sq==seq) && (p5 != "OH")) {addm += massX[3];q5 = p5;} else {q5 = "";}
    if (((k+j)==sq.length-1) && (p3=="p")) {addm += massX[3];q3 = "p";}
    if (((k+j)==sq.length-1) && (p3==">p")) {addm += massX[3]-massX[2];q3 = ">p";}

    mw = CalcSeq(s,addm);
    if (sorted)
      {
      pseq = q5+s+q3;
      outrec[recno] = str(mw,10,3);
      outrec[recno] += str(sq.charAt(k)+(k+1)+":"+sq.charAt(j+k)+(j+k+1),12,-1)+"  ";
      outrec[recno] += S+pseq+V+pseq+Z;
      ++recno;
      if ((exted) && ((j+k)<sq.length-1))
        {
        pseq = q5+s+">p";
        outrec[recno] = str(mw-massX[2],10,3);
        outrec[recno] += str(sq.charAt(k)+(k+1)+":"+sq.charAt(j+k)+(j+k+1),12,-1)+"  ";
        outrec[recno] += S+pseq+V+pseq+Z;
        ++recno;
        }
      }
    else
      {
      pseq = q5+s+q3;
      outrec[recno] = str(sq.charAt(k)+(k+1)+":"+sq.charAt(j+k)+(j+k+1),12,-1)+str(mw,10,3);
      if (exted) {outrec[recno] += ((j+k)<sq.length-1)?str(mw-massX[2],10,3):"          ";}
      outrec[recno] += "  "+S+pseq+V+pseq+Z;
      ++recno;
      }
    }
  for(i=0;i<seq.length;++i)
    {
    if (nucs.indexOf(seq.charAt(i))>=0) {break;}
    }
  seq = seq.substring(i+1,seq.length);
  k += (i+1);
  goon = (seq.length>0);
  }
}

function DoCalc()
{
var i=0,j=0;
err = 0;
if ((document.forms[0].seq.value=="") & !document.forms[0].sel[10].selected)
  {myalert(1);return;}
outhead = "<HTML><HEAD><TITLE>Mongo Oligo v2.06 Output</TITLE><BASE HREF='http://medlib.med.utah.edu/'></HEAD>"
outhead += "<BODY BGCOLOR='#FFCCCC' TEXT='#000000' LINK='#0000FF' VLINK='#FF00FF'><PRE>";
for (i=0;i<document.forms[0].dr.length;++i)
  {if (document.forms[0].dr[i].checked){dr = document.forms[0].dr[i].value;break;}}
for (i=0;i<document.forms[0].p5.length;++i)
  {if (document.forms[0].p5[i].checked){p5 = document.forms[0].p5[i].value;break;}}
for (i=0;i<document.forms[0].p3.length;++i)
  {if (document.forms[0].p3[i].checked){p3 = document.forms[0].p3[i].value;break;}}
for (i=0;i<document.forms[0].ma.length;++i)
  {if (document.forms[0].ma[i].checked){ma = document.forms[0].ma[i].value;break;}}
for (i=0;i<document.forms[0].md.length;++i)
  {if (document.forms[0].md[i].checked){md = document.forms[0].md[i].value;break;}}
for (i=0;i<document.forms[0].seqby.length;++i)
  {if (document.forms[0].seqby[i].checked){seqby = parseInt(document.forms[0].seqby[i].value);break;}}

sq = ScanSeq(document.forms[0].seq.value.toUpperCase());
if (err>0) {return;}

sorted = (document.forms[0].sortdbt.checked);
exted  = (document.forms[0].extedbt.checked);

massX = eval("m"+ma+"X");
massB = eval("m"+ma+"B");
massS = eval("m"+ma+"S");

i = document.forms[0].bam.value.toUpperCase();
if (i.indexOf("=")>=0)
  {massB[posB("N")] = massB[posB(i.substr(1,1))];}
else
  {massB[posB("N")] = (i.length > 0)?parseFloat(i):0;}
i = document.forms[0].sam.value.toUpperCase();
if (i.indexOf("=")>=0)
  {massS[posB("N")] = massS[posB(i.substr(1,1))];}
else
  {massS[posB("N")] = (i.length > 0)?parseFloat(i):0;}

sugar = eval("sugar"+ma);
if (dr=="RNA") {sugar += massX[5]};

if (document.forms[0].statsbt.checked)
  {
  outhead += "<B>Sequence : \n<FONT COLOR='red'>";
  for (i=0;i<sq.length;i+=seqby)
    {
    outhead += sq.substring(i,i+seqby)+" ";
    j += seqby;
    if (j>49) {outhead+="\n";j=0;}
    }
  outhead += "</FONT></B><HR>"
  outhead += "<FONT COLOR='green'>5'"+p5+" - "+dr+"["+sq.length+"mer] - 3'"+p3+"\n";
  var countb = new Array(bases.length-1);
  for (i=0;i<bases.length;++i) {countb[i] = 0;}
  for (i=0;i<sq.length;++i)
    {
    j = posB(sq.charAt(i));
    if (j>=0) {++countb[j];}
    }
  for (i=0;i<bases.length;++i)
    {
    if (countb[i]>0) {outhead += RNAmods(i)+":"+countb[i]+"  ";}
    }
  if (sq.toUpperCase().indexOf('N') >= 0)
    {
    outhead += "\nN (base)      :"+str(massB[posB('N')],10,3);
    outhead += "\nN (sugar mod) :"+str(massS[posB('N')],10,3);
    }
  outhead += "\n"+eval("ma"+ma)+", "+eval("posneg"+(parseInt(md)+1))+"</FONT>\n";
  }
  for (i=0;i<document.forms[0].sel.length;++i)
  {
  if ((document.forms[0].sel[i].selected) && (document.forms[0].uncutbt.checked) && ("567".indexOf(i)>=0))
    {
    outhead += "<FONT COLOR='green'>undercuts allowed</FONT>\n";
    break;
    }
  } 

result = window.open("","result","resizable=1,menubar=1,scrollbars=1,width=550,height=350");
result.opener = self;
result.document.clear();
result.document.writeln(outhead);

for (i=0;i<document.forms[0].sel.length;++i)
  {
  if (document.forms[0].sel[i].selected)
    {
    outhead = document.forms[0].sel[i].value.toUpperCase().bold()+"\n\n";
    if ((i<10) && (sq.length>maxlen[i])) {myalert(2);return;}
    outrec = new Array();
    recno = 0;
    eval("Calc"+i+"()");
    result.document.writeln(outhead);
    if (sorted) outrec.sort();
    for (j=0;j<outrec.length;++j) {result.document.writeln(outrec[j]);}
    result.document.writeln();
    }
  }

result.document.write("</PRE>");
if (document.forms[0].closebt.checked)
  {
  result.document.write("<FORM><INPUT TYPE='button' VALUE=' Close ' onClick='window.close()'></FORM>");
  }
result.document.write("</BODY></HTML>");
result.document.close();
if (err == 0) {result.focus();}
}