/* Global Variables */
var construct_id_store = new Array();
var extNames = new Array();

function validateStep1(protSeq) {
   	var frm=document.forms["frmStep1"];
   	if (!isNumeric(frm.target_prot_start.value)) {alert("Target protein start must be Numeric");return false;}
   	if (!isNumeric(frm.target_prot_end.value)) {alert("Target protein end must be Numeric");return false;}
   	
   	//Convert input from strings to numerics
   	var target_prot_start = frm.target_prot_start.value - 0;
	var target_prot_end = frm.target_prot_end.value - 0;
   	
   	if (target_prot_start>target_prot_end){alert('Start position must be smaller than end position');return false;}	
	if (target_prot_start<=0 ||
		target_prot_end>protSeq.length){alert('The start position must be at least 1.\nThe end position must be less than or equal to the sequence length.');return false;}	

	//check if selected sequence contains stop codons
	var selectedSeq = protSeq.substring(target_prot_start-1, target_prot_end-1);
	var stopCodons =0;
	for(var k=0; k<selectedSeq.length; k++){
		if (selectedSeq.charAt(k)=="*"){
		stopCodons++;
		}
	}
	if (stopCodons>0){alert('Selected sequence contains '+stopCodons+ ' stop codons.\nConstruct design will fail.\nPlease adjust your protein start and\\or end positions.');return false;}

	if (target_prot_start==""||target_prot_end==""||frm.construct_id.value=="") {alert('Fields marked with * are required');return false;}

	//checking that DNA sequence length >50 for York primer design type
	//need to find which radio button is checked then get the value
	var target_dna_seq = frm.target_dna_seq.value;
	var checked_type;
	var design_type = frm.design_type;
	for(var j=0; j<design_type.length; j++){
		if(design_type[j].checked){
		checked_type = design_type[j].value;
		break;
		}
	}
	if(checked_type=="York" && 1*(target_dna_seq.length) <50){alert('DNA sequence must be at least 50 nucleotides for Tm based primer design\n Please select a different Primer design type');return false;}
	
	//Need to check that construct id is not only whitespace
	//141107 this is probably better done with strip() method from Prototype, followed by if(""=conId){alert etc..}
	var constId = frm.construct_id.value;
	constId=trimString(constId);
	if(""==constId){alert('Construct id must be a real value'); return false;}
    
	for (i=0;i<construct_id_store.length;i++) {
		var dot =".";
		var dotIndex = construct_id_store[i].indexOf(dot);
		var id = construct_id_store[i].substring(dotIndex+1);
		//alert('Construct id is: '+frm.construct_id.value+'\n construct store has '+construct_id_store.length+' entries'+ 'this one is '+construct_id_store[i]+' id is '+id); return false;
        if (frm.construct_id.value==id) {
            alert('This construct id has already been used for this Target');return false;}
    }			
}
//TODO check:270407 Step2 not used for version 1.1, separate validation for separate forms
function validateStep2(dnaSeq) {
   	var frm=document.forms["frmStep2"];
	if (!isNumeric(frm.fwd_overlap_len.value)) {alert("Forward Overlap Length must be Numeric");return false;}
	if (!isNumeric(frm.comp_overlap_len.value)) {alert("Complement Overlap Length must be Numeric");return false;}
	
	if (frm.fwd_overlap_len.value>dnaSeq.length){alert('Forward Overlap Length must be <= the DNA sequence length');return false;}	
	if (frm.comp_overlap_len.value>dnaSeq.length){alert('Complement Overlap Length must be <= the DNA sequence length');return false;}
	if (!isValidDnaSequence(frm.forward_primer.value)) {alert('Forward_primer contains illegal characters'); return false;}
	if (!isValidDnaSequence(frm.reverse_primer.value)) {alert('Reverse_primer contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_n.value)) {alert('Expressed protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_c.value)) {alert('Expressed protein C Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_n.value)) {alert('Final protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_c.value)) {alert('Final protein C Terminus contains illegal characters'); return false;}
	if (frm.fwd_overlap_len.value==""||frm.comp_overlap_len.value=="") {alert('Fields marked with * are required');return false;}	
}

