var isValid = true;
var isZipValid = true;

function validateForm(form) {
	isValid = true;
	if (form.id == 'registrationForm') {
		trimTextFields(form);
		validateRegistrationForm(form);
		return isValid;
	}
	if (form.id == 'purchaseSubscriptionForm') {
		trimTextFields(form);
		validatePurchaseSubscriptionForm(form);
		return isValid;
	}
	if (form.id == 'nameLocationForm') {
		validateNameLocationForm(form);
		return isValid;
	}
	if (form.id == 'changePasswordForm') {
		validateChangePasswordForm(form);
		return isValid;
	}
	if (form.id == 'changeEmailAddressForm') {
		validateChangeEmailAddressForm(form);
		return isValid;
	}
	if (form.id == 'lostPasswordForm') {
		if(validateNotEmpty(form.username)) {
			validateRegEx(form.username, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, 'invalid format');
		}
		return isValid;
	}	
	if (form.id == 'notificationForm') {
		return true;
	}
	if (form.id == 'inviteRequestForm') {
		validateInviteRequestForm(form);
		return isValid;	
	}
	if (form.id == 'publicChangePasswordForm') {
		validatePublicChangePasswordForm(form);
		return isValid;		
	}
	if (form.id == 'loginForm') {
		validateLoginForm(form);
		return isValid;		
	}
	if (form.id == 'contactUsForm') {
		validateContactUsForm(form);
		return isValid;		
	}
	if (form.id == 'connectorForm') {
		validateConnectorForm(form);
		return isValid;		
	}	
	if (form.id == 'jobPostForm') {
		trimTextFields(form);
		validateJobPostForm(form);
		return isValid;		
	}
	if (form.id == 'jobApplyForm') {
		trimTextFields(form);
		validateJobApplyForm(form);
		return isValid;		
	}
	if (form.id == 'jobContactForm') {
		trimTextFields(form);
		validateJobContactForm(form);
		return isValid;		
	}
	if (form.id == 'jobBrandForm') {
		trimTextFields(form);
		validateJobBrandForm(form);
		return isValid;		
	}
	else {
		alert('validateForm: Internal Error; Unknown form (' + form.id + ') specified.')
	}
}

function validateRegistrationForm(form) {
	validateNotEmpty(form.firstName);
	validateNotEmpty(form.lastName);
	if ((typeof surpressEmailVerification == "undefined") || (surpressEmailVerification == false)) {
		if (validateNotEmpty(form.emailAddress)) {
			validateRegEx(form.emailAddress, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, 'invalid format');
		}
	}
	if (validateNotEmpty(form.password)) {
		validateRegEx(form.password, /^.{6,20}$/, 'password must be between 6 and 20 characters long');
	}
	validateNotEmpty(form.companyName);
	if (validateNotEmpty(form.phone)) {
		validateRegEx(form.phone, /^[2-9]\d{2}-?\d{3}-?\d{4}$/, 'invalid format,<br />ex. 123-456-7890');
	}
}

function validatePurchaseSubscriptionForm(form) {
	validateNotEmpty(form.firstName);
	validateNotEmpty(form.lastName);
	validateNotEmpty(form.address1);
	validateNotEmpty(form.city);
	validateNotEmpty(form.state);
	validateZipCode(form);
	validateNotEmpty(form.country);
	validateCreditCard(form);
}

function validateNameLocationForm(form) {
	validateNotEmpty(form.firstName);
	validateNotEmpty(form.lastName);
	if (form.company && form.company.type != 'hidden') {
		validateNotEmpty(form.company);
	}
	if (form.phone && form.phone.type != 'hidden') {
		if (validateNotEmpty(form.phone)) {
			validateRegEx(form.phone, /^[2-9]\d{2}-?\d{3}-?\d{4}$/, 'invalid format');
		}
	}
}

function validateChangePasswordForm(form) {
	validateNotEmpty(form.currentPassword);
	if (validateNotEmpty(form.newPassword)) {
		if (validateRegEx(form.newPassword, /^.{6,20}$/, 'password must be between 6 and 20 characters long')) {
			if (validateNotEmpty(form.confirmNewPassword)) {
				validateMatch(form.newPassword, form.confirmNewPassword, 'must match password');
			}
		}
	}
}

function validatePublicChangePasswordForm(form) {
	if (validateNotEmpty(form.password)) {
		if (validateRegEx(form.password, /^.{6,20}$/, 'password must be between 6 and 20 characters long')) {
			if (validateNotEmpty(form.confirmPassword)) {
				validateMatch(form.password, form.confirmPassword, 'must match password');
			}
		}
	}
}

