(function() {
	// if(window.registrationScript !== undefined) {
	// 	return;
	// }
	// window.registrationScript = true;

	var randomString = function() {
		var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz';
		var string_length = Math.max(Math.floor(Math.random() * 17), 8)
		var randomstring = '';
		for(var i = 0; i < string_length; i++) {
			var rnum = Math.floor(Math.random() * chars.length);
			randomstring += chars.substring(rnum, rnum + 1);
		}
		return randomstring;
	},
		validEmail = /^([a-z0-9,!#\$\%\&\'\*\+\/=\?\^_`\{\|}~-]+(?:\.[a-z0-9,!#\$\%\&\'\*\+\/=\?\^_`\{\|}~-]+)*@)(?:((?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)*)((?:[a-z0-9][a-z0-9-]*[a-z0-9])\.)([a-z]{2}[a-z0-9]*)$)/i,
		validPhone = /\D*[2-9]\D*\D*\d\D*\D*\d\D*\D*\d\D*\D*\d\D*\D*\d\D*\D*\d\D*\D*\d\D*\D*\d\D*\D*\d\D*/;

	var updateUsername = function(e) {
		setTimeout(function() {
			$('#registration-username').val($('#registration-email').val());
		}, 100);
	};
	var updateScreenName = function(e) {
		setTimeout(function() {
			$('#registration-screen_name').val(
				$.trim($('#registration-first-name').val() + ' ' + $('#registration-last-name').val()) +
					' - ' + $.trim($('#registration-email').val())
			);
		}, 100);
	};
	$('#registration-email').bind('keyup change input', updateUsername);
	$('#registration-first-name, #registration-last-name').bind('keyup change input', updateScreenName);
	$('#registration-newsletter-yes').change(function() {
		if($(this).is(':checked')) {
			$('#registration-newsletter-no').removeAttr('checked');
		} else {
			$('#registration-newsletter-no').attr('checked', true);
		}
	});

	// IE label bug
	// $('#facebox label:has(:checkbox)').each(function(i, label) {
	// 	label = $(label);
	// 	var checkboxes = label.find(':checkbox');
	// 	if(checkboxes.length > 1) {
	// 		label.before(checkboxes[1]);
	// 	}
	// });

	$('#login-forgot-password').unbind();
	$('#login-forgot-password').bind('click', function(e) {
		e.preventDefault();

		$('#facebox .article').before('<p class="wait">Loading...</p>').hide();

		var link = $(this),
			href = link.attr('href');

		$.get(href, function(data) {
			$('#facebox .wait').remove();
			data = $(data);
			var form = data.find('form'),
				tableHeading = form.find('.tableHeading'),
				h3 = form.find('h3'),
				input = form.find(':text:first'),
				submitP = form.find('p:has(:submit)').addClass('submit-field'),
				submit = submitP.find(':submit'),
				linkP = form.find('p:has(a)'),
				link = linkP.find('a');

			submit.before(link).before(' &nbsp; &nbsp; ');

			input.wrap('<label />').before($('<span class="label-text" />').text(h3.text())).css({ width: '' });

			h3.remove();

			form.find('table').width($('#facebox .article').width());

			form.find('a').attr('href', '#').text('« Go back').bind('click', function(e) {
				e.preventDefault();
				form.prev('h1').remove();
				form.remove();
				$('#facebox .content').show();
				$('#facebox .article').show();
			});
			$('#facebox .content').after(form).hide();
			form.before($('<h1 />').text(tableHeading.text()));
			tableHeading.remove();

			form.bind('submit', function(e) {
				e.preventDefault();
				var results = $('<div />');
				form.after(results);
				$.post(form.attr('action'), form.serialize(), function(data) {
					data = $(data);
					data.find('h1, a').remove();
					results.html(data);
					form.prev('h1').remove();
					form.remove();
					$('#facebox .content').show();
					$('#facebox .article').show();
				});
			});
		}, 'html');
	});

	var registerLogin = function(data, textStatus) {

		// Firefox...
		var html = data.match(/<body.*?>((.|\n)*)<\/body>/i);
		if(html) {
			data = $.trim(html[1]);
		}

		// If redirect fails
		if(data.match(/<div id="cb">/)) {
			$.get('/go-forward-guide', registerLogin);
			return;
		}

		$('#facebox .wait').remove();

		data = $(data);

		data.find('title, meta, style').remove();

		var links = data.find('a'),
			backLinks = [];
		links.each(function(i, link) {
			if(link.href.match(/^javascript\:history\.go\(-1\);?$/i)) {
				backLinks[backLinks.length] = link;
			}
		});
		if(backLinks.length) {
			var error = $('<div id="registration-error" />').html(data);
			data = error;

			var errors = error.find('li');
			$.each(errors, function(i, error) {
				error = $(error);
				if(
					$.trim(error.text()).match('username') ||
					$.trim(error.text()).match('screen name')
				) {
					error.remove();
				}
			});
			errors = error.find('li');
			if(errors.length == 0) {
				error.find('ul').append('<li>An unknown error occurred. Please try again.</li>');
			}

			error.find('p:empty').remove();

			$.each(backLinks, function(i, backLink) {
				$(backLink).remove();
			});
			var errorHeading = data.find('h1');
			if(errorHeading.length) {
				var newErrorHeading = $('<strong />').html(errorHeading.html());
				errorHeading.after(newErrorHeading);
				errorHeading.remove();
			}
			$('#facebox #registration-error').remove();
			$('#facebox .article').show().find('h1:first').after(data);
			$('#facebox form, #facebox :input').removeAttr('disabled').removeClass('disabled');
		} else {
			$('#facebox #registration-error').remove();
			$('#facebox .content, #facebox .content *').unbind();
			$('#facebox .article').html(data).show();
		}
	};

	$('#facebox #go-forward-guide-login-form').bind('submit', function(e) {
		e.preventDefault();
		var form = $(this);

		var formAction = form.attr('action'),
			formData = form.find(':input').serializeArray(),
			massagedData = {};

		for(var i in formData) {
			massagedData[(formData[i].name)] = formData[i].value;
		}
		formData = massagedData;

		$('#facebox .article').hide().before('<p class="wait">Please wait while we prepare your download...</p>');
		$('#facebox .error').hide();
		$('#facebox form, #facebox :input').attr('disabled', true).addClass('disabled');

		$.post(formAction, formData, registerLogin);
	});

	var errorLabelsSelector = '#facebox p.field .label-text, #facebox p.field .label-text a';

	$('#facebox #register_member_form').bind('submit', function(e) {
		e.preventDefault();

		updateUsername();
		updateScreenName();

		$('#registration-password, #registration-password_confirm, #session-password').val(randomString());

		setTimeout(function() {

			var fields = $(errorLabelsSelector).css({
				color: ''
			});

			$('#facebox p.field:first').prev('p.error').remove();

			$('#facebox p.field:first').before('<p class="error">Please ensure that the \
				field<span class="plural">s</span> marked in red \
				<span class="singular">is</span><span class="plural">are</span> filled correctly.</p>');
			var requiredErrors = $('#facebox p.field:has(span.highlight) :text:not([value])'),
				requiredCheckboxes = $('#facebox p.field:has(span.highlight):has(:checkbox)');

			requiredCheckboxes.each(function(i, checkbox) {
				checkbox = $(checkbox);
				if(checkbox.find(':checked').length) {
					return;
				}
				checkbox = $(checkbox.find(':checkbox')[0]);
				requiredErrors[requiredErrors.length] = checkbox[0];
				requiredErrors.length++;
			});

			if($('#registration-email').val().match(/./) && !$('#registration-email').val().match(validEmail)) {
				requiredErrors[requiredErrors.length] = $('#registration-email')[0];
				requiredErrors.length++;
			}
			if($('#registration-phone-number').val().match(/./) && !$('#registration-phone-number').val().match(validPhone)) {
				requiredErrors[requiredErrors.length] = $('#registration-phone-number')[0];
				requiredErrors.length++;
			}
			requiredErrors.parents('p.field').find('.label-text, .label-text a').css({
				color: 'red'
			});

			if(requiredErrors.length == 0) {
				var formAction = $('#facebox #register_member_form').attr('action'),
					formData = $('#facebox #register_member_form :input').serializeArray(),
					massagedData = {};

				for(var i in formData) {
					massagedData[(formData[i].name)] = formData[i].value;
				}
				formData = massagedData;

				// Correct phone field for Mailchimp
				formData.m_field_id_4 = formData.m_field_id_4.replace(/\D/g, '').replace(/^(\d\d\d)(\d\d\d)/, '$1-$2-');

				$('#facebox .article').hide().before('<p class="wait">Please wait while we prepare your download...</p>');
				$('#facebox .error').hide();
				$('#facebox form, #facebox :input').attr('disabled', true).addClass('disabled');

				$.post(formAction, formData, registerLogin);
			} else {
				if(requiredErrors.length == 1) {
					$('#facebox .error .plural').hide();
					$('#facebox .error .singular').show();
				} else {
					$('#facebox .error .plural').show();
					$('#facebox .error .singular').hide();
				}
				$('#facebox .error').show();
			}
		}, 110);
	});

	// View TOS in facebox
	$('#facebox #terms-and-conditions, #facebox #privacy-policy').bind('mousedown click', function(e) {
		e.preventDefault();
		e.stopPropagation();

		if(e.type == 'click') {
			var link = $(this),
				location = link.attr('href'),
				originalContent = $($('#facebox .content')[0]);

			$.get(location + '?ajax=true', function(data) {
				var terms = $('<div class="content" id="terms-and-conditions-text">' + data + '</div>')
					.width(originalContent.width()),
					h1 = terms.find('h1'),
					backLink = '<div class="facebox-subpage-backlink"><a href="#" id="tos-go-back">« Go back</a></div>';

				if(h1.length) {
					h1.prepend(backLink);
				} else {
					terms.find(':first-child').before(backLink);
				}

				originalContent.after(terms).hide();

				$('#tos-go-back').click(function(e) {
					$('#tos-go-back').unbind();
					e.preventDefault();
					originalContent.show();
					terms.remove();
				});
			});
		}
	});

	$(document).bind('close.facebox', function() {
		$('#facebox .content, #facebox .content *').unbind();
		$('#facebox td.body > *').not('.footer, .content').remove();
		var content = $('#facebox .content');
		for(var i = 1; i < content.length; i++) {
			$(content[i]).remove();
		}
		// $('#facebox td.body > h1, #facebox td.body > #forgot_password_form').remove();
	});
})();