function validateStep2a(dnaSeq){
   	var frm=document.forms["frmStep2a"];
	var targetDnaSeq=frm.target_dna_seq.value;
	var targetDnaSeqLength=targetDnaSeq.length-0;
   	var target_prot_start = frm.target_prot_start.value - 0;
	var target_prot_end = frm.target_prot_end.value - 0;
	var dnaSubSeq=targetDnaSeq.substring((target_prot_start*3)-3,target_prot_end*3); 
	var dnaSubSeqLength=dnaSubSeq.length;
	var fwdOverlapLen=frm.fwd_overlap_len.value -0;
	var revOverlapLen=frm.rev_overlap_len.value -0;

	if (frm.fwd_overlap_len.value==""||frm.rev_overlap_len.value=="") {alert('Fields marked with * are required');return false;}
	if (!isNumeric(frm.fwd_overlap_len.value)||frm.fwd_overlap_len.value<1) {alert("Forward Overlap Length must be a positive number");return false;}
    if (fwdOverlapLen>(dnaSubSeq.length)){alert('Forward Overlap Length '+fwdOverlapLen+' must be shorter than the DNA sequence length '+dnaSubSeqLength);return false;}	
	if (!isNumeric(frm.rev_overlap_len.value)||frm.rev_overlap_len.value<1) {alert("Complement Overlap Length must be a positive number");return false;}
    if (revOverlapLen>(dnaSubSeq.length)){alert('Reverse Overlap Length '+revOverlapLen+' must be shorter than the DNA sequence length '+dnaSubSeqLength);return false;}   	
	if (!isValidDnaSequence(frm.forward_tag.value)||!isValidDnaSequence(frm.reverse_tag.value)) {alert('Extensions contain illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_n.value)) {alert('Expressed protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_c.value)) {alert('Expressed protein C Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_n.value)) {alert('Final protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_c.value)) {alert('Final protein C Terminus contains illegal characters'); return false;}
}

function validateStep2b(dnaSeq){
	var frm=document.forms["frmStep2b"];
	if (frm.forward_primer.value==""||frm.reverse_primer.value=="") {alert('Fields marked with * are required');return false;}
	if (!isValidDnaSequence(frm.forward_primer.value)) {alert('Forward primer contains illegal characters'); return false;}
    if (!isValidDnaSequence(frm.reverse_primer.value)) {alert('Reverse primer contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_n.value)) {alert('Expressed protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_c.value)) {alert('Expressed protein C Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_n.value)) {alert('Final protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_c.value)) {alert('Final protein C Terminus contains illegal characters'); return false;}
	
}
function validateStep2c(tm){
   	var frm=document.forms["frmStep2c"];
   	if(document.getElementById("desired_tm")){
   	if (!isNumeric(document.getElementById("desired_tm").value)) {alert("Tm must be a number");return false;}
   	if (1*(document.getElementById("desired_tm").value) <= 0){alert("Tm must be greater than 0");return false;}   	
	}
}

