/**
 * VALIDATE CONTACT FORM 
 * (copy this function for every sendform you want to validate
 * @param  object  contactForm  form to validate
 * @return  bool  whether the form is valid
 */
function validateGroupForm(form){

	// An array of objects describing the required fields
	// name is the input field name
	// title is a human-readable description of that field
	var requiredFields = [
		{name: 'group_name', title: 'Group name'},
		{name: 'cruise_line', title: 'Cruise line'},
		{name: 'sailing_date', title: 'Sail date'},
		{name: 'cabin_occupancy', title: 'Cabin occupancy'},
		{name: 'cabin_category_first_choice', title: 'Cabin category choice'},
		{name: 'title', title: 'Title'},
		{name: 'first_name', title: 'First name'},
		{name: 'last_name', title: 'Last name'},
		{name: 'address1', title: 'Address'},
		{name: 'city', title: 'City'},
		{name: 'state', title: 'State'},
		{name: 'country', title: 'Country'},
		{name: 'zip', title: 'Zip'},
		{name: 'phone', title: 'Phone number'},
		{name: 'user_email', title: 'Email address'},
		{name: 'date_of_birth', title: 'Date of birth'},
		{name: 'emergency_contact_name', title: 'Emergency contact name'},
		{name: 'emergency_contact_number', title: 'Emergency contact number'},
		{name: 'deposit_amt', title: 'Deposit amount'},
		{name: 'cc_type', title: 'Credit card type'},
		{name: 'cc_name', title: 'Credit card name'},
		{name: 'cc_number', title: 'Credit card number'},
		{name: 'cc_month', title: 'Credit card expiration month'},
		{name: 'cc_year', title: 'Credit card expiration year'},
		{name: 'insurance', title: 'Insurance preference'}																			
		//{name: 'heard_about[]', title: 'How did you hear about us'}, 
		//{name: 'terms', title: 'I agree to the terms'}
	];
	
	
	// An array of objects describing the fields which must be valid email addresses
	var emailFields = [
		{name: 'user_email', title: 'Email'}
	];
	
	return validateForm(form, requiredFields, emailFields);
}


/**
 * VALIDATE SUGGESTION FORM 
 * @param  object  contactForm  form to validate
 * @return  bool  whether the form is valid
 */
function validateSuggestionForm(form){

	// An array of objects describing the required fields
	// name is the input field name
	// title is a human-readable description of that field
	var requiredFields = [
		{name: 'first_name', title: 'First name'}, 
		{name: 'last_name', title: 'Last name'},
		{name: 'email', title: 'Email'}, 
		{name: 'comments', title: 'Feature or enhancement suggestion'}
	];
	
	
	// An array of objects describing the fields which must be valid email addresses
	var emailFields = [
		{name: 'email', title: 'Email'}
	];
	
	return validateForm(form, requiredFields, emailFields);
}




/**
 * VALIDATE SHARE WITH A FRIEND FORM 
 * @param  object  contactForm  form to validate
 * @return  bool  whether the form is valid
 */
function validateShareForm(form){

	// An array of objects describing the required fields
	// name is the input field name
	// title is a human-readable description of that field
	var requiredFields = [
		{name: 'your_name', title: 'Your Name'},
		{name: 'your_email', title: 'Your Email'},
		{name: 'friend_name', title: "Friend's Name"}, 
		{name: 'friend_email', title: "Friend's Email"},
		{name: 'comments', title: 'Comments'}
	];
	
	
	// An array of objects describing the fields which must be valid email addresses
	var emailFields = [
		{name: 'your_email', title: 'Your Email'},
		{name: 'friend_email', title: "Friend's Email"},
	];
	
	return validateForm(form, requiredFields, emailFields);
}


/**
 * Validate Sendform and display errors if not valid
 * @param  object  form  the form to validate
 * @param  array  requiredFields  Array of objects describing fields that must not be empty strings 
 * @param  array  emailFields  Array of objects describing fields that must contain valid email addresses (i.e. {name : field name , title: field description}
 * @return  bool  whether the form is valid
 */
