
function ModuleEventSubmitCheckRequiredFields() { /* <<<( */

	var submitForm = false; // whether or not to submit the form
	var message = ''; // message to display if form is not submitted
	var validDateMessage = '';  // message to display if date is not valid
	var validRepeatDateMessage = '';  // message to display if recurring dates are not valid
	var validEmailMessage = true;  // whether or not email field is valid
	var validRecurFieldsMessage = ''; // message to display if recur fields are not valid

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-title')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-title').value)))
	{
		message += "\tTitle\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-location')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-location').value)))
	{
		message += "\tLocation\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-start-date')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-start-date').value)))
	{
		message += "\tDate\n";
	}
	else {
		// date is non-null, validate it
		validDateMessage = ModuleEventSubmitValidateDate();
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-start-time')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-start-time').value)))
	{
		message += "\tStart Time\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-end-time')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-end-time').value)))
	{
		message += "\tEnd Time\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-recurring')) ||
		(true == document.getElementById('module-event-submit-input-recurring').checked))
	{
		// check required recurring fields
		if ((null == document.getElementById('module-event-submit-input-recur-start-date')) ||
			('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-recur-start-date').value)))
		{
			message += "\tRepeat Start Date\n";
		}
		else {
			validRepeatDateMessage = ModuleEventSubmitValidateRecurringDates();
		}

		// check that recur type fields are properly completed
		validRecurFieldsMessage = ModuleEventSubmitValidateRecurFields();
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-description')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-description').value)))
	{
		message += "\tDescription\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-contact-name')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-contact-name').value)))
	{
		message += "\tContact Name\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-contact-phone')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-contact-phone').value)))
	{
		message += "\tContact Phone\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-event-submit-input-contact-email')) ||
		('' == ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-contact-email').value)))
	{
		message += "\tContact Email\n";
	}
	else {
		// email is non-null, validate it
		validEmailMessage = ModuleEventSubmitValidateEmail();
	}

	// check if errors occurred
	if ('' != message) {
		message = "The following fields are required:\n" + message + "\n";
	}
	if ('' != validDateMessage) {
		message += validDateMessage + "\n";
	}
	if ('' != validRepeatDateMessage) {
		message += validRepeatDateMessage + "\n";
	}
	if (false == ModuleEventSubmitValidateTime()) {
		message += "The end time must come after the start time.\n\n";
	}
	if (false == validEmailMessage) {
		message += "A valid email address must be given.\n\n";
	}
	if (false == ModuleEventSubmitValidateFileExtension()) {
		message += "The image must be one of the following formats:\n";
		message += "\tgif\n";
		message += "\tjpg\n";
		message += "\tpng\n\n";
	}
	if ('' != validRecurFieldsMessage) {
		message += validRecurFieldsMessage + "\n";
	}

	// check for error messages
	if ('' != message) {
		message += "\n"; // for extra padding at bottom of message
		alert(message);
	}
	else {
		// set redirect if available
		if (null != document.getElementById('module-event-submit-form-redirect')) {
			document.getElementById('module-event-submit-form-redirect').value = window.location.href.toString();
		}

		// set handshake if available
		if (null != document.getElementById('module-event-submit-form-handshake')) {
			document.getElementById('module-event-submit-form-handshake').value = '+DBRa5+2jEycPYejNwe4YfOj3Ck2RLmrTbpV4zmAHmGhfxeBunbJpePmkZCyWnP3ZwnpFSgtdW7kHSUzTWJOjA==';
		}

		// allow form to be submitted
		submitForm = true;
	}

	return submitForm;
} /* )>>> */

/*--------------------------------------------------------------------------*/
/**
	@brief Removes leading and trailing whitespace from a given string.
	@param value String to remove leading and trailing whitespace from.
	@return String with leading and trailling whitespace removed.
 */
function ModuleEventSubmitTrim(value) { /* <<<( */

	var trimmedValue = '';

	// remove leading and trailing whitespace
	trimmedValue = value.replace(/^\s*|\s*$/g, '');

	return trimmedValue;
} /* )>>> */

function ModuleEventSubmitValidateEmail() { /* <<<( */

	var email = ''; // email address to validate
	var validEmail = false; // whether or not the email address is valid

	if (null != document.getElementById('module-event-submit-input-contact-email')) {

		email = document.getElementById('module-event-submit-input-contact-email').value;

		// perform very simplistic email validation
		if (null != email.match(/^.+@.+\..+$/ig)) {
			validEmail = true;
		}
	}

	return validEmail;
} /* )>>> */

function ModuleEventSubmitValidateDate() { /* <<<( */

	var dateField = 'module-event-submit-input-start-date'; // date field to validate
	var dateValue = ''; // value of date field
	var message = ''; // message to return

	if (null != document.getElementById(dateField)) {

		// get date field value for easier parsing
		dateValue = document.getElementById(dateField).value;

		// check that date string is of the form 'YYYY-MM-DD', 'YYYY/MM/DD', 'MM-DD-YYYY', or 'MM/DD/YYYY'
		if ((null == dateValue.match(/^[0-9]{4}(\/|-){1}(0[1-9]|1[012]){1}(\/|-){1}(0[1-9]|[12][0-9]|3[01]){1}$/)) && // YYYY-MM-DD or YYYY/MM/DD
		    (null == dateValue.match(/^(0[1-9]|1[012]){1}(\/|-){1}(0[1-9]|[12][0-9]|3[01]){1}(\/|-){1}[0-9]{4}$/))) // MM-DD-YYYY or MM/DD/YYYY
		{
			message += "The date given for the event is not in the correct format.\n";
			message += "Please enter a date in the format 'MM/DD/YYYY'.\n";
			message += "\tExample: " + ModuleEventSubmitGetToday();
		}
	}

	return message;
} /* )>>> */

function ModuleEventSubmitValidateRecurringDates() { /* <<<( */

	var dateField = 'module-event-submit-input-recur-start-date'; // date field to validate
	var dateValue = ''; // value of date field
	var message = ''; // message to return

	if (null != document.getElementById(dateField)) {

		// get date field value for easier parsing
		dateValue = document.getElementById(dateField).value;

		// check that date string is of the form 'YYYY-MM-DD', 'YYYY/MM/DD', 'MM-DD-YYYY', or 'MM/DD/YYYY'
		if ((null == dateValue.match(/^[0-9]{4}(\/|-){1}(0[1-9]|1[012]){1}(\/|-){1}(0[1-9]|[12][0-9]|3[01]){1}$/)) && // YYYY-MM-DD or YYYY/MM/DD
		    (null == dateValue.match(/^(0[1-9]|1[012]){1}(\/|-){1}(0[1-9]|[12][0-9]|3[01]){1}(\/|-){1}[0-9]{4}$/))) // MM-DD-YYYY or MM/DD/YYYY
		{
			message += "The date given for 'Repeat Start' is not in the\n";
			message += "correct format.\n";
			message += "Please enter a date in the format 'MM/DD/YYYY'.\n";
			message += "\tExample: " + ModuleEventSubmitGetToday() + "\n\n";
		}
	}

	dateField = 'module-event-submit-input-recur-end-date'; // date field to validate

	// an empty date field is valid
	if ((null != document.getElementById(dateField)) && ('' != ModuleEventSubmitTrim(document.getElementById(dateField).value))) {

		// get date field value for easier parsing
		dateValue = document.getElementById(dateField).value;

		// check that date string is of the form 'YYYY-MM-DD', 'YYYY/MM/DD', 'MM-DD-YYYY', or 'MM/DD/YYYY'
		if ((null == dateValue.match(/^[0-9]{4}(\/|-){1}(0[1-9]|1[012]){1}(\/|-){1}(0[1-9]|[12][0-9]|3[01]){1}$/)) && // YYYY-MM-DD or YYYY/MM/DD
		    (null == dateValue.match(/^(0[1-9]|1[012]){1}(\/|-){1}(0[1-9]|[12][0-9]|3[01]){1}(\/|-){1}[0-9]{4}$/))) // MM-DD-YYYY or MM/DD/YYYY
		{
			message += "The date given for 'Repeat Until' is not in the\n";
			message += "correct format.\n";
			message += "Please enter a date in the format 'MM/DD/YYYY'.\n";
			message += "\tExample: " + ModuleEventSubmitGetToday() + "\n\n";
		}
	}

	return message;
} /* )>>> */

function ModuleEventSubmitValidateTime() { /* <<<( */

	var startTime = 0; // start time of event in minutes
	var endTime = 0; // end time of event in minutes
	var validTime = false; // whether or not the times are valid

	// get start time
	startTime = parseInt(document.getElementById('module-event-submit-input-start-time').value.substr(0, 2), 10); // get hours
	startTime *= 60; // convert hours to minutes
	startTime += parseInt(document.getElementById('module-event-submit-input-start-time').value.substr(3, 2), 10); // get minutes

	// get end time
	endTime = parseInt(document.getElementById('module-event-submit-input-end-time').value.substr(0, 2), 10); // get hours
	endTime *= 60; // convert hours to minutes
	endTime += parseInt(document.getElementById('module-event-submit-input-end-time').value.substr(3, 2), 10); // get minutes
	
	// check that end time is greater than (or equal to) start time
	if (startTime <= endTime) {
		validTime = true;
	}

	return validTime;
} /* )>>> */

function ModuleEventSubmitGetToday() { /* <<<( */

	var today = '';
	var calendar = new Date();

	// zero pad the month if necessary
	if (10 > (calendar.getMonth() + 1)) {
		today += '0';
	}
	// append the month
	today += (calendar.getMonth() + 1).toString() + '/';

	// zero pad the day if necessary
	if (10 > calendar.getDate()) {
		today += '0';
	}
	// append the day
	today += calendar.getDate().toString() + '/';

	// append the year
	today += calendar.getFullYear().toString();

	return today;
} /* )>>> */

function ModuleEventSubmitValidateFileExtension() { /* <<<( */

	var validExtension = true; // whether or not the file extension is valid
	var extension = ''; // file extension to validate

	// check that input exists
	if ((null != document.getElementById('module-event-submit-input-image')) &&
		('' != ModuleEventSubmitTrim(document.getElementById('module-event-submit-input-image').value)))
	{

		// get extension
		extension = document.getElementById('module-event-submit-input-image').value;

		// validate extension
		if (null == extension.toLowerCase().match(/.+\.(gif|jpeg|jpg|png)$/)) {
			validExtension = false;
		}
	}

	return validExtension;
} /* )>>> */

function ModuleEventSubmitToggleRecurringControls(display) { /* <<<( */

	if (true == display) {

		document.getElementById('module-event-submit-container-recur-start-date').style.display = 'block';
		document.getElementById('module-event-submit-container-recur-end-date').style.display = 'block';
		document.getElementById('module-event-submit-container-recur-type').style.display = 'block';
		ModuleEventSubmitDisplayRecurTypeControls(document.getElementById('module-event-submit-input-recur-type').value);
	}
	else {

		document.getElementById('module-event-submit-container-recur-start-date').style.display = 'none';
		document.getElementById('module-event-submit-container-recur-end-date').style.display = 'none';
		document.getElementById('module-event-submit-container-recur-type').style.display = 'none';
		document.getElementById('module-event-submit-container-recur-monthly').style.display = 'none';
		document.getElementById('module-event-submit-container-recur-day').style.display = 'none';
	}

	return;
} /* )>>> */

function ModuleEventSubmitDisplayRecurTypeControls(recurType) { /* <<<( */

	switch (recurType) {
		
		case 'weekly':
			document.getElementById('module-event-submit-container-recur-day').style.display = 'block';
			document.getElementById('module-event-submit-container-recur-monthly').style.display = 'none';
			break;

		case 'monthly':
			document.getElementById('module-event-submit-container-recur-monthly').style.display = 'block';
			ModuleEventSubmitDisplayMonthlyRecurControls(document.getElementById('module-event-submit-input-recur-monthly').value);
			break;

		case 'yearly':
			document.getElementById('module-event-submit-container-recur-day').style.display = 'none';
			document.getElementById('module-event-submit-container-recur-monthly').style.display = 'none';
			break;

		default:
			break;
	}

	return;
} /* )>>> */

function ModuleEventSubmitDisplayMonthlyRecurControls(recurType) { /* <<<( */

	switch (recurType) {
		
		case 'day':
			document.getElementById('module-event-submit-container-recur-day').style.display = 'none';
			break;

		case 'first':
		case 'second':
		case 'third':
		case 'fourth':
		case 'fifth':
		case 'sixth':
		default:
			document.getElementById('module-event-submit-container-recur-day').style.display = 'block';
			break;
	}

	return;
} /* )>>> */

function ModuleEventSubmitClearForm() { /* <<<( */

	if (null != document.getElementById('module-event-submit-input-title')) {
		document.getElementById('module-event-submit-input-title').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-location')) {
		document.getElementById('module-event-submit-input-location').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-image')) {
		document.getElementById('module-event-submit-input-image').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-start-date')) {
		document.getElementById('module-event-submit-input-start-date').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-start-time')) {
		document.getElementById('module-event-submit-input-start-time').selectedIndex = 32;
	}

	if (null != document.getElementById('module-event-submit-input-end-time')) {
		document.getElementById('module-event-submit-input-end-time').selectedIndex = 72;
	}

	if (null != document.getElementById('module-event-submit-input-recurring')) {
		document.getElementById('module-event-submit-input-recurring').checked = false;
		ModuleEventSubmitToggleRecurringControls(false);
	}

	if (null != document.getElementById('module-event-submit-input-recur-type')) {
		document.getElementById('module-event-submit-input-recur-type').selectedIndex = 0;
	}

	if (null != document.getElementById('module-event-submit-input-recur-monthly')) {
		document.getElementById('module-event-submit-input-recur-monthly').selectedIndex = 0;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-sunday')) {
		document.getElementById('module-event-submit-input-recur-day-sunday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-monday')) {
		document.getElementById('module-event-submit-input-recur-day-monday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-tuesday')) {
		document.getElementById('module-event-submit-input-recur-day-tuesday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-wednesday')) {
		document.getElementById('module-event-submit-input-recur-day-wednesday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-thursday')) {
		document.getElementById('module-event-submit-input-recur-day-thursday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-friday')) {
		document.getElementById('module-event-submit-input-recur-day-friday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-recur-day-saturday')) {
		document.getElementById('module-event-submit-input-recur-day-saturday').checked = false;
	}

	if (null != document.getElementById('module-event-submit-input-description')) {
		document.getElementById('module-event-submit-input-description').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-link')) {
		document.getElementById('module-event-submit-input-link').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-contact-name')) {
		document.getElementById('module-event-submit-input-contact-name').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-contact-phone')) {
		document.getElementById('module-event-submit-input-contact-phone').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-contact-email')) {
		document.getElementById('module-event-submit-input-contact-email').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-recur-start-date')) {
		document.getElementById('module-event-submit-input-recur-start-date').value = '';
	}

	if (null != document.getElementById('module-event-submit-input-recur-end-date')) {
		document.getElementById('module-event-submit-input-recur-end-date').value = '';
	}

	return;
} /* )>>> */

function ModuleEventSubmitValidateRecurFields() { /* <<<( */
	
	var errorMessage = '';
	var recurType = '';

	// get recur type
	recurType = document.getElementById('module-event-submit-input-recur-type').value;

	switch (recurType) {

		case 'weekly':
			// check that at least one check box is selected
			if ((false == document.getElementById('module-event-submit-input-recur-day-sunday').checked) &&
				(false == document.getElementById('module-event-submit-input-recur-day-monday').checked) &&
				(false == document.getElementById('module-event-submit-input-recur-day-tuesday').checked) &&
				(false == document.getElementById('module-event-submit-input-recur-day-wednesday').checked) &&
				(false == document.getElementById('module-event-submit-input-recur-day-thursday').checked) &&
				(false == document.getElementById('module-event-submit-input-recur-day-friday').checked) &&
				(false == document.getElementById('module-event-submit-input-recur-day-saturday').checked))
			{
				errorMessage = "No day of week selected for 'Weekly' repeating event.\n";
			}
			break;

		case 'monthly':
				// check that selection is inbounds
				if ((0 > document.getElementById('module-event-submit-input-recur-monthly').selectedIndex) ||
					(document.getElementById('module-event-submit-input-recur-monthly').options.length < document.getElementById('module-event-submit-input-recur-monthly').selectedIndex))
				{
					errorMessage = "No type of repeating selected for 'Monthly' repeating event.\n";
				}
				else if (0 < document.getElementById('module-event-submit-input-recur-monthly').selectedIndex) {
					// check that at least one check box is selected for month type other than 'Exact Day' (when selectedIndex == 0)
					if ((false == document.getElementById('module-event-submit-input-recur-day-sunday').checked) &&
						(false == document.getElementById('module-event-submit-input-recur-day-monday').checked) &&
						(false == document.getElementById('module-event-submit-input-recur-day-tuesday').checked) &&
						(false == document.getElementById('module-event-submit-input-recur-day-wednesday').checked) &&
						(false == document.getElementById('module-event-submit-input-recur-day-thursday').checked) &&
						(false == document.getElementById('module-event-submit-input-recur-day-friday').checked) &&
						(false == document.getElementById('module-event-submit-input-recur-day-saturday').checked))
					{
						errorMessage = "No day of week selected for 'Monthly' repeating event.\n";
					}
				}
			break;

		case 'yearly':
			break;

		default:
			errorMessage = "'Event Repeats' type not selected for repeating event.\n";
			break;
	}

	return errorMessage;
} /* )>>> */


