var DNAMWConst = 333;
var RNAMWConst = 340;
var AVOGADRO = 6.023e23;
var PBR322_SIZE = 2686;
var SV40_SIZE = 5243;
var FX174_SIZE = 5386;
var M13MP18_SIZE = 7250;
var LAMBDA_SIZE = 48502;

function findDNASize(dnatype){
	if(dnatype=="pbr322"){
		return PBR322_SIZE;
	}
	else if (dnatype=="sv40"){
		return SV40_SIZE;
	}
	else if (dnatype=="fx174"){
		return FX174_SIZE;
	}
	else if (dnatype=="m13mp18"){
		return M13MP18_SIZE;
	}
	else if (dnatype=="lambda"){
		return LAMBDA_SIZE;
	}
	else if (dnatype=="oligo"){
		return getOligoProperties(true);
	}
	return 0;
}

function getOligoProperties(aCount){
	var sCnt = get_eOligoContent().value;
	if(sCnt){
		sCnt = sCnt.toUpperCase();
		var i = 0;
		var nMW = 79.0;
		var nSize = 0;
		var bBadSymbols = false;
		for(i=0;i<sCnt.length;i++){
			var cSym = sCnt.charAt(i);
			if(cSym=='A'){
				nMW += 313.2; 
				nSize++;
			}
			else if(cSym=='T'){
				nMW += 304.2; 
				nSize++;
			}
			else if(cSym=='G'){
				nMW += 329.2; 
				nSize++;
			}
			else if(cSym=='C'){
				nMW += 289.2; 
				nSize++;
			}
			else if(cSym==' '){
			}
			else{	
				bBadSymbols = true;
			}				
		}
		if(bBadSymbols){
			get_badoligowarning().style.display = "";
		}
		else{
			get_badoligowarning().style.display = "none";
		}
		
		if(aCount){
			return nSize;
		}
		else{
			return nMW/nSize;
		}
	}
	return 0;
}


function getDNAWeight(dnatype){
	var lres = DNAMWConst;
	if(dnatype=="dsdna"){
		return 2*DNAMWConst;
	}
	else if (dnatype=="ssdna"){
		return DNAMWConst;
	}
	else if (dnatype=="rna"){
		return RNAMWConst;
	}
	else if (dnatype=="oligo"){
		return getOligoProperties(false);
	}
	else {
//		return DNAMWConst*2;
		return 660;
	}
	
	return lres;
}

function getAvgDNAWeight(dnatype){
	if (dnatype=="oligo"){
		return DNAMWConst*getOligoProperties(true);
	}
	else {
		return getDNAWeight(dnatype);
	}
}



function get_cDNAType(){
	return document.getElementById("cDNAType");
}

function get_cWMOLDim(){
	return document.getElementById("cWMOLDim");
}
function get_cMMOLDim(){
	return document.getElementById("cMMOLDim");
}
function get_eWMolQuant(){
	return document.getElementById("eWMolQuant");
}
function get_eMMolQuant(){
	return document.getElementById("eMMolQuant");
}
function get_eMWeightQuant(){
	return document.getElementById("eMWeightQuant");
}

function get_eWWeight(){
	return document.getElementById("eWWeight");
}

function get_cWWDim(){
	return document.getElementById("cWWDim");
}
function get_cMWeightDim(){
	return document.getElementById("cMWeightDim");
}

function get_eDNALength(){
	return document.getElementById("eDNALength");
}

function get_eWMoleculeCount(){
	return document.getElementById("eWMoleculeCount");
}

function get_eVolume(){
	return document.getElementById("eVolume");
}

function get_cVolDim(){
	return document.getElementById("cVolDim");
}

function get_eWConc(){
	return document.getElementById("eWConc");
}
function get_eWInpConc(){
	return document.getElementById("eWInpConc");
}

function get_eMInpConc(){
	return document.getElementById("eMInpConc");
}

function get_eMConc(){
	return document.getElementById("eMConc");
}

