
//-----
//----- Client-side validation for the main registration signup form
//-----


//----- Cached jQuery selections
var emailFields        = null;
var requiredFields     = null;
var userEmail          = null;
var userEmailConfirm   = null;
var validationMessages = null;
var submitValid        = null;


//----- Validation messages
var errorList            = [];
var requiredMessage      = "Required";
var invalidFormMessage   = "Please Fix Items Shown Above";
var invalidEmailMessage  = "Must Be Valid Email Address";
var emailMismatchMessage = "Email Addresses Must Match";


//----- Regular expressions for required fields and email
var regexWhitespace = "^\\s*?$";
var regexValidEmail = "^.+@.+\\.[a-zA-Z]+$";


//----- Initialize signup form
jQuery(document).ready(function()
{
	//----- Cache these selections
	emailFields        = jQuery (".emailField, .emailFieldConfirm");
	requiredFields     = jQuery ("#mainFields  .requiredField"    );
	userEmail          = jQuery ("#mainFields  .emailField"       );
	userEmailConfirm   = jQuery ("#mainFields  .emailFieldConfirm");
	validationMessages = jQuery (".validationMessage"             );
	submitValid        = jQuery ("#submitValid"                   );

	//----- Toggle display of extra questions
	/*var extraQuestions = jQuery("#optInSection .extraQuestions");
	jQuery("#optIn").each(function()
	{
		this.checked = false;
	});	
	jQuery("#optIn").click(function()
	{
		extraQuestions.toggle();
	});
	extraQuestions.hide();*/
	

	//----- Init opt-in checkbox
	jQuery("#optIn").each(function()
	{
		this.checked = true;
	});

	//----- Validate when typing in these fields
	emailFields   .keyup (function() { emailFields.each(function() { validateField (jQuery(this)); })});
	requiredFields.keyup (function() { validateField (jQuery(this)); });

	//----- Validate when entering these fields
	emailFields   .focus (function() { validateField (jQuery(this)); });
	requiredFields.focus (function() { validateField (jQuery(this)); });

	//----- Validate when exiting these fields
	emailFields   .blur (function() { emailFields.each(function() { validateField (jQuery(this)); })});
	requiredFields.blur (function() { validateField (jQuery(this)); });
});


function validateForm()
{
    //----- Validate entire form
	hideAllValidationMessages();
	compileValidationMessages();
	showAllValidationMessages();
	
	//----- Form valid or not?
	return errorList.length == 0;
}


function compileValidationMessages()
{
	clearErrorList();
	submitValid.html("");
	
	//----- Check required fields
	requiredFields.each(function()
	{
		if (stringIsEmpty(this.value))
		{
			addToErrorList(jQuery(this), requiredMessage);
		}
	});

	//----- Email must match and be valid
	checkEmails(userEmail, userEmailConfirm, errorList);
}


function showAllValidationMessages()
{
	submitValid.html(invalidFormMessage);

	for (var i = 0; i < errorList.length; i++)
	{
		showMessage(errorList[i]);
	}
}


function validateField(field)
{
	compileValidationMessages();
	var fieldName = field.attr("name");
	
	//----- Search errorlist for proper field
	var foundError = false;
	for (var i = 0; i < errorList.length; i++)
	{
		if (fieldName == errorList[i].name)
		{
            //----- Error found on this field
			showMessage(errorList[i]);
			foundError = true;
			break;
		}
	}
	
	//----- Clear validation message on
    //----- field if no error was found
	if (foundError == false)
	{
        field.next().html("");
	}
}


function showMessage(errorListItem)
{
    errorListItem.target.html(errorListItem.message);
}


function hideAllValidationMessages()
{
    validationMessages.html("");
}


function checkEmails(email1, email2, errorList)
{
	//----- Email must match and be valid
	if (email1.val() == email2.val())
	{
		if (!isMatch(regexValidEmail, email1.val()))
		{
			addToErrorList(email1, invalidEmailMessage);
			addToErrorList(email2, invalidEmailMessage);
		}
	}
	else
	{
		addToErrorList(email1, emailMismatchMessage);
		addToErrorList(email2, emailMismatchMessage);
	}
}


function addToErrorList(errorSource, errorMessage)
{
	errorList.push(
    {
		name    : errorSource.attr("name"),
		target  : errorSource.next(),
		message : errorMessage
	});
}


function clearErrorList()
{
	var len = errorList.length;
	
	if (len > 0)
	{
		for (var i = 0; i < len; i++)
		{
			errorList.pop();
		}
	}
}


function stringIsEmpty(s)
{
	return isMatch(regexWhitespace, s);
}


function isMatch(pattern, value)
{
	var reg = new RegExp(pattern);
	return reg.test(value);
}

