//formlib.js
//Basic javascript functions for form validation
//by Carlo Lapid, Aug. 8 2006

function validate_firstform(form) {
	if (check_string(form["sequence_file"].value, 'DNA sequence', 3, 500, 'n') == false) {
		if (check_string(form["sequence_textarea"].value, 'DNA sequence', 40, 8000) == false) {
			form["sequence_textarea"].focus();
			return false;
		}
	}
}

function validate_DNA2(form) {
	if (check_string(form["mut_DNA_sequence"].value, 'Mutated DNA sequence', 40, 8000) == false) {
		form["mut_DNA_sequence"].focus();
		return false;
	}
	if (form["clean_DNA_sequence"].value == form["mut_DNA_sequence"].value) {
		alert('You did not enter any mutation.');
		form["mut_DNA_sequence"].focus();
		return false;
	}
	if (check_range(form["min_Tm"].value, 'Minimum melting temp', 40, 100) == false) {
		form["min_Tm"].focus();
		return false;
	}
	if (check_range(form["max_Tm"].value, 'Maximum melting temp', 40, 100) == false) {
		form["max_Tm"].focus();
		return false;
	}
	if (check_range(form["min_GC"].value, 'Minimum GC content', 0, 100) == false) {
		form["min_GC"].focus();
		return false;
	}
	if (check_range(form["max_GC"].value, 'Maximum GC content', 0, 100) == false) {
		form["max_GC"].focus();
		return false;
	}
	if (check_range(form["min_length"].value, 'Minimum length', 1, 99, 'i') == false) {
		form["min_length"].focus();
		return false;
	}
	if (check_range(form["max_length"].value, 'Maximum length', 1, 99, 'i') == false) {
		form["max_length"].focus();
		return false;
	}
	if (check_range(form["min_5p_flank"].value, 'Minimum 5\' flanking region', 0, 50, 'i') == false) {
		form["min_5p_flank"].focus();
		return false;
	}
	if (check_range(form["max_5p_flank"].value, 'Maximum 5\' flanking region', 0, 50, 'i') == false) {
		form["max_5p_flank"].focus();
		return false;
	}
	if (check_range(form["min_3p_flank"].value, 'Minimum 3\' flanking region', 0, 50, 'i') == false) {
		form["min_3p_flank"].focus();
		return false;
	}
	if (check_range(form["max_3p_flank"].value, 'Maximum 3\' flanking region', 0, 50, 'i') == false) {
		form["max_3p_flank"].focus();
		return false;
	}
	if (form["protocols2"].value != 'Basic' && form["protocols2"].value != 'Quikchange') {
		if (form["min_distance"].value != parseInt(form["min_distance"].value))	{
			form["min_distance"].focus();
			alert('Minimum distance from mutation not an integer.');
			return false;
		}
		if (form["max_distance"].value != parseInt(form["max_distance"].value))	{
			form["max_distance"].focus();
			alert('Maximum distance from mutation not an integer.');
			return false;
		}
		if (check_range(form["min_Tm_rev_primer"].value, 'Reverse primer minimum melting temp', 40, 100) == false) {
			form["min_Tm_rev_primer"].focus();
			return false;
		}
		if (check_range(form["max_Tm_rev_primer"].value, 'Reverse primer maximum melting temp', 40, 100) == false) {
			form["max_Tm_rev_primer"].focus();
			return false;
		}
		if (check_range(form["min_GC_rev_primer"].value, 'Reverse primer minimum GC content', 0, 100) == false) {
			form["min_GC_rev_primer"].focus();
			return false;
		}
		if (check_range(form["max_GC_rev_primer"].value, 'Reverse primer maximum GC content', 0, 100) == false) {
			form["max_GC_rev_primer"].focus();
			return false;
		}
		if (check_range(form["min_length_rev_primer"].value, 'Reverse primer minimum length', 1, 99, 'i') == false) {
			form["min_length_rev_primer"].focus();
			return false;
		}
		if (check_range(form["max_length_rev_primer"].value, 'Reverse primer maximum length', 1, 99, 'i') == false) {
			form["max_length_rev_primer"].focus();
			return false;
		}
	}
}