function get_cWConcDim(){
	return document.getElementById("cWConcDim");
}
function get_cWInpConcDim(){
	return document.getElementById("cWInpConcDim");
}

function get_cMInpConcDim(){
	return document.getElementById("cMInpConcDim");
}


function get_cMConcDim(){
	return document.getElementById("cMConcDim");
}

function get_dnasizecell(){
	return document.getElementById("dnasizecell");
}

function get_txOligoLength(){
	return document.getElementById("txOligoLength");
}


function get_eSPA260Inp(){
	return document.getElementById("eSPA260Inp");
}

function get_eSPConcOut(){
	return document.getElementById("eSPConcOut");
}

function get_eSPConcWOut(){
	return document.getElementById("eSPConcWOut");
}

function get_cSPConcDimOut(){
	return document.getElementById("cSPConcDimOut");
}

function get_cSPConcWDimOut(){
	return document.getElementById("cSPConcWDimOut");
}

function get_eSPConcInp(){
	return document.getElementById("eSPConcInp");
}

function get_cSPConcDimInp(){
	return document.getElementById("cSPConcDimInp");
}

function get_eSPA260Out(){
	return document.getElementById("eSPA260Out");
}

function get_oligocontentcell(){
	return document.getElementById("oligocontentcell");
}

function get_eOligoContent(){
	return document.getElementById("eOligoContent");
}
function get_badoligowarning(){
	return document.getElementById("badoligowarning");
}

function get_eSPWConcInp(){
	return document.getElementById("eSPWConcInp");
}

function get_cSPWConcDimInp(){
	return document.getElementById("cSPWConcDimInp");
}

function get_eSPA260WOut(){
	return document.getElementById("eSPA260WOut");
}

	

function cDNAType_onchange() {
	if(get_cDNAType().value=="oligo"){
		get_dnasizecell().style.display = "none";
		get_oligocontentcell().style.display = "";
		var txOligoLength = get_txOligoLength();
		if(txOligoLength){
			txOligoLength.innerHTML = " "+getOligoProperties(true)+" nt length";
		}
	}
	else{
		var ldnasize = findDNASize(get_cDNAType().value);
		get_oligocontentcell().style.display = "none";
		if(ldnasize<1){
			get_dnasizecell().style.display = "";
		}
		else{	
			get_dnasizecell().style.display = "none";
		}
	}
	
	
	//recalcMolarQuant();
	//recalcWeightQuant();
	recalcMolQuantities();
	recalcMolConcentrations();
	recalcWeightQuantities();
	recalcWeightConcentrations();
	recalcSpectroConc();
	recalcSpectroAbs();
}


function findWeightDimensionMultiplier(dimension){
	if(dimension=="mkg"){
		return 1.0e-6;
	}
	else if (dimension=="mg"){
		return 1.0e-3;
	}
	else if (dimension=="ng"){
		return 1.0e-9;
	}
	else if (dimension=="pg"){
		return 1.0e-12;
	}
	else if (dimension=="g"){
		return 1.0;
	}
	
	return 0;
}

function findMolDimensionMultiplier(dimension){
	if(dimension=="mkmol"){
		return 1.0e-6;
	}
	else if (dimension=="mmol"){
		return 1.0e-3;
	}
	else if (dimension=="nmol"){
		return 1.0e-9;
	}
	else if (dimension=="pmol"){
		return 1.0e-12;
	}
	else if (dimension=="mol"){
		return 1.0;
	}
	
	return 0;
}

function findMolConcDimensionMultiplier(dimension){
	if(dimension=="mkM"){
		return 1.0e-6;
	}
	else if (dimension=="mM"){
		return 1.0e-3;
	}
	else if (dimension=="nM"){
		return 1.0e-9;
	}
	else if (dimension=="pM"){
		return 1.0e-12;
	}
	else if (dimension=="M"){
		return 1.0;
	}
	
	return 0;
}