function validateForm(form, requiredFields, emailFields) {
	
	var errors = [];

	var $form = $(form);

	//Remove error fields and labels
	$form.find('.errorLabel').removeClass('errorLabel');
	$form.find('.radioErrorField').removeClass('radioErrorField');
	$form.find('.checkboxErrorField').removeClass('checkboxErrorField');	
	$form.find('.errorField').removeClass('errorField');

	// VALIDATION OF REQUIRED FIELDS
	$(requiredFields).each(function(){
							  
		var $field = $form.find("[name='"+this.name+"']");
		var val = $.trim($field.val());
		var fieldType = getInputType($field);

		// REQUIRE THAT TEXT FIELD, TEXTAREA, OR SELECT VALUE IS NOT BLANK
		if ( 
			(fieldType == 'text' && val == '')
			|| (fieldType == 'select' && val == '')
		) {
			errors.push({
				name: this.name,  
				msg: '<em>' + this.title + '</em> is required.', 
				type: fieldType
			});
		}
		
		// REQUIRE THAT RADIO BE CHECKED OR THAT AT LEAST ONE CHECKBOX BE CHECKED
		if (
		    	(fieldType == 'checkbox' && !$field.is(':checked'))
			|| (fieldType == 'radio' && !$field.is(':checked'))
		){
			errors.push({
				name: this.name,  
				msg: '<em>' + this.title + '</em> must be checked.',
				type: fieldType
			});
		}

	});
	
	// VALIDATION OF EMAIL FIELDS	
	if(typeof emailFields != 'undefined' && emailFields.length) { 
		$(emailFields).each(function(){
			
			var $field = $form.find('[name="'+this.name+'"]');
			var val = $.trim($field.val());
			var fieldType = getInputType($field);
		
			if ( val != '' && !isEmailAddress(val)) {
				errors.push({
					name: this.name,  
					msg: '<em>' + this.title + '</em> must be a valid email address.', 
					type: fieldType					
				});
			}
		});
	}

	
	if (errors.length) {
		
		// Validation Failed.  Display errors.

		var error_str = 'Please fix the following:';

		// Compile String of Errors
		if (errors.length > 1) {
			
			// Multiple Errors
			
			error_str += '<ul>';
			$(errors).each(function(){
				error_str += '<li>' + this.msg + '</li>';
								
				// Highlght the label and field that is in error
				addErrorToFieldAndLabel(this, $form);
			});
			error_str += '</ul>';
		} 
		else {			
		
			// Only One error
			
			error_str += '<p>' + errors[0].msg + '</p>';
			
			// Highlght the label and field that is in error
			addErrorToFieldAndLabel(errors[0], $form);
		}
		
		// If a msg div doesn't exist inside this form, create one
		$msg_div = $form.find('.error_msg');
		if ($msg_div.length) {
			$msg_div.hide();
		} else {
			$msg_div = $('<div class="error_msg"/>').hide().prependTo($form);
		}
		$msg_div.html(error_str).fadeIn();
				
		// Scroll to top of error msg div
		var errorPos = $msg_div.offset();
		window.scroll(errorPos.left, errorPos.top);
		
		return false;

	} else {
		
		//Validation Passed
		
		// ANTI-SPAM		
		// Find anti-spam field
		$requiredField = $form.find('[name="required"]');		
		if(!$requiredField.length){
			// if it doesn't exist, create it
			$requiredField = $('<input type="hidden" name="required"/>').appendTo($form);
		}		
		// Set the required form field to 1 (for combatting spam)
		$requiredField.val(1);

		// Hide any submit buttons and insert a "Loading..." msg
		$submitBtn = $form.find('.submit, input[type="submit"], input[type="image"]').hide();		
		$loadingMsg = $('<div class="loadingMsg">Submitting...</div>').insertAfter($submitBtn);
		
		return true;
	}	
}

/**
 * Get a field type for validation
 * @param  object  $field  The field
 * @return  string  field type
 */
function getInputType($field){
	
	var fieldType = '';
	if ($field.is('textarea')) {
		fieldType = 'text';
	}
	else if ($field.is('select')) {
		fieldType = 'select';
	}
	else if ($field.attr('type') == 'password') {
		fieldType = 'text';
	}
	else {
		fieldType = $field.attr('type');
	}

	return fieldType;

}

/**
 * Add an error class to the field and label.
 * @param  object  obj  Object containing the field name and type
 * @return  void
 */
function addErrorToFieldAndLabel(obj, $form){

	var fieldError = 'errorField';
	if(obj.type=='checkbox' && obj.type=='radio') {
		fieldError = obj.type + 'ErrorField';
	}

	$form.find('[name="'+ obj.name +'"]').addClass(fieldError);
	$form.find('label[for="'+ obj.name +'"]').addClass('errorLabel');
}

/**
 * Validate email address
 * @param  string  email address
 * @return  whether the email address is valid
 */
function isEmailAddress (string) {
	var addressPattern = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
	return addressPattern.test(string);
}


/**
 * Validate number
 * @param  string  number
 * @return  bool  whether the string is a number
 */
function isNumeric (string) {
	var objRegExp  = /^[0-9\.]*$/;
	return objRegExp.test(string);
}

/**
 * Validate ZIP
 * @param  string  ZIP
 * @return  bool whether the string is a valid US ZIP
 */
function validateUSZip(strValue) {
	var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
	return objRegExp.test(strValue);	
}

/**
 * Validate Phone
 * @param  string  phone
 * @return  bool whether the string is a valid phone num
 */
function validatePhone (string) {
	var objRegExp  = /^\d{3}\-?\d{3}\-?\d{4}$/;
	return(objRegExp.test(string));
}

