  function replace(string,text,by) {
// Replaces text with by in string
    var strLength = string.length, txtLength = text.length;
    if ((strLength == 0) || (txtLength == 0)) return string;

    var i = string.indexOf(text);
    if ((!i) && (text != string.substring(0,txtLength))) return string;
    if (i == -1) return string;

    var newstr = string.substring(0,i) + by;

    if (i+txtLength < strLength)
        newstr += replace(string.substring(i+txtLength,strLength),text,by);

    return newstr;
}

  function checkMe(){
			var newstring = document.custinfo.Sequence.value;
			init();
			for (var i=0; i<newstring.length; i++){
				finalCheck(newstring.charCodeAt(i));
			 }
				 var tmpstring = newstring.toUpperCase();
				 tmpstring = replace(replace(tmpstring,'\r',''),'\n','');
				 tmpstring = replace(tmpstring,' ','');
				  document.custinfo.Sequence.value = tmpstring;
			}
// generic positive number decimal formatting function
function format (expr, decplaces) {
	// raise incoming value by power of 10 times the
	// number of decimal places; round to an integer; convert to string
	var str = "" + Math.round (eval(expr) * Math.pow(10,decplaces))
	// pad small value strings with zeros to the left of rounded number
	while (str.length <= decplaces) {
		str = "0" + str
	}
	// establish location of decimal point
	var decpoint = str.length - decplaces
	// assemble final result from: (a) the string up to the position of
	// the decimal point; (b) the decimal point; and (c) the balance
	// of the string. Return finished product.
	return str.substring(0,decpoint) + "." + str.substring(decpoint,str.length);
}
			
	
		function checkIt(e){
			var charCode = (navigator.appName == "Netscape") ? e.which : e.keyCode;
			//status = charCode
			if (charCode == 65 || charCode == 97){
				//A
				baseCodes[0].count = baseCodes[0].count + 1 ;
				baseCodes[19].count = baseCodes[19].count + 1 ;
			}else if (charCode == 66 || charCode == 98){
				//B
				baseCodes[1].count = baseCodes[1].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;
			}else if (charCode == 67 || charCode == 99){
				//C
				baseCodes[2].count = baseCodes[2].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			}else if (charCode == 68 || charCode == 100){
				//D
				baseCodes[3].count = baseCodes[3].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 71 || charCode == 103){
				//G
				baseCodes[4].count = baseCodes[4].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 72 || charCode == 104){
				//H
				baseCodes[5].count = baseCodes[5].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 73 || charCode == 105){
				//I
				baseCodes[6].count = baseCodes[6].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 75 || charCode == 107){
				//K
				baseCodes[7].count = baseCodes[7].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			}else if (charCode == 77 || charCode == 109){
				//M
				baseCodes[8].count = baseCodes[8].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 78 || charCode == 110){
				//N
				baseCodes[9].count = baseCodes[9].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 80 || charCode == 112){
				//P
				baseCodes[10].count = baseCodes[10].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 82 || charCode == 114){
				//R
				baseCodes[11].count = baseCodes[11].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 83 || charCode == 115){
				baseCodes[12].count = baseCodes[12].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 84 || charCode == 116){
				baseCodes[13].count = baseCodes[13].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 85 || charCode == 117){
				baseCodes[14].count = baseCodes[14].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 86 || charCode == 118){
				baseCodes[15].count = baseCodes[15].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 87 || charCode == 119){
				baseCodes[16].count = baseCodes[16].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} 
			else if (charCode == 88 || charCode == 120){
				baseCodes[20].count = baseCodes[20].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} 
			else if (charCode == 89 || charCode == 121){
				baseCodes[17].count = baseCodes[17].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} 
			else if (charCode == 90 || charCode == 122){
				baseCodes[21].count = baseCodes[21].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} 
			//43=+ 42=*
			else if (charCode == 43 || charCode == 42){


			} 
			else if (charCode == 32){
				var a = 1;
			}else {
				//alert("not a valid entry"); 
				return false;
			}

			calcGC();
			calcMW();
			calcTM();
			strseq = document.custinfo.Sequence.value;
			intlen = strseq.length;
			if (intlen > 300)
				{
				alert("The size limit is 300.");				
				document.custinfo.Sequence.value = strseq.substring(0,299); 
				};
			return true;	
		}



		function baseLetter(count){
		 this.count = count
			}
			
			function calcGC(){	
				var scale = document.custinfo.scale.value;
				var Purity1 = document.custinfo.Purity1.value
					
				var thisGC = ((baseCodes[2].count + baseCodes[4].count) / baseCodes[19].count) * 100;
				document.custinfo.cg.value = parseInt(thisGC);
				document.custinfo.size.value = baseCodes[19].count;
				
				
				}
				
			function calcMW(){
				var thisMW = (baseCodes[0].count * 313.2) 
								+ (baseCodes[2].count * 289.19 ) 
								+ (baseCodes[4].count * 329.21 ) 
								+ (baseCodes[13].count * 304.2 ) 
								+ (baseCodes[6].count * 314.2 ) 
								+ (baseCodes[9].count * 308.95 ) 
								+ (baseCodes[11].count * 321.21 ) 
								+ (baseCodes[17].count * 296.69 ) 
								+ (baseCodes[8].count *  301.2) 
								+ (baseCodes[7].count * 316.7 ) 
								+ (baseCodes[12].count * 309.2 )
								+ (baseCodes[16].count * 308.71 ) 
								+ (baseCodes[5].count * 302.2 ) 
								+ (baseCodes[1].count * 307.53 ) 
								+ (baseCodes[3].count * 315.54 ) 
								+ (baseCodes[15].count * 310.53 ) 
								+ (baseCodes[10].count * 79.98 ) 
								+ (baseCodes[14].count * 290.17 )
								+ (baseCodes[20].count * 300 )
								+ (baseCodes[21].count * 300 ) -62
				
				if(document.custinfo.OligoType.value == "RNA" || document.custinfo.OligoType.value == "siRNA") { thisMW += 16*(baseCodes[19].count); }

				if(document.custinfo.OligoType.value == "2'O methyl") { thisMW += 30*(baseCodes[19].count); }
				
				if(document.custinfo.OligoType.value == "Phosphorothioate") { thisMW += 16*(baseCodes[19].count-1); }
				
				if(document.custinfo.OligoType.value == "Phosphonate") { thisMW += (-16)*(baseCodes[19].count-1); }
				
				document.custinfo.mw.value = format(thisMW,2);	

				}
	
			// This function calculates EC by the nearest neighbor method
			function calcEC(){
				var ec = 0;
				var seq = new String(document.custinfo.Sequence.value.toUpperCase());
				seq = seq.replace(/U/g, "T");
				
				for (var i=0;i<seq.length-1;i++) {
					var left = seq.charAt(i);
					var right = seq.charAt(i+1);
					
					if (document.custinfo.OligoType.value == "RNA" || document.custinfo.OligoType.value == "siRNA" || document.custinfo.OligoType.value == "2'O methyl") {
						switch(left) {
							case "A":
								if (i > 0) { ec -= 15400 }
								if (right == "A") { ec += 27400 }
								if (right == "C") { ec += 21000 }
								if (right == "G") { ec += 25000 }
								if (right == "T") { ec += 24000 }
								break;
							case "C":
								if (i > 0) { ec -= 7200 }
								if (right == "A") { ec += 21000 }
								if (right == "C") { ec += 14200 }
								if (right == "G") { ec += 17800 }
								if (right == "T") { ec += 16200 }
								break;
							case "G":
								if (i > 0) { ec -= 11500 }
								if (right == "A") { ec += 25200 }
								if (right == "C") { ec += 17400 }
								if (right == "G") { ec += 21600 }
								if (right == "T") { ec += 21200 }
								break;
							case "T":
								if (i > 0) { ec -= 9900 }
								if (right == "A") { ec += 24600 }
								if (right == "C") { ec += 17200 }
								if (right == "G") { ec += 20000 }
								if (right == "T") { ec += 19600 }
								break;
							case "N":
								if (i >= 0) { ec += 10700 }
								break;
							case "R":
								if (i >= 0) { ec += 13450 }
								break;
							case "Y":
								if (i >= 0) { ec += 8050 }
								break;
							case "M":
								if (i >= 0) { ec += 11400 }
								break;
							case "K":
								if (i >= 0) { ec += 10100 }
								break;
							case "S":
								if (i >= 0) { ec += 9450 }
								break;
							case "W":
								if (i >= 0) { ec += 12050 }
								break;
							case "H":
								if (i >= 0) { ec += 10500 }
								break;
							case "B":
								if (i >= 0) { ec += 9200 }
								break;
							case "D":
								if (i >= 0) { ec += 11860 }
								break;
							case "V":
								if (i >= 0) { ec += 11430 }
								break;
						}
					}
					else {
						switch(left) {
							case "A":
								if (i > 0) { ec -= 15400 }
								if (right == "A") { ec += 27400 }
								if (right == "C") { ec += 21200 }
								if (right == "G") { ec += 25000 }
								if (right == "T") { ec += 22800 }
								break;
							case "C":
								if (i > 0) { ec -= 7400 }
								if (right == "A") { ec += 21200 }
								if (right == "C") { ec += 14600 }
								if (right == "G") { ec += 18000 }
								if (right == "T") { ec += 15200 }
								break;
							case "G":
								if (i > 0) { ec -= 11500 }
								if (right == "A") { ec += 25200 }
								if (right == "C") { ec += 17600 }
								if (right == "G") { ec += 21600 }
								if (right == "T") { ec += 20000 }
								break;
							case "T":
								if (i > 0) { ec -= 8700 }
								if (right == "A") { ec += 23400 }
								if (right == "C") { ec += 16200 }
								if (right == "G") { ec += 19000 }
								if (right == "T") { ec += 16800 }
								break;
							case "N":
								if (i >= 0) { ec += 10700 }
								break;
							case "R":
								if (i >= 0) { ec += 13450 }
								break;
							case "Y":
								if (i >= 0) { ec += 8050 }
								break;
							case "M":
								if (i >= 0) { ec += 11400 }
								break;
							case "K":
								if (i >= 0) { ec += 10100 }
								break;
							case "S":
								if (i >= 0) { ec += 9450 }
								break;
							case "W":
								if (i >= 0) { ec += 12050 }
								break;
							case "H":
								if (i >= 0) { ec += 10500 }
								break;
							case "B":
								if (i >= 0) { ec += 9200 }
								break;
							case "D":
								if (i >= 0) { ec += 11860 }
								break;
							case "V":
								if (i >= 0) { ec += 11430 }
								break;
						}
					}
				}


						var lastchar = seq.charAt(seq.length-1);

						switch(lastchar) {

							case "N":
								if (i >= 0) { ec += 10700 }
								break;
							case "R":
								if (i >= 0) { ec += 13450 }
								break;
							case "Y":
								if (i >= 0) { ec += 8050 }
								break;
							case "M":
								if (i >= 0) { ec += 11400 }
								break;
							case "K":
								if (i >= 0) { ec += 10100 }
								break;
							case "S":
								if (i >= 0) { ec += 9450 }
								break;
							case "W":
								if (i >= 0) { ec += 12050 }
								break;
							case "H":
								if (i >= 0) { ec += 10500 }
								break;
							case "B":
								if (i >= 0) { ec += 9200 }
								break;
							case "D":
								if (i >= 0) { ec += 11860 }
								break;
							case "V":
								if (i >= 0) { ec += 11430 }
								break;
						}












				
				document.custinfo.EC.value = format(ec/1000,2);
			}
				
			function calcOtherFormulas(){
				var thisMW = document.custinfo.mw.value;
				var thisEC = document.custinfo.EC.value;
				var mgA260 = format(thisMW/thisEC,2);
				var nmolA260 = format((thisMW/thisEC)/(thisMW/1000),2);
				document.custinfo.mgA260.value = mgA260;
				document.custinfo.nmolA260.value = nmolA260;
				}
		
		function init(){
			baseCodes = new Array(20);
			baseCodes[0] = new baseLetter(0);
			baseCodes[1] = new baseLetter(0);
			baseCodes[2] = new baseLetter(0);
			baseCodes[3] = new baseLetter(0);
			baseCodes[4] = new baseLetter(0);
			baseCodes[5] = new baseLetter(0);
			baseCodes[6] = new baseLetter(0);
			baseCodes[7] = new baseLetter(0);
			baseCodes[8] = new baseLetter(0);
			baseCodes[9] = new baseLetter(0);
			baseCodes[10] = new baseLetter(0);
			baseCodes[11] = new baseLetter(0);
			baseCodes[12] = new baseLetter(0);
			baseCodes[13] = new baseLetter(0);
			baseCodes[14] = new baseLetter(0);
			baseCodes[15] = new baseLetter(0);
			baseCodes[16] = new baseLetter(0);
			baseCodes[17] = new baseLetter(0);
			baseCodes[18] = new baseLetter(0);
			baseCodes[19] = new baseLetter(0);
			baseCodes[20] = new baseLetter(0);
			baseCodes[21] = new baseLetter(0);
			}
			
		

			
		function finalCheck(e){
			var charCode = e;
			//status = charCode
			if (charCode == 65 || charCode == 97){
				//A
				baseCodes[0].count = baseCodes[0].count + 1 ;
				baseCodes[19].count = baseCodes[19].count + 1 ;
			}else if (charCode == 66 || charCode == 98){
				//B
				baseCodes[1].count = baseCodes[1].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;
			}else if (charCode == 67 || charCode == 99){
				//C
				baseCodes[2].count = baseCodes[2].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			}else if (charCode == 68 || charCode == 100){
				//D
				baseCodes[3].count = baseCodes[3].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 71 || charCode == 103){
				//G
				baseCodes[4].count = baseCodes[4].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 72 || charCode == 104){
				//H
				baseCodes[5].count = baseCodes[5].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 73 || charCode == 105){
				//I
				baseCodes[6].count = baseCodes[6].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 75 || charCode == 107){
				//K
				baseCodes[7].count = baseCodes[7].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			}else if (charCode == 77 || charCode == 109){
				//M
				baseCodes[8].count = baseCodes[8].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 78 || charCode == 110){
				//N
				baseCodes[9].count = baseCodes[9].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 80 || charCode == 112){
				//P
				baseCodes[10].count = baseCodes[10].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 82 || charCode == 114){
				//R
				baseCodes[11].count = baseCodes[11].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 83 || charCode == 115){
				baseCodes[12].count = baseCodes[12].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 84 || charCode == 116){
				baseCodes[13].count = baseCodes[13].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 85 || charCode == 117){
				baseCodes[14].count = baseCodes[14].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 86 || charCode == 118){
				baseCodes[15].count = baseCodes[15].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			} else if (charCode == 87 || charCode == 119){
				baseCodes[16].count = baseCodes[16].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			}
			//X
			else if (charCode == 88 || charCode == 120){
				baseCodes[20].count = baseCodes[20].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1 ;

			}
			 else if (charCode == 89 || charCode == 121){
				baseCodes[17].count = baseCodes[17].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1;
			}
			//Z
			else if (charCode == 90 || charCode == 122){
				baseCodes[21].count = baseCodes[21].count + 1;
				baseCodes[19].count = baseCodes[19].count + 1;
			}
			 else if (charCode == 32){
				var a = 1;
			}else {
				//alert("not a valid entry"); 
				return false;
			}

			calcGC();
			calcMW();
			calcTMbyNN();
			calcEC();
			calcOtherFormulas();
			
			return true;
		}
		
		// This function calculates the Tm by the nearest neighbor method
		function calcTMbyNN() {
			var seq = new String(document.custinfo.Sequence.value.toUpperCase());
			seq = seq.replace(/U/g, "T");
			var H = 0;
			var S = 0;
			var pair;

			var isRNA = document.custinfo.OligoType.value == "RNA" || document.custinfo.OligoType.value == "siRNA" || document.custinfo.OligoType.value == "2'O methyl";
			
			//Loop through sequence checking each pair and adding the delta H/S values
			//	that correspond to each pair
			for (var i=0;i<seq.length-1;i++) {
				pair = seq.substr(i, 2);
				
				if(isRNA) {
					if (pair == "AA" || pair == "TT")		{ H += -6.820; S += -19.0; }
					else if (pair == "AT")					{ H += -9.380; S += -26.7; }
					else if (pair == "TA")					{ H += -7.690; S += -20.5; }
					else if (pair == "CA" || pair == "TG")	{ H += -10.44; S += -26.9; }
					else if (pair == "GT" || pair == "AC")	{ H += -11.40; S += -29.5; }
					else if (pair == "CT" || pair == "AG")	{ H += -10.48; S += -27.1; }
					else if (pair == "GA" || pair == "TC")	{ H += -12.44; S += -32.5; }
					else if (pair == "CG")					{ H += -10.64; S += -26.7; }
					else if (pair == "GC")					{ H += -14.88; S += -36.9; }
					else if (pair == "GG" || pair == "CC")	{ H += -13.39; S += -32.7; }
				}
				else {
					if (pair == "AA" || pair == "TT")		{ H += -7.90; S += -22.2; }
					else if (pair == "AT")					{ H += -7.20; S += -20.4; }
					else if (pair == "TA")					{ H += -7.20; S += -21.3; }
					else if (pair == "CA" || pair == "TG")	{ H += -8.50; S += -22.7; }
					else if (pair == "GT" || pair == "AC")	{ H += -8.40; S += -22.4; }
					else if (pair == "CT" || pair == "AG")	{ H += -7.80; S += -21.0; }
					else if (pair == "GA" || pair == "TC")	{ H += -8.20; S += -22.2; }
					else if (pair == "CG")					{ H += -10.6; S += -27.2; }
					else if (pair == "GC")					{ H += -9.80; S += -24.4; }
					else if (pair == "GG" || pair == "CC")	{ H += -8.00; S += -19.9; }
				}
			}
			
			// Add initiation values to H and S
			var first = seq.substr(0, 1);
			var last = seq.substr(seq.length-1, 1);
			var conc = 0.00000025;
			
			if(isRNA) {
				H += 3.61; S += -1.5;
				
				if (first == "A" || first == "T") { H += 3.72; S += 10.5; }
				if (last == "A" || last == "T") { H += 3.72; S += 10.5; }
			}
			else {
				if (first == "G" || first == "C") {	H += 0.1; S += -2.8; }
				else if (first == "A" || first == "T") { H += 2.3; S += 4.1; }
				
				if (last == "G" || last == "C") { H += 0.1; S += -2.8; }
				else if (last == "A" || last == "T") { H += 2.3; S += 4.1; }
			}
			
			if (isSelfComp(seq)) { H += 0.0; S += -1.4; }
			else if (isRNA) {
				conc = conc/4;
			}
			
			// calculate raw Tm (1M Na+, 0.25uM oligo)
			var rawTm = ( (H*1000)/(S + 1.987*Math.log(conc)) );

			// Adjust to 50mM NA+ (Owczarsky)
			var GC = (baseCodes[2].count + baseCodes[4].count)/baseCodes[19].count;
			var monfactor = ((4.29*GC - 3.95)*Math.log(0.05) + (0.94*Math.log(0.05)*Math.log(0.05)))*(0.00001);
			var monTm = (1 / ((1 / rawTm) + monfactor));
    
			document.custinfo.tm.value = format(monTm-273.15,1);
			
			return true;
		}
		
		function isSelfComp(s) {
			var seq = new String(s);
			seq = seq.replace(/U/g, "T");
			
			if(seq.length % 2 == 1) { return false; }
			else {
				var half = seq.length / 2
				var forward = seq.substr(0, half);
				var reverse = revComp (seq.substr(half, half));
				return (forward == reverse);
			}
		}
		
		function revComp(s) {
			var seq = new String(s);
			var rev = new String("");
			
			for (var i=seq.length-1;i >= 0; i--) {
				var c = seq.charAt(i);
				
				if (c == "A") { rev = rev.concat("T"); }
				if (c == "C") { rev = rev.concat("G"); }
				if (c == "G") { rev = rev.concat("C"); }
				if (c == "T") { rev = rev.concat("A"); }
			}
			
			return rev;
		}
						
  function fillCustDetails() {
    with (document.custinfo) {
	if (RelatedCustomers.selectedIndex < 2){
		TempName.value = "";
		TempPhone.value = "";
		TempEmail.value = "";
		shipnameold.value = "";
		shipphoneold.value = "";
		shipemailold.value = "";
		ccuseremail.value = "";
	}else{
  	  var RowNum = RelatedCustomers.selectedIndex - 2;
      TempName.value = customers.shipname[RowNum];
      TempPhone.value = customers.shipphone[RowNum];
      TempEmail.value = customers.shipemail[RowNum];
      shipnameold.value = customers.shipname[RowNum];
      shipphoneold.value = customers.shipphone[RowNum];
      shipemailold.value = customers.shipemail[RowNum];
      CCTempEmail.value = customers.ccuseremail[RowNum];
	  }
	  }
	  }
  
function changeOligoType(){
    with (document.custinfo) {
			  var RowNum = synthesis.oligotype;	
			  var RowNum = scale.selectedIndex;
			  var myscale = synthesisscale.scale[RowNum];
			  OligoType.options.length = 0;
      for (var i = 0; i < synthesis.getRowCount(); i++) {
				if (synthesis.synthesisscale[i] == myscale){
        			NewOpt = new Option;
        			NewOpt.value = synthesis.oligotype[i];
       				NewOpt.text = synthesis.oligotype[i];
		        	OligoType.options[OligoType.options.length] = NewOpt;
				}
				}
	}
}