function findWeightConcDimensionMultiplier(dimension){
	if(dimension=="mkgmkl"){
		return 1.0;
	}
	else if (dimension=="mgml"){
		return 1.0;
	}
	else if (dimension=="gl"){
		return 1.0;
	}
	else if (dimension=="ngmkl"){
		return 1.0e-3;
	}
	
	return 0;
}

function findVolDimensionMultiplier(dimension){
	if(dimension=="mkl"){
		return 1.0e-6;
	}
	else if (dimension=="ml"){
		return 1.0e-3;
	}
	else if (dimension=="nl"){
		return 1.0e-9;
	}
	else if (dimension=="pl"){
		return 1.0e-12;
	}
	else if (dimension=="l"){
		return 1.0;
	}
	
	return 0;
}

function getDNASize(){
	
	var ldnasize = 1;
	ldnasize = findDNASize(get_cDNAType().value);
	if(ldnasize<1){
		ldnasize = 1000*get_eDNALength().value;
	}
	return ldnasize;
}

function formatDigits(value){
	var rval = Math.round(1000*value);
	if(rval<10||rval>1e+6){
		var numval = new Number(value);
		if(numval&&numval.toExponential){
			return numval.toExponential(2); 
		}
		var res = rval/1000;
		return res;
	}
	else{
		var res = rval/1000;
		return res;
	}
}

function recalcMolQuantities(){
	if(get_cWWDim()){
		var lwdm = findWeightDimensionMultiplier(get_cWWDim().value);
		var lweight = 0.0;
		lweight = lwdm*get_eWWeight().value;
		var ldnasize = getDNASize(get_cDNAType().value);
		var ldnaweight = getDNAWeight(get_cDNAType().value);
		var lmolweight = ldnasize*ldnaweight;
		if(Math.abs(lmolweight)<1){
			lmolweight = 1;
		}
		var lmass = 1.0;
		var lmolquant = lweight/lmolweight;
		
		var lmdim = findMolDimensionMultiplier(get_cWMOLDim().value);
		if(lmdim>0){
			get_eWMolQuant().value = formatDigits(lmolquant/lmdim);		
		}
		var lavog =lmolquant*AVOGADRO;
		var lmclog = Math.log(lavog)/Math.LN10;
		if(lmclog>0){
			var base = Math.pow(10,Math.floor(lmclog)-3);
			lavog= Math.round(lavog/base)*base;
		}
		else{
		}
		get_eWMoleculeCount().value = formatDigits(Math.round(lavog));
	}
}

function recalcMolConcentrations(){
	if(get_cWInpConcDim()){
		var lwinpconcdim = findWeightConcDimensionMultiplier(get_cWInpConcDim().value);
		var lwinpconc = get_eWInpConc().value;
		var lmconcdim = findMolConcDimensionMultiplier(get_cMConcDim().value);
		var ldnasize = getDNASize(get_cDNAType().value);
		var ldnaweight = getDNAWeight(get_cDNAType().value);
		var lmolweight = ldnasize*ldnaweight;
		get_eMConc().value = formatDigits(lwinpconc*lwinpconcdim/(lmolweight*lmconcdim));
	}
}

