var Forms = {

	errorList: null,

	init: function() {
		Forms.setupNewsletterValidation();
		Forms.setupProductRequestValidation();
		Forms.setupErrorChecking();
	},

	// NEWSLETTER SIGNUP
	
	setupNewsletterValidation: function() {
		var submitBtn = $('sideBar').getElement('[id*=ucNewsletter_lbnSignup]');
		if (!$chk(submitBtn)) return;

		submitBtn.addEvent('click', function(e) {
			var prefix = submitBtn.get('id').match(/.+?\_/);
			
			var nameField = $(prefix + 'ucNewsletter_txtYourName');
			var emailField = $(prefix + 'ucNewsletter_txtEmail');

			if (!Forms.newsletterFormValid(nameField, emailField)) {
				e.stop();

				Forms.refreshErrorNotifications('newsletterValidationErrors');
				Forms.validateRequired(nameField, 'Please enter your name.');
				Forms.validateRequired(emailField, 'Please enter your email.');
				Forms.validateEmailAddress(emailField, 'Please enter a valid email address.');

				Forms.errorList.inject(this.getParent('fieldset'), 'top');
				return false;
			}
			return true;
		});
	},
	
	newsletterFormValid: function(nameField, emailField) {
		if (nameField.value == '') return false;
		if (emailField.value == '') return false;
		if (Forms.isEmailValid(emailField.value) == false) return false;
		return true;
	},

	// PRODUCT REQUEST
	
	setupProductRequestValidation: function() {
		var submitBtn = $('sideBar').getElement('[id*=RequestAProduct_lbnSignup]');
		if (!$chk(submitBtn)) return;

		submitBtn.addEvent('click', function(e) {
			var prefix = submitBtn.get('id').match(/.+?\_/);
			
			var nameField = $(prefix + 'RequestAProduct_txtYourName');
			var productField = $(prefix + 'RequestAProduct_txtProdName');
			var emailField = $(prefix + 'RequestAProduct_txtYourEmail');

			if (!Forms.productNotificationFormValid(nameField, emailField, productField)) {
				e.stop();

				Forms.refreshErrorNotifications('newsletterValidationErrors');
				Forms.validateRequired(nameField, 'Please enter your name.');
				Forms.validateRequired(emailField, 'Please enter your email.');
				Forms.validateEmailAddress(emailField, 'Please enter a valid email address.');
				Forms.validateRequired(productField, 'Please enter product details.');

				Forms.errorList.inject(this.getParent('fieldset'), 'top');
				return false;
			}
			
			return true;
		});
	},

	productNotificationFormValid: function(nameField, emailField, productField) {
		if (nameField.value == '') return false;
		if (emailField.value == '') return false;
		if (Forms.isEmailValid(emailField.value) == false) return false;
		if (productField == '') return false;
		return true;
	},


	refreshErrorNotifications: function(name) {
		if (Forms.errorList) Forms.errorList.destroy();
		Forms.errorList = Element('ol', { 'class': 'error' });
	},

	validateRequired: function(element, message) {
		if (element.value == '') {
			Forms.failedValidation(element, message);
		}
	},

	validateEmailAddress: function(element, message) {
		if (!Forms.isEmailValid(element.value)) {
			Forms.failedValidation(element, message);
		}
	},

	failedValidation: function(element, message) {
		new Element('li', {'html': message, 'class': 'error'}).inject(Forms.errorList);
	},

	isEmailValid: function(value) {
		if (value.match(/^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i)) {
			return true;
		} else {
			return false;
		}
	},

	// PAGE FORM ERROR CHECKING
	
	setupErrorChecking: function() {
		$$('span.statusFlag').each(function(el) {
			var inputElement = el.getParent().getElement('input, select, textarea');

			if (inputElement) {
				var fieldName = inputElement.get('id').split(/_/).pop();

				switch (fieldName) {
					case 'txtTitle':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your title' }));
					break;

					case 'txtYourName':
					case 'NameFrom':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your name' }));
					break;

					case 'txtFriendName':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your name' }));
					break;
					
					case 'txtFirstName':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your first name' }));
					break;
					
					case 'txtLastName':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your last name' }));
					break;

					case 'txtEmail':
					case 'txtYourEmail':
					case 'txtFriendEmail':
					case 'Email':
						inputElement.store('validator', new RequiredFieldEmailValidator(inputElement, { 'errorMessage': 'Please enter a valid email address' }));
					break;

					case 'Subject':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter the subject' }));
					break;

					case 'Message':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your message' }));
					break;

					case 'txtPassword':
						inputElement.store('validator', new RequiredFieldPasswordValidator(inputElement, { 'allowEmpty': true, 'minLength': 6, 'errorMessage': 'Please enter a password of at least 6 characters' }));
					break;

					case 'txtPasswordConfirm':
						inputElement.store('validator', new RequiredFieldMatchValidator(inputElement, { 'allowEmpty': true, 'matchAgainst': '_ctl0_MainContent_Account1_txtPassword', 'errorMessage': 'Please check your passwords match' }));
					break;

					case 'ddlMM':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please select your birth month' }));
					break;
					
					case 'txtBillHouse':
					case 'txtShipHouse':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your house number of name' }));
					break;
					
					case 'txtShipAddr1':
					case 'txtBillAddr1':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter the first line of your address' }));
					break;
					
					case 'txtShipTown':
					case 'txtBillTown':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter the town of your address' }));
					break;
					
					case 'txtShipPostcode':
					case 'txtBillPostcode':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter the postcode of your address' }));
					break;
					
					case 'txtShipCountry':
					case 'txtBillCountry':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter the country of your address' }));
					break;
					
					case 'ddlShippingRegion':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please select your shipping region' }));
					break;
					
					case 'txtShipTelephone':
					case 'txtBillTelephone':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your telephone number' }));
					break;
					
					case 'txtNameOnSite':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your name to be displayed on the site' }));
					break;
					
					case 'txtReview':
						inputElement.store('validator', new RequiredFieldValidator(inputElement, { 'errorMessage': 'Please enter your review' }));
					break;
				}
			}
		});
	},
	
	validate: function() {
		/* Forces validation by setting and unsetting focus to each element on the page.*/
		$$('span.statusFlag').each(function(el) {
		    var inputElement = el.getParent().getElement('input, select, textarea');
		    inputElement.focus();
		});
		
		return ($$('.stateError').length == 0 && $$('.error').length == 0);
	}
}

window.addEvent('domready', Forms.init);