var fanrates = {
	
	// ---------------
	// Variables
	// ---------------
	
	// Accepted values for "action" argument found in various functions
	// e.g. fanrates.do_login(), fanrates.do_logout(), etc.
	accepted_actions : ['all', 'login', 'logout'],
	
	// ---------------
	// Functions
	// ---------------
	
	regex_patterns : {
		phone_number : /\b(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?\b/,
		
		zip_code : /^[0-9]{5}$/,
		
		action_redirects : {
			all : / /,
			login : /(^\/join)/,
			logout : /(^\/myprofile)/
		}
	},
	
	match_regex : {
		phone_number : function(input) {
			return fanrates.regex_patterns.phone_number.test(input);
		},
		
		zip_code : function(input) {
			return fanrates.regex_patterns.zip_code.test(input);
		},
		
		redirected_url : function(action) {
			var relative_url = window.location.pathname;
			if (!action) {
				action = 'all';
			}
			action = action.toString();
			
			if (~jQuery.inArray(action, fanrates.accepted_actions)) {
				return fanrates.regex_patterns.action_redirects[action].test(relative_url);
			}
		}
	},

	get_query_var : function(variable) { 
		var query = window.location.search.substring(1); 
		var vars = query.split("&"); 
		for (var i=0;i<vars.length;i++) { 
			var pair = vars[i].split("="); 
			if (pair[0] == variable) { 
				return pair[1]; 
			} 
		}
		return false;
	},

	url_decode : function(url) {
		return unescape(url.replace(/\+/g, " "));
	},
	
	redirect_to_url : function(redirect) {
		var new_url = window.location.protocol + '//' + window.location.hostname;
		if (redirect) {
			new_url += redirect;
		}
		window.location = new_url;
	},
	
	validate_registration_form : function(form) {
		errors = {};
	
		if (form.phone_number != '' && !fanrates.match_regex.phone_number(form.phone_number)) {
			errors.phone_number = 'You must enter a valid phone number';
		} else {
			var dt = new Date(),
				expiryTime = dt.setTime(dt.getTime() + 1000*5);
	
			document.cookie = 'phone_number=' + form.phone_number + ';expires=' + dt.toGMTString();
		}
		return errors;
	},
	
	check_for_and_do_redirect : function(action) {
		if (!action) {
			action = 'all';
		}
		action = action.toString();
		
		if (fanrates.match_regex.redirected_url(action)) {
			var redirect = fanrates.get_query_var('redirect');
			if (!redirect) {
				redirect = '/';
			}
			fanrates.redirect_to_url(unescape(redirect));
			return false;
		}
	},
	
	do_login : function(form_object) {
		fanrates.check_for_and_do_redirect('login');
		
		if (FB && FB.getLoginStatus) {
			var login_box = $('#login_box');
		
			if (login_box.length) {
				login_box.addClass('loading');
			}
			
			FB.getLoginStatus(function(response) {
				var login_url = '/do_login.php';
				var login_info = {};
		
				if (!response.session) {
					// User is not logged in through Facebook, check login form
					if (form_object && form_object.serialize()) {
						// Try to get form data from form object
						login_info = form_object.serialize();
					} else {
						// Either no form object was passed or no form data
						// could be extracted from it, get info manually
						var username_input = $('#cusername');
						var password_input = $('#cpassword');
						
						if (!username_input && !password_input) {
							// Show error here
							return false;
						}
						
						var username = username_input.val();
						var password = password_input.val();
						
						if (!username && !password) {
							// Show error here
							return false;
						}
						
						login_info[username_input.attr('name')] = username;
						login_info[password_input.attr('name')] = password;
					}
				}
				
				setTimeout(function() {
					$.post(login_url, login_info, function(data) {
						if ($.trim(data) == 'error') {
							// An error occurred, process it here
							
							// TO DO: Convert plain text error messages
							// to JSON strings with type (success, warning,
							// error, etc.) and text properties
						} else {
							fanrates.update_user_info('login');
						}
					});
				}, 500);
			});
		}
	},
	
	do_logout : function() {
		FB.logout();
		var logout_url = '/logout.php';
		setTimeout(function() {
			$.ajax({
				url: logout_url,
				success: function(data) {
					fanrates.update_user_info('logout');
				}
			});
		}, 50);
	},
	
	update_user_info : function(action) {
		if (action == 'logout') {
			fanrates.check_for_and_do_redirect(action);
			
			window.location.reload();
			return false;
		}
		
		var header_url = '/connaretech/project_02/includes/header.php';
		var header_container = $('#login_box');
		
		if (header_container.length) {
			$.ajax({
				url: header_url,
				success: function(data) {
					if ($.trim(data) == 'error') {
						// Error, process it here
					} else {
						header_container.html(data);
						header_container.removeClass('loading');
					}
				}
			});
		}
	}
};

(function($) {	
	$.validator.addMethod("phone", function(input, element) {
		return this.optional(element) || fanrates.match_regex.phone_number(input);
	}, "Please enter a valid phone number");
	
	$.validator.addMethod("zipcode", function(input, element) {
		return this.optional(element) || fanrates.match_regex.zip_code(input);
	}, "Please enter a valid ZIP code");
	
	$(function() {
		// Validate forgot password form
		var forgot_password_form = $('#forgot-password-form');
		if (forgot_password_form.length) {
			forgot_password_form.bind('submit', function(event) {
				event.preventDefault();

				var self = $(this),
					email_text = self.find('input[name="email"]').val(),
					message = self.find('#forgot-password-message'),
					form_url = self.attr('action');

				message.addClass('loading');

				$.post(form_url, { email: email_text },
					function(data) {
						message.text(data).removeClass('loading');
					}
				);
			});
		}
		
		// Validate update profile form
		var update_profile_form = $('#update-profile-form');
		if (update_profile_form.length) {
			update_profile_form.fanrates_ajax_form_submit();
		}
		
		// Validate change password form
		var update_password_form = $('#update-password-form');
		if (update_password_form.length) {
			update_password_form.fanrates_ajax_form_submit({
				rules : {
					newconfirmpassword : {
						equalTo: "#newpassword"
					}
				},
				errorPlacement: function(error, element) {
					error.appendTo(element.parent("td").next("td"));
				}
			});
		}
		
		// Update user info or redirect whenever a login occurs
		FB.Event.subscribe('auth.login', function(response) {
			fanrates.do_login();
		});
		
		var global_login_form = $('#global_login_form');
		global_login_form.live('submit', function(event) {
			event.preventDefault();
			var self = $(this);
			fanrates.do_login(self);
		});
		
		// Process logout requests
		logout_link = $('#logout-link');
		logout_link.live('click', function(event) {
			event.preventDefault();
			var self = $(this);
			fanrates.do_logout();
		});
	});
	
	
	// ---------------------
	// Custom jQuery Plugins
	// ---------------------
	$.fn.fanrates_show_message_box = function(options) {
		
		var message_object = {
			type	: 'alert',
			text	: 'This is a test alert',
			delay	: 3500
		};
		
		if (options) {
			$.extend(message_object, options);
		}
		
		return this.each(function() {
			var self = $(this);
			var html = '<div class="status-message ' + message_object.type + '">'
					 + message_object.text + '</div>';
			
			self.html(html).slideDown().delay(message_object.delay).slideUp(function() {
				var self = $(this);
				self.html('');
			});
		});
	};
	
	$.fn.fanrates_ajax_form_submit = function(custom_validation_rules) {
		
		var validation_rules = {};
		
		if (custom_validation_rules) {
			$.extend(validation_rules, custom_validation_rules);
		}
		
		return this.each(function() {
			var self = $(this);
			
			self.validate(validation_rules);
			
			self.bind('submit', function(event) {
				event.preventDefault();
				
				var self = $(this),
					form_url = self.attr('action'),
					form_data = self.serialize(),
					message_container = $('#' + self.attr('id') + '-message');
				
				if (self.valid()) {
					$.post(form_url, form_data, function(data) {
						if (message_container.length) {
							var message_object = $.parseJSON(data);
							if (message_object.type && message_object.text) {
								message_container.fanrates_show_message_box(message_object);
							}
						}
					});
				}
			});
		});
	};
})(jQuery);