function recalcMolarQuant(senderobj){

	var lwdm = findWeightDimensionMultiplier(get_cWWDim().value);
	var lweight = 0.0;
	lweight = lwdm*get_eWWeight().value;
	if(senderobj){
		if(senderobj==get_eWWeight()){
			//recalculate concentration
			var lvolume = get_eVolume().value;
			var lvoldim = findVolDimensionMultiplier(get_cVolDim().value);
			var lwinpconcdim = findWeightConcDimensionMultiplier(get_cWInpConcDim().value);
			
			if(lvolume!=0&&lvoldim>0&&lwinpconcdim>0){
				get_eWInpConc().value = formatDigits(lweight/(lvolume*lwinpconcdim*lvoldim));
			}				
		}
		else if(senderobj==get_eWInpConc()){
			var lwinpconcdim = findWeightConcDimensionMultiplier(get_cWInpConcDim().value);
			var lvolume = get_eVolume().value;
			var lvoldim = findVolDimensionMultiplier(get_cVolDim().value);
			if(lwdm>0&&lvoldim>0&&lwinpconcdim>0){
				lweight = get_eWInpConc().value*lwinpconcdim*lvolume*lvoldim;
				get_eWWeight().value = formatDigits(lweight/lwdm);
			}				
		}
	}
	var ldnasize = getDNASize(get_cDNAType().value);
	var ldnaweight = getDNAWeight(get_cDNAType().value);
	var lmolweight = ldnasize*ldnaweight;
	if(Math.abs(lmolweight)<1){
		lmolweight = 1;
	}
	var lmass = 1.0;
	
	var lmolquant = lweight/lmolweight;
	
	var lmdim = findMolDimensionMultiplier(get_cWMOLDim().value);
	if(lmdim>0){
		get_eWMolQuant().value = formatDigits(lmolquant/lmdim);		
	}
	var lavog =lmolquant*AVOGADRO;
	var lmclog = Math.log(lavog)/Math.LN10;
	if(lmclog>0){
		var base = Math.pow(10,Math.floor(lmclog)-3);
		lavog= Math.round(lavog/base)*base;
	}
	else{
	}
	get_eWMoleculeCount().value = Math.round(lavog);
	
	var lvolume = get_eVolume().value;
	var lvoldim = findVolDimensionMultiplier(get_cVolDim().value);
	var lwconcdim = findMolConcDimensionMultiplier(get_cWConcDim().value);
	if(lvolume!=0&&lvoldim>0&&lwconcdim>0){
		get_eWConc().value = formatDigits(lmolquant/(lvolume*lwconcdim*lvoldim));
	}	
}

function recalcWeightQuantities(){
	if(get_cMMOLDim()){
		var lmdim = findMolDimensionMultiplier(get_cMMOLDim().value);
		var lmolquant = 0.0;
		lmolquant = lmdim*get_eMMolQuant().value;
		var ldnasize = getDNASize(get_cDNAType().value);
		var ldnaweight = getDNAWeight(get_cDNAType().value);
		var lmolweight = ldnasize*ldnaweight;
		if(Math.abs(lmolweight)<1){
			lmolweight = 1;
		}
		var lmass = 1.0;
		
		var lweight = lmolweight*lmolquant;
		
		var lwdim = findWeightDimensionMultiplier(get_cMWeightDim().value);
		if(lwdim>0){
			get_eMWeightQuant().value = formatDigits(lweight/lwdim);		
		}
	}	
}

function recalcWeightConcentrations(){
	if(get_cMInpConcDim()){
		var lminpconcdim = findMolConcDimensionMultiplier(get_cMInpConcDim().value);
		var ldnasize = getDNASize(get_cDNAType().value);
		var ldnaweight = getDNAWeight(get_cDNAType().value);
		var lmolweight = ldnasize*ldnaweight;
		if(Math.abs(lmolweight)<1){
			lmolweight = 1;
		}
		var lconcdim = findWeightConcDimensionMultiplier(get_cWConcDim().value);
		get_eWConc().value = formatDigits(get_eMInpConc().value*lminpconcdim*lmolweight/lconcdim);
	}
}