function validateStep3() {
   	var frm=document.forms["frmStep3"];	
	if (frm.description.value.length>30) {alert('Description is restricted to 30 characters.');return false;}	
}
function validateStep3c() {
   	var frm=document.forms["frmStep3c"];
	if (!isValidDnaSequence(frm.forward_tag.value)||!isValidDnaSequence(frm.reverse_tag.value)) {alert('Extensions contain illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_n.value)) {alert('Expressed protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.expressed_prot_c.value)) {alert('Expressed protein C Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_n.value)) {alert('Final protein N Terminus contains illegal characters'); return false;}
	if (!isValidProteinSequence(frm.final_prot_c.value)) {alert('Final protein C Terminus contains illegal characters'); return false;}
	
}
function removeSpaces(string) {
	var tstring = "";
	string = '' + string;
	splitstring = string.split(" ");
	for(i = 0; i < splitstring.length; i++)
	tstring += splitstring[i];
	return tstring;
}
//Function for New Target DNA sequence
function checkTargetDNASeq(val, alias){
	if (val.length%3!=0){
		return alias+ "is not valid.  Length has to be a multiple of 3 "
		} return "";
}
//Function to convert to upper case and check is sequence starts with ATG -new Target
function checkATG(){
	var seq = document.getElementById("dnaSeq").value;
	seq=cleanSequence(seq);
/*	if ((seq.substring(0,3)!="ATG")) {
//		return alias+ "does not start with ATG"
		var addATG=confirm("Add ATG to DNA sequence?");
		if(addATG){
			return true;
			}
		else{
			return false;
			}
		}*/return seq;
}
//function to get checkbox status, if isChecked and starts with ATG, or if
//!isChecked and doesn't start with ATG, we do nothing
function toggleATG(fp){
	var isChecked = $("check1").checked; 
	//var newfp = "";
	if(isChecked && fp.substring(0,2)!='ATG' ){/*sequence doesn't begin with ATG*/
		var addATG=confirm("Add ATG to 5'-end of Forward primer overlap?");
		if(addATG){
//			newfp = 'ATG' + fp;//add ATG to the 5'-end
			return true;
		}
		else{
			$("check1").checked="";
			return false;
		}
//	} else if(!isChecked && fp.substring(0,2)=='ATG' ) {/*sequence begins with ATG*/
//	newfp = fp.substr (2);
	}
	return isChecked;
} 
//function to get radio button status, if isChecked and starts with TTA or TGA or CTA, 
//or if !isChecked and doesn't start with one of these, we do nothing
function toggleSTOP(rp){
	var isChecked;
	var stopCodon = "";
	var newrp = "";
	var addStop = document.getElementsByName("add_stop");
	for(var j=0; j<addStop.length; j++){
		if (addStop[j].checked){
			isChecked=addStop[j].id;
			stopCodon=addStop[j].value;
			break;
			}
		if(isChecked && rp.substring(0,2)!='TAA'||'TGA'||'CTA' ){/*sequence doesn't begin with stop codon*/
			newrp = addStop + rp;//add stop codon to the 5'-end
			}
		else if(!isChecked && rp.substring(0,2)=='TAA'||'TGA'||'CTA') {/*sequence begins with stop codon*/
				rp = rp.substr (2);
			}		
	}if(""!=stopCodon){alert("Add stop codon "+isChecked+" (5'-3'- "+stopCodon+ ")?"); 
			}return stopCodon;
}
//function to trim a string -modified from Marc's in NewTarget
function trimString(str){
	str=str.replace(/^\s+|\s+$/g,"");
	return str;
}
//Function for New DNA Target
function checkLength(val,alias){
 if(val.length <50){
 	return alias+" length must be at least 50 nucleotides"
 	} return "";
 }
//Function for cleaning a DNA sequence after display in pims:sequence tag
function tidySeq(val,alias){
	$("dnaSeq").value = cleanSequence(val);
	return "";	
}
//Function for cleaning a sequence after display in pims:sequence tag
function tidySeq2(val,alias){
	val = cleanSequence(val);
	return "";	
}
//Functions for Protein construct to replace validateStep1
function protConStart(val,alias){
	var valNum = 1*val;
	var end = 1*document.getElementById("target_prot_end").value;
	var targseq = document.getElementById("target_prot_seq").value;
	var maxLen = 1*targseq.length;
	if (end < valNum){
    	return alias+" " +val+" must be smaller than the Target protein end position "+ end 
	}if(valNum>maxLen){
		return alias+" must be less than or equal to the length of the Target protein sequence "+maxLen
	}	
	//check if selected sequence contains stop codons
	var selectedSeq = targseq.substring(valNum-1, end-1);
	
	var stopCodons =0;
	for(var k=0; k<selectedSeq.length; k++){
		if (selectedSeq.charAt(k)=="*"){
		stopCodons++;
		}
	}
	if (stopCodons>0){
		return "Selected sequence contains "+stopCodons+ " stop codons.\nConstruct design will fail.\nPlease adjust your protein start and\\or end positions"		
		}
	//Check if York design type selected, DNA seq is >=50	
	var targDNAseq = (selectedSeq.length+1)*3;
	var checked_type;
	var design_type = $$("input[name=design_type]");
	for(var j=0; j<design_type.length; j++){
		if(design_type[j].checked){
		checked_type = design_type[j].value;
		break;
		}
	}
	if(checked_type=="York" && 1*(targDNAseq) <50){
		return "DNA sequence must be at least 50 nucleotides for Tm based primer design\n   Please select a different Primer design type"
		}
	return "";
}
function protConEnd(val,alias){
	var endNum = 1*val;
	var start = 1*document.getElementById("target_prot_start").value;
	var targseq = document.getElementById("target_prot_seq").value;
	var maxLen = 1*targseq.length;
	var partseq = targseq.substring(start-1,endNum);
	if(endNum>maxLen){
		return alias+" must be less than or equal to the Target protein sequence "+maxLen
	}return "";
}
//Functions for DNA Target Construct
function dnaConStart(val,alias){
	var valNum = 1*val;
	var end = 1*document.getElementById("target_dna_end").value;
	var targseq = document.getElementById("targetds").value;
	var maxLen = 1*targseq.length;
	var partseq = targseq.substring(valNum-1,end);
	var sublen = 1*partseq.length;
	if(sublen <50 ){
		return "Selected region "+sublen+" is too short -must be at least 50 nucleotides"
    }if (end < valNum){
    	return alias+" " +val+" must be smaller than the end nucleotide "+ end 
	}if(valNum>maxLen){
		return alias+" must be less than or equal to the Target DNA sequence "+maxLen
	}return "";
}
function dnaConEnd(val,alias){
	var endNum = 1*val;
	var start = 1*document.getElementById("target_dna_start").value;
	var targseq = document.getElementById("targetds").value;
	var maxLen = 1*targseq.length;
	var partseq = targseq.substring(start-1,endNum);
	var sublen = 1*partseq.length;
	if(endNum>maxLen){
		return alias+" must be less than or equal to the target DNA sequence length "+maxLen
	}if(sublen <50 ){
		return "Adjust the start and or end positions"
    }return "";
}
function idValue(val,alias){
 	val = val.strip();
 	if("" == val){
 		return alias+" must be a real value"
 	}
 	if(construct_id_store.length>0){
 		for (i=0;i<construct_id_store.length;i++){
			var dot =".";
			var dotIndex = construct_id_store[i].indexOf(dot);
			var id = construct_id_store[i].substring(dotIndex+1);
    		if (val==id){
    			return "This "+alias+ " has already been used for this Target"
    		} 
    	} 
	} 
	return "";
}
//Function to add new fields to create a new 5'-extension
function newExt(newExt){
	var selFExt = $F("forward_tag");  //Prototype function to get the value of the selected option
	var selRExt = $F("reverse_tag");
	//var addNew = "Record a new Extension";
	//var addNew = "*Record a new 5'-extension*";
	var addNew = "New Extension";
	//var newFields = $("newFExt");
	//alert("You chose "+selFExt);
	if(addNew == selFExt){
		//alert("You want to "+selFExt);		
		$("fexName").style.display="table-row";
		$("fexSeq").style.display="table-row";		
		$("new_fExtName").disabled="";
		$("new_fExtSeq").disabled="";
	}if(addNew == selRExt){
		//alert("You want to "+selRExt);		
		$("rexName").style.display="table-row";
		$("rexSeq").style.display="table-row";		
		$("new_rExtName").disabled="";
		$("new_rExtSeq").disabled="";
	}if(addNew != selFExt) {
		$("fexName").style.display="none";
		$("fexSeq").style.display="none";		
		$("new_fExtName").disabled="disabled";
		$("new_fExtSeq").disabled="diabled";
	}if(addNew != selRExt){	
		$("rexName").style.display="none";
		$("rexSeq").style.display="none";		
		$("new_rExtName").disabled="disabled";
		$("new_rExtSeq").disabled="diabled";		
	}
}
function extNameCheck(val, alias){
	for(i=0; i<extNames.length; i++){
		var name=trimString(extNames[i]);
		if(val==name){
			return "A 5'-extension named "+val+ " already exists.\n   Please enter a different name"
		}
	}return "";
}