function hideHelp()
{
	document.getElementById('help_closed').style.display = 'block';
	document.getElementById('help_open').style.display = 'none';
}

function showHelp()
{
	document.getElementById('help_closed').style.display = 'none';
	document.getElementById('help_open').style.display = 'block';
}

function setMtStandard(standard)
{
	// make sure the standard exists
	if (labHvRegions[standard] == null)
		standard = document.getElementById('combo_standards').options[0].value;

    // set the combo value
    setComboValue('combo_standards', standard, 0);
    
    // fire the standard event
	mtStandardChanged(standard);
}

// get lab standard
function getMtStandard()
{
    return document.getElementById('combo_standards').value;
}

function mtStandardChanged(standard)
{
	// update the regions
	updateRegionForStandard(standard, 'hvr1', 'HVR1');
	updateRegionForStandard(standard, 'hvr2', 'HVR2');
	updateRegionForStandard(standard, 'hvr3', 'HVR3');
	
	// center them
	centerRegions();
	
	// validate the current mutations
	validateMutations('hvr1', false);
	validateMutations('hvr2', false);
	validateMutations('hvr3', false);
	updateWarnings();
}

function updateRegionForStandard(standard, id, label)
{
	var state = labHvRegions[standard][id];
	var checkbox = document.getElementById(id);
	checkbox.disabled = !state;
	checkbox.checked = state;
	setHvRegionVisible(id, state);
	if (state)
		setTextNode(id+'_label', label+' (' + labHvRegions[standard][id+'_start'] + ' to ' + labHvRegions[standard][id+'_end'] + ')');
}

function hvRegionSelected(hvr, element)
{
	// make sure at least one region is selected
	var valid = document.getElementById('hvr1').checked ||
				document.getElementById('hvr2').checked ||
				document.getElementById('hvr3').checked;
	
	if (valid)
	{
		setHvRegionVisible(hvr, element.checked);
		centerRegions();
	}
	else
	{
		alert('At least one region must be selected.');
		element.checked = true;
	}
}

function setHvRegionVisible(hvr, visible)
{
	var table = document.getElementById(hvr+'_region');
	if (visible)
		table.style.display = 'block';
	else
		table.style.display = 'none';
}

function isHvRegionVisible(hvr)
{
	return document.getElementById(hvr).checked;
}

// center the regions by adjusting the padding
function centerRegions()
{
	var regionNames = new Array('hvr1', 'hvr2', 'hvr3');
	var regionVisible = new Array(document.getElementById('hvr1').checked, document.getElementById('hvr2').checked, document.getElementById('hvr3').checked);
	for (var i = 0; i < regionNames.length; i++)
	{
		var region = document.getElementById(regionNames[i]+'_td');
		if (regionVisible[i])
		{
			region.style.paddingLeft = isFirst(i, regionVisible) ? '0px' : '10px';
			region.style.paddingRight = isLast(i, regionVisible) ? '0px' : '10px';
		}
		else
		{
			// no padding
			region.style.paddingLeft = '0px';
			region.style.paddingRight = '0px';
		}
	}
}

function isFirst(index, regionVisible)
{
	var first = true;
	for (var i = index-1; i >= 0; i--)
	{
		if (regionVisible[i])
		{
			first = false;
			break;
		}
	}
	return first;
}

function isLast(index, regionVisible)
{
	var last = true;
	for (var i = index+1; i < regionVisible.length; i++)
	{
		if (regionVisible[i])
		{
			last = false;
			break;
		}
	}
	return last;
}

// parse the mutation cookie
function parseMutations(cookie, defaults)
{
	if (cookie == null)
		return defaults;
	else if (cookie == 'none')
		return new Array();
		
    var initial = new Array();
    initial = cookie.split('|');
	return initial;
}

// set the mutations from the specified array
function setMutations(hvr, values)
{
	for (var i = 0; i < 7; i++)
	{
		for (var j = 0; j < 2; j++)
		{
			var element = document.getElementById(hvr+'_mut_'+i+'_'+j);
			var index = (i*2)+j;
			element.value = index < values.length ? values[index] : '';
		}
	}
}

function clearRegion(hvr)
{
	for (var i = 0; i < 7; i++)
	{
		for (var j = 0; j < 2; j++)
		{
			var element = document.getElementById(hvr+'_mut_'+i+'_'+j);
			element.value = '';
			element.parentNode.className = 'mutation_field';
		}
	}
}