function recalcWeightQuant(senderobj){
	var lmdim = findMolDimensionMultiplier(get_cMMOLDim().value);
	var lmolquant = 0.0;
	lmolquant = lmdim*get_eMMolQuant().value;
	if(senderobj){
		if(senderobj==get_eMMolQuant()){
			//recalculate concentration
			var lvolume = get_eVolume().value;
			var lvoldim = findVolDimensionMultiplier(get_cVolDim().value);
			var lminpconcdim = findMolConcDimensionMultiplier(get_cMInpConcDim().value);
			
			if(lvolume!=0&&lvoldim>0&&lminpconcdim>0){
				get_eMInpConc().value = formatDigits(lmolquant/(lvolume*lminpconcdim*lvoldim));
			}				
		}
		else if(senderobj==get_eMInpConc()){
			var lminpconcdim = findMolConcDimensionMultiplier(get_cMInpConcDim().value);
			var lvolume = get_eVolume().value;
			var lvoldim = findVolDimensionMultiplier(get_cVolDim().value);
			if(lmdim>0&&lvoldim>0&&lminpconcdim>0){
				lmolquant = get_eMInpConc().value*lminpconcdim*lvolume*lvoldim;
				get_eMMolQuant().value = formatDigits(lmolquant/lmdim);
			}				
		}
	}
	
	
	var ldnasize = getDNASize(get_cDNAType().value);
	var ldnaweight = getDNAWeight(get_cDNAType().value);
	var lmolweight = ldnasize*ldnaweight;
	if(Math.abs(lmolweight)<1){
		lmolweight = 1;
	}
	var lmass = 1.0;
	
	var lweight = lmolweight*lmolquant;
	
	var lwdim = findWeightDimensionMultiplier(get_cMWeightDim().value);
	if(lwdim>0){
		get_eMWeightQuant().value = formatDigits(lweight/lwdim);		
	}
	
	var lvolume = get_eVolume().value;
	var lvoldim = findVolDimensionMultiplier(get_cVolDim().value);
	var lconcdim = findWeightConcDimensionMultiplier(get_cMConcDim().value);
	if(lvolume!=0&&lvoldim>0&&lconcdim>0){
		get_eMConc().value = formatDigits(lweight/(lvolume*lconcdim*lvoldim));
	}
	
}

function onChangeVolume(){
	recalcMolarQuant(get_eWInpConc());
	recalcWeightQuant(get_eMInpConc());
}

var DSDNAABSORBTION = 0.3;
var SSDNAABSORBTION = 0.1;
var RNAABSORBTION = 0.12;

function recalcSpectroConc(){
	if(get_eSPA260Inp()){
		var ldnasize = getDNASize(get_cDNAType().value);
		var labsorb = get_eSPA260Inp().value;
		var lconst = 0.0;
		var nnuccount = 1.0;
		if(get_cDNAType().value=="rna"){
			lconst = RNAABSORBTION;
		}
		else if(get_cDNAType().value=="ssdna"||get_cDNAType().value=="oligo"){
			lconst =  SSDNAABSORBTION;
		}
		else{
			lconst =  DSDNAABSORBTION;
			nnuccount = 2;
		}
		
		var lconc = NaN;
		if(ldnasize>0){
			lconc = labsorb*lconst/(ldnasize*nnuccount);
		}
		var lconcdim = findMolConcDimensionMultiplier(get_cSPConcDimOut().value);
		if(lconcdim>0){
			get_eSPConcOut().value = formatDigits(lconc/(1000*lconcdim));
		}
		var ldnaweight = getAvgDNAWeight(get_cDNAType().value);
		var lconcwdim = findWeightConcDimensionMultiplier(get_cSPConcWDimOut().value);
		if(lconcwdim>0){
			get_eSPConcWOut().value = formatDigits((labsorb*lconst*ldnaweight)/(1000*nnuccount*nnuccount*lconcwdim));
		}
		
	}
}

function recalcSpectroAbs(){
	if(get_eSPConcInp()){
		var ldnasize = getDNASize(get_cDNAType().value);
		var lconc = get_eSPConcInp().value;
		var lconst = 0.0;
		var nnuccount = 1.0;
		if(get_cDNAType().value=="rna"){
			lconst = RNAABSORBTION;
		}
		else if(get_cDNAType().value=="ssdna"||get_cDNAType().value=="oligo"){
			lconst =  SSDNAABSORBTION;
		}
		else{
			lconst =  DSDNAABSORBTION;
			nnuccount = 2;
		}
		
		var labs = NaN;
		var lconcdim = findMolConcDimensionMultiplier(get_cSPConcDimInp().value);
		labs = 1000*lconcdim*lconc*ldnasize*nnuccount/lconst;
		
		get_eSPA260Out().value = formatDigits(labs);
		
		var ldnaweight = getAvgDNAWeight(get_cDNAType().value);
		var lwconc = get_eSPWConcInp().value;
		var lwconcdim = findWeightConcDimensionMultiplier(get_cSPWConcDimInp().value);
		var lwabs = NaN;
		if(ldnaweight>0){
			lwabs = 1000*lwconcdim*lwconc*nnuccount*nnuccount/(lconst*ldnaweight);
		}
		get_eSPA260WOut().value = formatDigits(lwabs)
	}
}


