var alert_params = undefined;

/* 
--------------------------------------------------------------------------
VALIDATE
--------------------------------------------------------------------------*/
//Modify default settings for validation
$.validator.setDefaults({
	
	//Customise placement of error messages
	errorPlacement: function(error, element) {
		error.insertAfter(element.parent('div.textwrapper'));
	},
	
	//Add error class to parent of invalid field
	highlight: function(element, errorClass, validClass) {
		$(element).parent('div.textwrapper').addClass(errorClass);
	},
	
	//Remove error class from parent of invalid field
	unhighlight: function(element, errorClass, validClass) {
		$(element).parent('div.textwrapper').removeClass(errorClass);
	},
	
	//Set error messages for specific fields
	messages: {
		confirmation_password: 'Please enter the same password as above',
		confirm_password: 'Please enter the same password as above'
	}
	
});

//Add extra validation methods
jQuery.validator.addMethod("alphanumeric", function(value, element) {
	return this.optional(element) || /^[a-z0-9 ._-]+$/i.test(value);
}, "This field accepts alphanumeric characters only");

jQuery.validator.addMethod("password", function(value, element) {
	return this.optional(element) || /^[a-z0-9._-]+$/i.test(value);
}, "Only characters including a-z . _ - accepted");

/* 
--------------------------------------------------------------------------
MEMBER FUNCTIONS
--------------------------------------------------------------------------*/
var member = {
	
	createErrorMsg: function(msg) {
		//check that an error message hasn't already been created
		if (!$('#colorbox #error-message').length) {
			$error = $('<p id="error-message" class="msg-error">' + msg + '</p>');
		}
		return $error;
	},
	
	toggleLoader: function()  {
		
		$loaded = $('#cboxLoadedContent');
		$loadingOverlay = $('#cboxLoadingOverlay');
		
		if ($loaded.css('visibility') == 'hidden') {
			$loaded.css('visibility', 'visible');
			$loadingOverlay.css('display', 'none');
		} else {
			$loaded.css('visibility', 'hidden');
			$loadingOverlay.css('display', 'block');
		}
		
	},
	
	/* CAPTCHA
	----------------------------------------------------------------------*/
	showRecaptcha: function(captchaKey, element) {
		Recaptcha.destroy();
		Recaptcha.create(captchaKey, element, {
			theme: 'custom'
		});
    },
	
	reloadCaptcha: function() {
		$.ajax
		({
			type: 'post',
			url: '/captcha/reload/',
			dataType: 'json',
			success: function(data)
			{
				$('#captcha_input').attr('value', ''); 
				$('#captcha_image').attr('src', '/captcha-image/captcha.png?key=' + data.key + '.png'); 
                $('#captcha_key').attr('value', data.key); 
			}
		});
	},
	
	/* LOGIN
	----------------------------------------------------------------------*/
	validateLogin: function($form) {
		$form.validate({
			rules: {
				email: {
					email: true,
					required: true
				},
				password: {
					required: true
				}
			},
			submitHandler: function() {
				member.logIn($form);
			}
		});
	},
	
	logIn: function($form) {
		
		var form_data = $form.serialize();

		$.ajax({
			type: 'post',
			url: '/member/ajax/log-in/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data) {
				
				if (data.status == 'error') 
				{
					if (data.result == 'suspended')
					{
						var msg = 'This account has been suspended for breaking site terms and conditions. ';
						msg += 'For more information, email <a href="mailto:' + data.contact_email + '">';
						msg += data.contact_email + '</a>';

						member.createErrorMsg(msg);
					}	
					else
					{
						member.createErrorMsg('Your username or password is invalid, please try again');
					}
					$('#lightbox-header').after($error);
					member.toggleLoader();
					$.colorbox.resize();
				} 
				else if (data.status == 'okay') 
				{
					if (data.result == 'facebook')
					{
						member.createErrorMsg('Your account has been linked with Facebook, please use Facebook to login.');
						$('#lightbox-header').after($error);
						member.toggleLoader();
						$.colorbox.resize();					
					}
					else 
					{					
						if (typeof(alert_params) == 'object')
						{
							cnet.displayLightbox('/member/lightbox/create-alert/', alert_params);
						}
						else
						{
							window.location.reload();
						}
					}
				};
				
			}
		});
		
	},
	
	checkLoggedIn: function() {
		
		var logged_in = false;

		$.ajax
		({
			type: 'post',
			url: '/member/ajax/check-logged-in/',
			data: '',
			dataType: 'json',
			async: false,
			success: function(data)
			{
				logged_in = data.logged_in;
			}
		});
		return logged_in;
	},
	
	/* REGISTRATION
	----------------------------------------------------------------------*/
	validateRegistration: function($form) {
		$form.validate({
			rules: {
				email: {
					email: true,
					remote: {
						data: {
							'email': function() {
								return $('#email').val();
							}
						},
						url: '/member/ajax/check-email/'
					},
					required: true
				},
				username: {
					alphanumeric: true,
					rangelength: [3,16],
					required: true
				},
				password: {
					minlength: 4,
					password: true,
					required: {depends:function(){$(this).val($.trim($(this).val()));return true;}}
				},
				confirmation_password: {
					equalTo: '#password',
					required: true
				},
				country: {
					required: true
				},
				captcha_input: {
					required: true
				}
			},
			submitHandler: function() {
				member.register($form);
			}
		});
	},
	
	register: function($form)  {
		
		var form_data = $form.serialize();

		$.ajax
		({
			type: 'post',
			url: '/member/ajax/registration/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data)
			{
				
				if (data.status == 'error') 
				{
					member.reloadCaptcha();
					if (data.result == 'incorrect_captcha')
					{
						var $captcha_error = $('<label class="error" for="captcha_input">The letters you typed did not match the image</label>');
						$('#step-captcha .textwrapper').after($captcha_error);
						$('#captcha_input').bind('focus', function() {
							$captcha_error.remove();
						});
					}
					member.createErrorMsg('Sorry there was an error with your submission, please try again');
					$('#lightbox-header').after($error);
					member.toggleLoader();
					$.colorbox.resize();
				} 
				else if (data.status == 'okay') 
				{				
					$.colorbox({
						href: '/member/lightbox/register-thank-you/'
					});
				};
				
			}
		});	
		
	},
	
	/* FACEBOOK MERGE
	----------------------------------------------------------------------*/
	validateFacebookMerge: function($form) {
		$form.validate({
			submitHandler: function() {
				member.facebookMerge($form);			
			}
		});
	},
	
	facebookMerge: function($form) {
		
		var form_data = $form.serialize();
		
		$.ajax({
			type: 'post',
			url: '/member/ajax/facebook-merge/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data) {
				
				if (data.status == 'error') 
				{
					member.createErrorMsg('There was a problem merging your account with Facebook.');
					$('#lightbox-header').after($error);
					member.toggleLoader();
					$.colorbox.resize();
				} 
				else if (data.status == 'okay') 
				{
					if (data.merged == 'yes')
					{
						window.location.reload(true);
					}
					else
					{
						$.colorbox.close();
					}
				};
				
			}
		});
		
	},

	checkMerge: function(force_check) {

		var force = false;
		
		if (force_check == true)
		{
			force = true;
		}

		$.ajax({
			type: 'post',
			url: '/member/ajax/check-merge/',
			dataType: 'json',
			data: 'force=' + force,
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data) {
				
				if (data.status == 'error') 
				{
					member.createErrorMsg('There was a problem merging your account with Facebook.');
					$('#lightbox-header').after($error);
					member.toggleLoader();
					$.colorbox.resize();
				} 
				else if (data.status == 'okay') 
				{
					if (data.action == 'merge')
					{
						$.colorbox({
							href: '/member/lightbox/facebook-merge/'
						});
					}
				};
				
			}
		});
		
	},

	showConflictingAccount: function() {
		$.colorbox({
			href: '/member/lightbox/conflicting-account/'
		});		
	},

	validateConflictingAccount: function($form) {
		$form.validate({
			submitHandler: function() {
				member.conflictingAccount($form);			
			}
		});
	},
	
	conflictingAccount: function($form) {
	
		var form_data = $form.serialize();
		var form_serial = $form.serializeArray();
		action = form_serial[0].value;
		
		$.ajax({
		type: 'post',
		url: '/member/ajax/conflicting-account-flag/',
		data: form_data,
		dataType: 'json',
		beforeSend: function() {
			member.toggleLoader();
		},
		success: function(data) 
		{
			if (data.status == 'error') 
			{
				member.createErrorMsg('There was a problem checking if you have a site account.');
				$('#lightbox-header').after($error);
				member.toggleLoader();
				$.colorbox.resize();
			} 
			else if (data.status == 'okay') 
			{				
				if (action == 'log-out')
				{
					$.colorbox({
						href: '/member/lightbox/log-out/'
					});
				}
				else if (action == 'edit-profile')
				{
					window.location.href = base_url + 'members/edit-profile/';
				}
			};
		}
		});	
	},
	
	checkSiteAccount: function() {

		$.ajax({
			type: 'post',
			url: '/member/ajax/check-site-account/',
			dataType: 'json',
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data) 
			{
				if (data.status == 'error') 
				{
					member.createErrorMsg('There was a problem checking if you have a site account.');
					$('#lightbox-header').after($error);
					member.toggleLoader();
					$.colorbox.resize();
				} 
				else if (data.status == 'okay') 
				{
					if (data.result == 'account_found' && data.email)
					{
						$.colorbox({
							href: '/member/lightbox/existing-account/?email=' + data.email
						});
					}
					/*
					else if (data.result == 'no_email_permission')
					{
						$.colorbox({
							href: '/member/lightbox/request-email-permission/'
						});					
					}
					else if (data.result == 'no_account_found')
					{
						$.colorbox({
							href: '/member/lightbox/no-account-found/?email=' + data.email
						});					
					}
					*/
				};
			}
		});
		
	},

	
	validateExistingAccount: function($form) {
		$form.validate({
			submitHandler: function() {
				member.existingAccountFlag($form);			
			}
		});
	},
	
	existingAccountFlag: function($form) {

		var form_data = $form.serialize();
		var form_serial = $form.serializeArray();
		action = form_serial[0].value;
		
		$.ajax({
		type: 'post',
		url: '/member/ajax/existing-account-flag/',
		data: form_data,
		dataType: 'json',
		beforeSend: function() {
			member.toggleLoader();
		},
		success: function(data) 
		{
			if (data.status == 'error') 
			{
				member.createErrorMsg('There was a problem checking if you have a site account.');
				$('#lightbox-header').after($error);
				member.toggleLoader();
				$.colorbox.resize();
			} 
			else if (data.status == 'okay') 
			{				
				if (action == 'log-in')
				{
					$.colorbox({
						href: '/member/lightbox/log-in/'
					});
				}
				else
				{
					$.colorbox.close();
				}
			};
		}
		});
	},

	validateNoSiteAccount: function($form) {
		$form.validate({
			submitHandler: function() {
				member.noSiteAccount($form);			
			}
		});
	},

	noSiteAccount: function($form) {

		var form_data = $form.serialize();
		var form_serial = $form.serializeArray();
		action = form_serial[0].value;
		alert(form_data);
		/*
		$.ajax({
		type: 'post',
		url: '/member/ajax/existing-account-flag/',
		data: form_data,
		dataType: 'json',
		beforeSend: function() {
			member.toggleLoader();
		},
		success: function(data) 
		{
			if (data.status == 'error') 
			{
				member.createErrorMsg('There was a problem checking if you have a site account.');
				$('#lightbox-header').after($error);
				member.toggleLoader();
				$.colorbox.resize();
			} 
			else if (data.status == 'okay') 
			{				
				if (action == 'log-in')
				{
					$.colorbox({
						href: '/member/lightbox/log-in/'
					});
				}
				else
				{
					$.colorbox.close();
				}
			};
		}
		});
		*/
	},
	
	/* ALERTS
	----------------------------------------------------------------------*/
	validateAlert: function($form) {
		$form.validate({
			rules: {
				alertname: {
					required: true
				}
			},
			submitHandler: function() {
				member.createAlert($form);
			}
		});
	},
	
	createAlert: function($form) {

		var form_data = $form.serialize();

		$.ajax({
			type: 'post',
			url: '/member/ajax/create-alert/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data) {
				
				if (data.message == 'Success') 
				{
					var params = {
						'title' : data.params.title,
						'body' : data.params.body
					};
					cnet.displayLightbox('/member/lightbox/generic-ok/',  params);
					alert_params = undefined;
				}
				
			}
		});
		
	},

	/* PROFILE
	----------------------------------------------------------------------*/
	validateProfile: function($form) {
		$form.validate({
			invalidHandler: function() {
				$('html, body').animate({'scrollTop': $($form).offset().top});
			},
			rules: {
				email: {
					email: true,
					required: true
				},
				country: {
					required: true
				}
			},
			submitHandler: function() {
				member.editProfile($form);
			}
		});
	},
	
	editProfile: function($form) {
		$form.attr('id').submit();
	},
	
	avatarSlider: function() {
		
		var $slider = $('#avatar-slider');
		var $slides = $slider.find('ul');
		var $controls = $slider.find('a.slider-btn');
		
		$controls.click(function(e) {
			e.preventDefault();
			if (this.id == 'next') {
				$slides.filter(':visible').next('ul').length > 0 ? $slides.filter(':visible').hide().next('ul').show() : $slides.hide().first().show();
			} else {
				$slides.filter(':visible').prev('ul').length > 0 ? $slides.filter(':visible').hide().prev('ul').show() : $slides.hide().last().show();
			}
		});
	
	},
	
	/* COMMENTS
	----------------------------------------------------------------------*/
	validateAnonymousComment: function($form) {
		$form.validate({
			rules: {
				email: {
					email: true,
					required: true
				},	
				comment: {
					required: true
				}
			},
			submitHandler: function() {
				location.href = '#comment-submit';
				member.anonymousComment($form);
			}
		});
	},

	anonymousComment: function($form) {
		
		var form_data = $form.serialize();
		var $loader;
		
		$.ajax
		({
			type: 'post',
			url: '/ajax/comment/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				$form.hide();
				location.href = '#comment-submit';
				$loader = $('<p class="center"><img src="/images/base/loading2.gif" alt="Loading" height="19" width="220" /></p>').insertBefore($form);
			},
			success: function(data)
			{
				
				$loader.remove();
				$form.show();
				
				if (data.status == 'error') 
				{
					$('#comment-form-message').text(data.message).attr('class', 'msg-error').css('display', 'block');
					member.showRecaptcha($('#captcha_key').val(), 'recaptcha_widget');
				} 
				else if (data.status == 'okay') 
				{
					Omniture.trackComment();
					
					$('#comment-form-message').text(data.message).attr('class', 'msg-success').css('display', 'block');
					member.showRecaptcha($('#captcha_key').val(), 'recaptcha_widget');
					member.displayComment($('#content_id').val());
					$('#comment').val('');
					$('#email').val('');
				}
				
			}
		});
		
	},
	
	validateComment: function($form) {
		$form.validate({
			rules: {
				email: {
					email: true,
					required: true
				},	
				comment: {
					required: true
				}
			},
			submitHandler: function() {
				location.href = '#comment-submit';
				member.comment($form);
			}
		});
	},
	
	comment: function($form)  {
		
		var form_data = $form.serialize();
		var $loader;
		
		$.ajax
		({
			type: 'post',
			url: '/ajax/comment/',
			data: form_data,
			dataType: 'json',
			beforeSend: function()
			{
				$form.hide();
				location.href = '#comment-submit';
				$loader = $('<p class="center"><img src="/images/base/loading2.gif" alt="Loading" height="19" width="220" /></p>').insertBefore($form);
			},
			success: function(data)
			{
				
				$loader.remove();
				$form.show();
				
				if (data.status == 'error') 
				{
					$('#comment-form-message').text(data.message).attr('class', 'msg-error').css('display', 'block');
				} 
				else if (data.status == 'okay') 
				{
					Omniture.trackComment();
					
					$('#comment-form-message').text(data.message).attr('class', 'msg-success').css('display', 'block');
					
					// Open alerts lightbox if this is checked
					if ($('#email_alert').is(':checked'))
					{
						cnet.createAlert($.parseJSON($('#email_alert').val()));
					}
					
					$('#comment').val('');
					$('#email_alert').attr('checked', false);
					
					member.displayComment($('#content_id').val());
					
				};
				
			}
		});	
		
	},

	displayComment: function($story_id)
	{
		$.ajax
		({
			type: 'post',
			url: '/ajax/load-comments/',
			data: { 'story_id' : $story_id },
			dataType: 'html',
			success: function(data)
			{
				$('#comments').replaceWith(data);
			},
			complete: function() {
				var $target = $('#talkback-list div.talkback:last');
				$('body, html').animate(
					{
						scrollTop: $target.offset().top - 80
					}, 
					{
						duration: 200
					}
				);
			}
		});
	},
	
	/* MEMBER REVIEWS
	----------------------------------------------------------------------*/
	validateReview: function($form) {
		$form.validate({
			rules: {
				email: {
					email: true,
					required: true
				},	
				comment: {
					required: true
				}
			},
			submitHandler: function() {
				member.review($form);
			}
		});
	},

	review: function($form) {
		
		var form_data = $form.serialize();
		var $loader;
		
		$.ajax
		({
			type: 'post',
			url: '/ajax/review/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				$form.hide();
				$loader = $('<p class="center"><img src="/images/base/loading2.gif" alt="Loading" height="19" width="220" /></p>').insertBefore($form);
			},
			success: function(data)
			{
				
				$loader.remove();
				$form.show();
				
				if (data.status == 'error')
				{
					$('#comment-form-message').text(data.message).attr('class', 'msg-error').css('display', 'block');
				}
				else if (data.status == 'okay')
				{
				
					Omniture.trackReview();

					$('#comment-form-message').text(data.message).attr('class', 'msg-success').css('display', 'block');
					
					// If sentiment lightbox is open
					if ($('#colorbox').css('display') == 'block') 
					{
						$.colorbox.close();
					}
				
					$('body, html').animate(
						{
							scrollTop: $('#comments').offset().top
						}, 
						{
							duration: 600,
							complete:  function()
							{
								// Open alerts lightbox if this is checked
								if ($('#email_alert').is(':checked'))
								{
									cnet.createAlert($.parseJSON($('#email_alert').val()));
								}
								$('.current-rating').css('width', 0);
								$('#rating').val('');
								$('#pros').val('');
								$('#cons').val('');
								$('#comment').val('');
								$('#email_alert').attr('checked', false);
							}
						}
					);
					
					member.displayReview($('#content_id').val());
					
				}
				
			}
		});
		
	},	
	
	displayReview: function(story_id) {
		$.ajax
		({
			type: 'post',
			url: '/ajax/load-reviews/',
			data: 'story_id=' + story_id + '&url=' + document.URL,
			dataType: 'html',
			beforeSend: function() {
				$('#talkback-list').html('<p class="center"><img src="/images/base/loading2.gif" alt="Loading" height="19" width="220" /></p>');
			},
			success: function(data)
			{
				$('#comments').replaceWith(data);
			}
		});
	},
	
	/* PASSWORD
	----------------------------------------------------------------------*/
	validateChangePassword: function($form) {
		$form.validate({
			rules: {
				current_password: {
					required: true
				},
				new_password: {
					minlength: 4,
					password: true,
					required: true
				},
				confirmation_password: {
					equalTo: '#new_password',
					required: true
				}
			},
			submitHandler: function() {
				form.submit();
			}
		});
	},
	
	validateResetPassword: function($form) {
		$form.validate({
			rules: {
				new_password: {
					minlength: 4,
					password: true,
					required: true
				},
				confirm_password: {
					equalTo: '#new_password',
					required: true
				}
			},
			submitHandler: function() {
				form.submit();
			}
		});
	},
	
	validateForgotPassword: function($form) {
		$form.validate({
			rules: {
				email: {
					email: true,
					required: true
				}
			},
			submitHandler: function() {
				member.requestPassword($form);
			}
		});
	},
	
	requestPassword: function($form)
	{
		var form_data = $form.serialize();

		$.ajax
		({
			type: 'post',
			url: '/member/ajax/forgot-password/',
			data: form_data,
			dataType: 'json',
			beforeSend: function() {
				member.toggleLoader();
			},
			success: function(data)
			{				
				member.toggleLoader();
				if (data.status == 'error') 
				{
					if (data.result == 'no_member')
					{
						member.createErrorMsg('The email entered does not exist. Please try again');
					}
					else if (data.result == 'facebook_member')
					{
						member.createErrorMsg('Your CNET UK account is linked to your Facebook account, so please use your Facebook details to log in.');
					}
					else
					{
						member.createErrorMsg('There has been a problem resetting your password. Please contact customer services.');
					}
					
					$('#lightbox-header').after($error);
					$.colorbox.resize();
				} 
				else if (data.status == 'okay') 
				{
					var email = $('#email').val();
					$.colorbox({
						href: '/member/lightbox/forgot-password-instructions/?email=' + email
					});
				};
				
			}
		});
		
	},

	/* COMPETITIONS
	----------------------------------------------------------------------*/
	validateSubmitCompetition: function($form) {
		$form.validate({
			rules: {
				answer: {
					required: true
				}
			},
			submitHandler: function() {
				member.submitCompetition($form);
			}
		});
	},

	submitCompetition: function($form) {
		
		var form_data = $form.serialize();

		$.ajax
		({
			type: 'post',
			url: '/members/competitions/submit/',
			data: form_data,
			dataType: 'json',
			async: false,
			success: function(response)
			{
				
				if (response.error == 1)
				{
					$('#competition-form-message').css('display', 'block').attr('class', 'msg-error').text(response.message);
				}
				else
				{
					$('#competition-form-message').css('display', 'block').attr('class', 'msg-success').text(response.message);
					$('#competition-form').css('display', 'none');
				}
				
			}
		});
		
		return false;
		
	}
	
}