function validateMutations(hvr, deleteInvalid)
{
	for (var i = 0; i < 7; i++)
	{
		for (var j = 0; j < 2; j++)
		{
			validateMutation(hvr, i, j, deleteInvalid);
		}
	}
}

function defaultMutationValues()
{
	setMutations('hvr1', hvr1Defaults);
	setMutations('hvr2', hvr2Defaults);
	setMutations('hvr3', hvr3Defaults);

	// validate the current mutations
	validateMutations('hvr1', true);
	validateMutations('hvr2', true);
	validateMutations('hvr3', true);
	updateWarnings();
}

function resetMutationValues()
{
	setMutations('hvr1', hvr1Initial);
	setMutations('hvr2', hvr2Initial);
	setMutations('hvr3', hvr3Initial);

	// validate the current mutations
	validateMutations('hvr1', false);
	validateMutations('hvr2', false);
	validateMutations('hvr3', false);
	updateWarnings();
}

function clearMutationValues()
{
	// clear all regions
	clearRegion('hvr1');
	clearRegion('hvr2');
	clearRegion('hvr3');
	updateWarnings();
}

function validateMutation(hvr, row, column, deleteInvalid)
{
	var element = document.getElementById(hvr+'_mut_'+row+'_'+column);
    var mutationPat = /^((\d{1,5}[A-Za-z;\-\:])|(\d{1,5}\.\d[A-Za-ce-z]))$/;
    var mutation = element.value;
    var valid = true;
    if (mutation.length > 0)
    {
    	// see if it matches the pattern
    	var m = mutation.match(mutationPat);
    	if (m != null)
    	{
    		// make sure it's in range
    		var lab = getMtStandard();
    		var position = parseInt(m[1], 10);
    		var start = parseInt(labHvRegions[lab][hvr+'_start'], 10);
    		var end = parseInt(labHvRegions[lab][hvr+'_end'], 10);
    		valid = start <= position && end >= position;
    	}
    	else
    	{
    		valid = false;
    	}
    }
    // delete the offending entry if sepecified
    if (!valid && deleteInvalid)
    {
    	element.value = '';
    	valid = true;
    }
	element.parentNode.className = valid ? 'mutation_field' : 'mutation_field_invalid';
	return valid;
}

function mutationsValid()
{
	// loop through the visible regions to see if there are any invalid mutations
	var region = new Array('hvr1', 'hvr2', 'hvr3');
	for (var i = 0; i < region.length; i++)
	{
		var hvr = region[i];
		if (isHvRegionVisible(hvr))
		{
			for (var j = 0; j < 7; j++)
			{
				for (var k = 0; k < 2; k++)
				{
					var element = document.getElementById(hvr+'_mut_'+j+'_'+k);
					if (element.parentNode.className == 'mutation_field_invalid')
						return false;
				}
			}
		}
	}
	return true;
}

function checkSubmit()
{
	if (!mutationsValid())
	{
		alert('Please correct the invalid mutations before searching.');
		return false;
	}
	return true;
}

function updateWarnings()
{
	var info = document.getElementById('invalidMutationInfo');
	info.style.display = mutationsValid() ? 'none' : 'block';
}

function setSearchType(type)
{
	document.getElementById('search_' + type).checked = true;
	searchTypeClicked(type);
}

// search type clicked
function searchTypeClicked(value)
{
	var surname_search = value == 'surname';

	document.getElementById('surname').disabled = !surname_search;
	document.getElementById('surname_exact').disabled = !surname_search;
	document.getElementById('surname_approximate').disabled = !surname_search;
	document.getElementById('surname').className = surname_search ? '' : 'label_disabled text_disabled';
	document.getElementById('surname_labels').className = surname_search ? '' : 'label_disabled';

	document.getElementById('differences_zero').disabled = surname_search;
	document.getElementById('differences_one').disabled = surname_search;
	document.getElementById('differences_two').disabled = surname_search;
	document.getElementById('genetic_labels').className = !surname_search ? '' : 'label_disabled';
}

function setSurname(surname)
{
	document.getElementById('surname').value =  surname;
}

function setSurnameType(type)
{
	document.getElementById('surname_' + type).checked = true;
}

function setShowHvRegion(hvr, show)
{
	setHvRegionVisible(hvr, show);
	document.getElementById(hvr).checked = show;
}

function setDifferences(diffId)
{
	document.getElementById('differences_'+diffId).checked = true;
}

function setShowSurnames(show)
{
	document.getElementById('show_surnames').checked = show;
}

function setShowCountry(show)
{
	document.getElementById('show_countries').checked = show;
}