function validateChangeEmailAddressForm(form) {
	if (validateNotEmpty(form.emailAddress)) {
		if (validateRegEx(form.emailAddress, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, 'invalid format')) {
			if (validateNotEmpty(form.confirmEmailAddress)) {
				validateMatch(form.emailAddress, form.confirmEmailAddress, 'must match your new email address');
			}
		}
	}
}

function validateInviteRequestForm(form) {
	if (valNotEmpty(form.emailAddress)) {
		if (valRegEx(form.emailAddress, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/)) {
			isValid = true;
			return;
		}
	}
	alert('Please supply a valid email address.');
	isValid = false;
}	

function validateLoginForm(form) {
	validateNotEmpty(form.username);
	validateNotEmpty(form.userPassword);
}

function validateContactUsForm(form) {
	validateNotEmpty(form.category);
	if (validateNotEmpty(form.email)) {
		validateRegEx(form.email, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, 'invalid format');
	}
	validateNotEmpty(form.subject);
	validateNotEmpty(form.message);
}

function validateConnectorForm(form) {
	validateNotEmpty(form.question5);
	return true;
}

function validateJobPostForm(form) {
	validateNotEmpty(form.title);
	if(validateNotEmpty(form.applyMethodText)) {
		if (getCheckedValue(form.applyMethod) == 'email') {
			validateRegEx(form.applyMethodText, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, 'invalid format');
		} else {
			validateRegEx(form.applyMethodText, /^https?:\/\/(.+)\.(.+)/, 'invalid format');
		}
	}
	validateNotEmpty(form.company);
	validateNotEmpty(form.type);
	validateNotEmpty(form.category);
	validateZipCode(form);
	validateNotEmpty(form.description);
}

function validateJobApplyForm(form) {
	validateNotEmpty(form.firstName);
	validateNotEmpty(form.lastName);
	if (validateNotEmpty(form.emailAddress)) {
		validateRegEx(form.emailAddress, /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, 'invalid format');
	}
	
	if (getCheckedValue(form.resumeRadio) == 'Upload') {
		validateNotEmpty(form.resumeFileInput);
	}
	else if (getCheckedValue(form.resumeRadio) == 'Entry') {
		validateNotEmpty(form.resume);
	}
}

function validateJobContactForm(form) {
	if (form.twitterUrl.value.length > 0) {
		validateRegEx(form.twitterUrl, /^http:\/\/(www\.)?twitter\.com\/(.+)/, 'invalid format');
	}
	if (form.linkedInUrl.value.length > 0) {
		validateRegEx(form.linkedInUrl, /^http:\/\/((www|ca)\.)?linkedin\.com\/(.+)/, 'invalid format');
	}
}

function validateJobBrandForm(form) {
	if (form.facebookPageUrl.value.length > 0) {
		validateRegEx(form.facebookPageUrl, /^http:\/\/((apps|www)\.)?facebook\.com\/(.+)/, 'invalid format');
	}
}


// Helper functions

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, "");
}

function trimTextFields(form) {
	for (var i=0; i < form.elements.length; i++) {
	    var element = form.elements[i];
	    if (element.type == 'text' && element.value.length != 0) {
			element.value = element.value.trim();
	   }
	}
}

function getCheckedValue(radioObject) {
	if(!radioObject) {
		return "";
	}
	var radioLength = radioObject.length;
	if(radioLength == undefined) {
		if(radioObject.checked) {
			return radioObject.value;
		}
		else {
			return "";
		}
	}
	for(var i = 0; i < radioLength; i++) {
		if(radioObject[i].checked) {
			return radioObject[i].value;
		}
	}
	return "";
}


function validateZipCode(form) {
	if (validateNotEmpty(form.zipCode)) {
		validateRegEx(form.zipCode, /^((\d{5})|([a-z]\d[a-z]\s\d[a-z]\d))$/i, 'invalid format');
	}
}

function isNumber(value) {
	value = value.toString();

	if (value.length == 0) {
		return false;
	}

	for (var n = 0; n < value.length; n++) {
		if (value.substring(n, n+1) < "0" || value.substring(n, n+1) > "9") {
			return false;
		}
	}
	return true;
}

function luhnCheck(cardNumber) {
	var numberOfDigits = cardNumber.length;
	var oddOrEven = numberOfDigits & 1;
	var sum = 0;

	if (!isNumber(cardNumber)) {
		return false;
	}
	
	for (var count = 0; count < numberOfDigits; count++) {
		var digit = parseInt(cardNumber.charAt(count));
		if (!((count & 1) ^ oddOrEven)) {
			digit *= 2;
			if (digit > 9) {
				digit -= 9;
			}
		}
		sum += digit;
	}
	return ((sum % 10) == 0);
}

