// GLOBAL FUNCTIONS
function popupFormErrors(errorArray) {
	var msg = '';
	for (var i = 0; i < errorArray.length; i++) {
		if ($(errorArray[i].element).val()) {
			msg += errorArray[i].message + '\n';
		}	else {
			var fieldName = $(errorArray[i].element).attr('validator:display');
			if (!fieldName) {
				fieldName = errorArray[i].element.name;
			}
			msg += $.validator.format(msgIsRequired, fieldName) + '\n';
		}
	}
	if (msg.length > 0) alert(msg);
}

function addValidatorToForm(formId, submitButtonId) {
	$(submitButtonId).attr('form-id', formId);
	$(submitButtonId).bind('click', function(e){
		e.preventDefault();
		var formId = ($(this)).attr('form-id');
		$(formId).attr('submitClicked', 'true');
		$(formId).submit();
	});
	
	$(formId).attr('submitClicked', '');	
	$(formId).validate({
			highlight: function(element) {
				$(element).addClass('invalid-input');
			},						
			unhighlight: function(element) {
				$(element).removeClass('invalid-input');
			},
			errorPlacement: function(error, element) { },
			showErrors: function(errorObj, errorArray) {
				this.defaultShowErrors();
				if($(this.currentForm).attr('submitClicked')) {
					$(this.currentForm).attr('submitClicked', '');
					popupFormErrors(errorArray);
				}
			}
	});
}

// VALIDATION METHODS THAT CAN BE ACCESSED OUTSIDE VALIDATOR
function isValidPrice(value) {
 return /^\d+(\.\d\d)?$/.test(value);
}

function isValidMMDDYYYY(value) {
	var result = /^\d{1,2}\/\d{1,2}\/\d{4}$/.test(value);
	if (result) {
		var parts = value.split('/');
		var mm = parseInt(parts[0],10);
		var dd = parseInt(parts[1],10);
		var yyyy = parseInt(parts[2],10);		
		var testDate = new Date(yyyy, mm-1, dd);
		result = (testDate.getFullYear() == yyyy)
					&& (testDate.getMonth() == mm-1)
					&& (testDate.getDate() == dd);
	}
	return result;
}
// CUSTOM VALIDATION METHODS

function validPostalCode(value) {
	return /^[A-Za-z]\d[A-Za-z]\d[A-Za-z]\d$/.test(value);
}

function validZipCode(value) {
	return /^\d{5}(-\d{4})?$/.test(value);
}

function validSubdomain(value, element) {
	return this.optional(element) || /^\w[\w.-]*$/.test(value);
}

function validPassword(value, element) {
	return this.optional(element) || /^[^\s]{4,16}$/.test(value);	
}

function validCreditCardSecurity(value, element) {
	return this.optional(element) || /^\d{3}$/.test(value);	
}

function validPositiveInteger(value, element) {
	return this.optional(element) || /^\d+$/.test(value);
}

function validPrice(value, element) {
	return this.optional(element) || isValidPrice(value);	
}
	
function validMMDDYYYY(value, element) {
	return this.optional(element) || isValidMMDDYY(value);
}

function validDollarValue(value, element) {
 return this.optional(element) || /^-?\d+(\.\d\d)?$/.test(value);
}

// CUSTOM VALIDATION MESSAGES
var msgValidPostalCode = 'Please enter a valid postal code.';
var msgValidZipCode = 'Please enter a valid zip code.';
var msgValidSubdomain = 'Web address must start with a letter or number and can only contain letters, numbers, periods, and hypens.';
var msgValidPassword = 'Password must be between 4-16 characters and cannot have spaces.';
var msgCreditCardSecurity = 'Please enter a valid card security code.';
var msgValidPositiveInteger = 'Please enter a positive integer value.';
var msgValidPrice = 'Please enter a valid price.';
var msgValidMMDDYYYY = 'Please enter a valid date (mm/dd/yyyy)';
var msgValidDollarValue = 'Please enter a valid dollar value.';

// OTHER VALIDATION MESSAGES
var msgIsRequired =  '{0} is a required field.';
var msgPasswordEqual = 'Please enter the same password.';
var msgEmailEqual = 'Please enter the same email address.';
var msgMinPrice = 'Price cannot be less than the minimum.';

var msgValidCity = 'Please choose a valid city.';
var msgCityNotFound = 'City not found in selected province/state.';


// BIND CUSTOM METHODS
$.validator.addMethod('postal-code', validPostalCode, msgValidPostalCode);
$.validator.addMethod('zip-code', validZipCode, msgValidZipCode);
$.validator.addMethod('subdomain', validSubdomain, msgValidSubdomain); 
$.validator.addMethod('password', validPassword, msgValidPassword); 
$.validator.addMethod('ccard-csc', validCreditCardSecurity, msgCreditCardSecurity); 
$.validator.addMethod('positive-integer', validPositiveInteger, msgValidPositiveInteger);
$.validator.addMethod('price', validPrice, msgValidPrice);
$.validator.addMethod('mmddyy', validMMDDYYYY, msgValidMMDDYYYY);
$.validator.addMethod('dollar-value', validDollarValue, msgValidDollarValue);