function get_eLigVectorLength(){
	return document.getElementById("eLigVectorLength");
}

function get_eLigInsertLength(){
	return document.getElementById("eLigInsertLength");
}

function get_cLigRatio(){
	return document.getElementById("cLigRatio");
}

function get_eLigVectorWeightInp(){
	return document.getElementById("eLigVectorWeightInp");
}

function get_cLigVectorWDim(){
	return document.getElementById("cLigVectorWDim");
}

function get_eLigInsertWeightOut(){
	return document.getElementById("eLigInsertWeightOut");
}

function get_cLigInsertWDim(){
	return document.getElementById("cLigInsertWDim");
}

function recalcLigationRatio(){
	var lVecLgth = get_eLigVectorLength().value;
	var lInsLgth = get_eLigInsertLength().value;
	var lRatioCmb = get_cLigRatio().value;
	var lRatio = 0.0;
	if(lRatioCmb=="11"){
		lRatio = 1.0;
	}
	else if(lRatioCmb=="13"){
		lRatio = 3.0;
	}
	else if(lRatioCmb=="31"){
		lRatio = 1.0/3.0;
	}
	var lVecWeight = get_eLigVectorWeightInp().value; 
	var lVecDim = findWeightDimensionMultiplier(get_cLigVectorWDim().value);
	var lInsDim = findWeightDimensionMultiplier(get_cLigInsertWDim().value);
	var lRes = lRatio*(lInsLgth/lVecLgth)*lVecWeight*lVecDim/lInsDim;
	get_eLigInsertWeightOut().value = formatDigits(lRes);
}

function get_eDNAEndsSeqLength(){
	return document.getElementById("eDNAEndsSeqLength");
}
function get_cDNAEndsCutsCount(){
	return document.getElementById("cDNAEndsCutsCount");
}
function get_rbCircular(){
	return document.getElementById("rbCircular");
}
function get_rbLinear(){
	return document.getElementById("rbLinear");
}
function get_eDNAEndsWeightInp(){
	return document.getElementById("eDNAEndsWeightInp");
}
function get_cDNAEndsWeightInpDim(){
	return document.getElementById("cDNAEndsWeightInpDim");
}
function get_eDNAEndsMolOut(){
	return document.getElementById("eDNAEndsMolOut");
}
function get_cDNAEndsMolOutDim(){
	return document.getElementById("cDNAEndsMolOutDim");
}

function recalcDNAEnds(){
	var lSeqLength = get_eDNAEndsSeqLength().value;
	var lSeqCutsCount = 0;
	lSeqCutsCount = 1*get_cDNAEndsCutsCount().value;
	var lLinearForm = get_rbLinear().checked;
	var lWeight = get_eDNAEndsWeightInp().value;
	var lWeightDim = findWeightDimensionMultiplier(get_cDNAEndsWeightInpDim().value);
	var lMolDim = findMolDimensionMultiplier(get_cDNAEndsMolOutDim().value);
	if(lMolDim>0){
		var lRes = lWeight*lWeightDim/(lSeqLength*1000*2*DNAMWConst);
		
		if(lLinearForm){
			lSeqCutsCount++ 
		}
		lRes *= 2*lSeqCutsCount;
		get_eDNAEndsMolOut().value = formatDigits(lRes/lMolDim);
	}


}