function validateCreditCard(form) {
	var isValid = false;
	
	//card number
	var isValidNumber = false;
	if (validateNotEmpty(form.ccType) && validateNotEmpty(form.ccNumber)) {
		var cardType = form.ccType.value;
		var cardNumber = form.ccNumber.value;
		
		if (cardType == 'visa') {
			if ((13 == cardNumber.length) || (16 == cardNumber.length)) {
				var oneDigitPrefix = cardNumber.substr(0,1);
				if (oneDigitPrefix == 4) {
					isValidNumber = true;
				}
			}
		} else if (cardType == 'mastercard') {
			if (16 == cardNumber.length) {
				var twoDigitPrefix = cardNumber.substr(0,2);
				if ((51 <= twoDigitPrefix) && (twoDigitPrefix <= 55)) {
					isValidNumber = true;
				}
			}
		} else if (cardType == 'amex') {
			if (15 == cardNumber.length) {
				var twoDigitPrefix = cardNumber.substr(0,2);
				if ((34 == twoDigitPrefix) || (37 == twoDigitPrefix)) {
					isValidNumber = true;
				}
			}
		} else if (cardType == 'discover') {
			if (16 == cardNumber.length) {
				var twoDigitPrefix = cardNumber.substr(0,2);
				var threeDigitPrefix = cardNumber.substr(0,3);
				var fourDigitPrefix = cardNumber.substr(0,4);
				var sixDigitPrefix = cardNumber.substr(0,6);
				
				if (65 == twoDigitPrefix) {
					isValidNumber = true;
				} else if ((644 <= threeDigitPrefix) && (threeDigitPrefix <= 649)) {
					isValidNumber = true;
				} else if (6011 == fourDigitPrefix) {
					isValidNumber = true;
				} else if ((622126 <= sixDigitPrefix) && (sixDigitPrefix <= 622925)) {
					isValidNumber = true;
				}
			}
		} else if (cardType == 'diners') {
			if (16 == cardNumber.length) {
				var twoDigitPrefix = cardNumber.substr(0,2);
				if ((54 == twoDigitPrefix) || (55 == twoDigitPrefix)) {
					isValidNumber = true;
				}
			}
		} 
		
		isValidNumber = ((isValidNumber) ? luhnCheck(cardNumber) : false);
		setError(isValidNumber, form.ccNumber, 'invalid');
	}
	
	//expiration date
	if (validateNotEmpty(form.ccExpMonth) && validateNotEmpty(form.ccExpYear)) {
		var date = new Date();
		var month = date.getMonth() + 1;
		var year = date.getYear();
		if(year < 1000) {
			year += 1900;
		}		
		
		var isValidDate = (form.ccExpYear.value > year) ||
			((form.ccExpYear.value == year) && (form.ccExpMonth.value >= month));
		setError(isValidDate, form.ccExpYear, 'cannot be a date in the past');
	}
	
	//cvv2
	if (validateNotEmpty(form.ccId)) {
		if (setError(isNumber(form.ccId.value), form.ccId, 'must be a number')) {
			validateRegEx(form.ccId, /^.{3,4}$/, 'must be 3 or 4 digits long');
		}
	}
}

function validateNotEmpty(cntrl) {
	return (cntrl) ? setError(cntrl.value.length != 0, cntrl, 'required') : true;
}

function validateMatch(cntrl1, cntrl2, msg) {
	return (cntrl1 && cntrl2) ? setError(cntrl1.value == cntrl2.value, cntrl2, msg) : true;
}

function validateRegEx(cntrl, expr, msg) {
	return (cntrl) ? setError(expr.test(cntrl.value), cntrl, msg) : true;
}

function setError(check, cntrl, msg) {
	isValid = isValid && check;
	var messageEl = document.getElementById(cntrl.id + '_msg');

	if(check) {
		messageEl.innerHTML = '';
		if(messageEl.className == 'formInfo show') {
			messageEl.className = 'formInfo hidden';
		}
	} else {
		messageEl.innerHTML = msg;
		if(messageEl.className == 'formInfo hidden') {
			messageEl.className = 'formInfo show';
		}
	}

	return check;
}

function setMsg(cntrlName, msg) {
	document.getElementById(cntrlName).innerHTML = msg;
}

function valNotEmpty(cntrl) {
	return (cntrl.value.length != 0);
}

function valRegEx(cntrl, expr) {
	return (expr.test(cntrl.value));
}

function valZipCode(zip) {
	var params = new Object();
	params.value = zip;	
	http('POST', 'model/remote/formService.cfc?method=isZipValid',
		function(buf) {
			eval(buf);
		},
		params);
}
