var ctrlKey  = false;
var caretPos = -1;
var sequenceRevert = false;

$(document).ready(function()
{
	// Change currency function.
	$('#currentCodeSection a:not(.current)').click(function(e)
	{
		e.preventDefault();
		
		// Set currency on hidden field.
		$(this).parents('form').children('input[name=CurrencyCode]').val($(this).attr('href'));
		
		// Submit form.
		$(this).parents('form').submit();
	});
	
	// Open/close currency options.
	$('#currentCodeSection a.current').click(function(e)
	{
		e.preventDefault();
		
		$('#currentCodeSection .options').toggleClass('active');
	});
	
	// Sequence field in sidebar.
	$('.customPeptideSearch input[name=keyword]').val($('.customPeptideSearch input[name=keyword]').attr('value'));
	$('.customPeptideSearch input[name=keyword]').data('current', $(this).val());
	$('.customPeptideSearch input[name=keyword]').live('focus', function()
	{
		caretPos = getSelectionStart(this);
	});
	$('.customPeptideSearch input[name=keyword]').live('keydown', function(e)
	{
		// CTRL/command key.
		if(e.which != 17 && e.which != 224)
		{
			// Validation.
			var regex = 'ACDEFGHIKLMNPQRSTVWY';
			// Validate backspace/delete, caret moving characters (left, right, home, end).
			var valid = regex.indexOf(String.fromCharCode(e.which).toString().toUpperCase()) != -1 || e.which == 8 ||  e.which == 46 || e.which == 37 || e.which == 39 || e.which == 36 || e.which == 35;
			
			// Save current valid value.
			var regex = /^[ACDEFGHIKLMNPQRSTVWY]+$/;
			if(regex.test($(this).val().toUpperCase()) || $(this).val().toUpperCase() == '')
			{
				$(this).data('current', $(this).val());
				caretPos = getSelectionStart(this);
			}
			
			// Post validation.
			if(!valid && !ctrlKey && e.which != 13)
			{
				//sequenceRevert = true;
				e.preventDefault();
			}
		}
		else
		{
			ctrlKey = true;
		}
	});
	$('.customPeptideSearch input[name=keyword]').live('keyup', function(e)
	{
		// Get current location of caret.
		var pos = getSelectionStart(this);
		
		// CTRL/command key.
		if(e.which != 17 && e.which != 224)
		{
			// Validate for CTRL functions.
			var regex = /^[ACDEFGHIKLMNPQRSTVWY]+$/;
			
			// Post validation.
			if(((sequenceRevert && !ctrlKey) || !regex.test($(this).val().toUpperCase())) && !$(this).val().toUpperCase() == '')
			{
				$(this).val($(this).data('current'));
				setSelectionStart(this, caretPos);
				
				sequenceRevert = false;
			}
			else
				$(this).data('current', $(this).val());
		}
		else
		{
			// Reset.
			ctrlKey = false;
		}
	});
	
});


function getSelectionStart(o)
{
	if(o.createTextRange)
	{
		var r = document.selection.createRange().duplicate();
		r.moveEnd('character', o.value.length);
		if(r.text == '')
			return o.value.length;
		return o.value.lastIndexOf(r.text);
	}
	else 
		return o.selectionStart;
}

function getSelectionEnd(o)
{
	if(o.createTextRange)
	{
		var r = document.selection.createRange().duplicate();
		r.moveStart('character', -o.value.length);
		return r.text.length;
	}
	else
		return o.selectionEnd;
}

function setSelectionStart(oField, iCaretPos)
{
	// IE Support
	if(document.selection)
	{ 
		// Set focus on the element
		oField.focus();
		
		// Create empty selection range
		var oSel = document.selection.createRange();
		
		// Move selection start and end to 0 position
		oSel.moveStart('character', -oField.value.length);
		
		// Move selection start and end to desired position
		oSel.moveStart('character', iCaretPos);
		oSel.moveEnd('character', 0);
		oSel.select();
	}
	
	// Firefox support
	else if(oField.selectionStart || oField.selectionStart == '0')
	{
		oField.selectionStart = iCaretPos;
		oField.selectionEnd = iCaretPos;
		oField.focus();
	}
}