function validate_protein3(form) {
	if (check_range(form["min_Tm"].value, 'Minimum melting temp', 40, 100) == false) {
		form["min_Tm"].focus();
		return false;
	}
	if (check_range(form["max_Tm"].value, 'Maximum melting temp', 40, 100) == false) {
		form["max_Tm"].focus();
		return false;
	}
	if (check_range(form["min_GC"].value, 'Minimum GC content', 0, 100) == false) {
		form["min_GC"].focus();
		return false;
	}
	if (check_range(form["max_GC"].value, 'Maximum GC content', 0, 100) == false) {
		form["max_GC"].focus();
		return false;
	}
	if (check_range(form["min_length"].value, 'Minimum length', 1, 99, 'i') == false) {
		form["min_length"].focus();
		return false;
	}
	if (check_range(form["max_length"].value, 'Maximum length', 1, 99, 'i') == false) {
		form["max_length"].focus();
		return false;
	}
	if (check_range(form["min_5p_flank"].value, 'Minimum 5\' flanking region', 0, 50, 'i') == false) {
		form["min_5p_flank"].focus();
		return false;
	}
	if (check_range(form["max_5p_flank"].value, 'Maximum 5\' flanking region', 0, 50, 'i') == false) {
		form["max_5p_flank"].focus();
		return false;
	}
	if (check_range(form["min_3p_flank"].value, 'Minimum 3\' flanking region', 0, 50, 'i') == false) {
		form["min_3p_flank"].focus();
		return false;
	}
	if (check_range(form["max_3p_flank"].value, 'Maximum 3\' flanking region', 0, 50, 'i') == false) {
		form["max_3p_flank"].focus();
		return false;
	}
	if (form["protocol"].value != 'Basic' && form["protocol"].value != 'Quikchange') {
		if (form["min_distance"].value != parseInt(form["min_distance"].value))	{
			form["min_distance"].focus();
			alert('Minimum distance from mutation not an integer.');
			return false;
		}
		if (form["max_distance"].value != parseInt(form["max_distance"].value))	{
			form["max_distance"].focus();
			alert('Maximum distance from mutation not an integer.');
			return false;
		}
		if (check_range(form["min_Tm_rev_primer"].value, 'Reverse primer minimum melting temp', 40, 100) == false) {
			form["min_Tm_rev_primer"].focus();
			return false;
		}
		if (check_range(form["max_Tm_rev_primer"].value, 'Reverse primer maximum melting temp', 40, 100) == false) {
			form["max_Tm_rev_primer"].focus();
			return false;
		}
		if (check_range(form["min_GC_rev_primer"].value, 'Reverse primer minimum GC content', 0, 100) == false) {
			form["min_GC_rev_primer"].focus();
			return false;
		}
		if (check_range(form["max_GC_rev_primer"].value, 'Reverse primer maximum GC content', 0, 100) == false) {
			form["max_GC_rev_primer"].focus();
			return false;
		}
		if (check_range(form["min_length_rev_primer"].value, 'Reverse primer minimum length', 1, 99, 'i') == false) {
			form["min_length_rev_primer"].focus();
			return false;
		}
		if (check_range(form["max_length_rev_primer"].value, 'Reverse primer maximum length', 1, 99, 'i') == false) {
			form["max_length_rev_primer"].focus();
			return false;
		}
	}
}

function validate_primer(form) {
	if (check_string(form["primer_sequence"].value, 'Primer sequence', 1, 90) == false)	{
		form["primer_sequence"].focus();
		return false;
	}
	if (check_range(form["mismatch"].value, 'Number of mismatched bases', 1, 20, 'i') == false) {
		form["mismatch"].focus();
		return false;
	}
}

function check_range(number, name, min, max, datatype) {
	var errormessage;
	if (datatype) {
		dataype = datatype.toLowerCase();
		datatype = datatype.charAt(0);
	}
	if (datatype == 'i') {
		if (number != parseInt(number)) {
			errormessage = name + ' is not an integer.';
			alert(errormessage);
			return false;
		}
	} else {
		if (number != parseFloat(number)) {
			errormessage = name + ' is not a number.';
			alert(errormessage);
			return false;
		}
	}
	if (number < min) {
		errormessage = name + ' is less than ' + min + '.';
		alert(errormessage);
		return false;
	}
	if (number > max) {
		errormessage = name + ' is greater than ' + max + '.';
		alert(errormessage);
		return false;
	}
}

function check_string(input, name, min, max, alerterror) {
	if (alerterror) {
		alerterror = alerterror.toLowerCase();
		alerterror = alerterror.charAt(0);
	}
	var errormessage;
	var trueorfalse;
	if (input.length == 0) {
		errormessage = name + ' was not entered.';
		trueorfalse = false;
	} else {
		if (input.length < min) {
			errormessage = name + ' is too short.';
			trueorfalse = false;
		} else {
			if (input.length > max) {
				errormessage = name + ' is too long.';
				trueorfalse = false;
			}
		}
	}
	if (trueorfalse == false) {
		if (alerterror != 'n')	{
			alert(errormessage);
		}
		return false;
	}
}
