/*****************************************************************************************************/
/*  Global Variables                                                                                 */
/*****************************************************************************************************/

var siteURL                  = ""; // Should never include the http part
var imagePath                = siteURL + "/images";
var ratingClickCallback      = new Array();
var ie6WindowsResizeEnabled  = false;
var headerBarWidget;
var siteNavWidget;

var registerEmail    = '';
var registerUsername = '';

var registerEmailInUse    = true;
var registerUsernameInUse = true;

var checkingRegisterEmail    = false;
var checkingRegisterUsername = false;

var doRegistrationAfterChecking = false;
var submittingDiscussion        = false;
var submittingComment           = false;

var startRating      = 0;
var reviewEdit       = false;
var reportURL        = "";

// Regular Expressions
var regexEmail      = /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/i;
var regexProperName = /^([A-Za-z]| |-|\'|,|\.){1,30}$/i;
var regexZipCode    = /^([a-z0-9]| |-){5,10}$/i;



/*****************************************************************************************************/
/*  Initializer: Sets up all the javascript events when page loads                                   */
/*****************************************************************************************************/

$(function() {
	var url = getURL();
	if (url.charAt(url.length - 1) == '/') url = url.substr(0, url.length - 1);
	
	// Enables the placeholder attribute fix for Internet Explorer
	$('input, textarea').placeholder();
	
	headerBarWidget = new HeaderBarWidget();
	siteNavWidget = new SiteNavWidget();

	// Restores recipe_nav_box to last position
	select_cat_box = getCookie('recipe_nav_box');
	if (select_cat_box == 'occasion')
	{
		showRecipesByOccasion(true);
	}
	else if (select_cat_box == 'favorite')
	{
		showMyFavoriteRecipes(true);
	}
	
	$('.dialog .button-close').click(function()
	{
		hideBlocker();
	});
	
	// Enable text counters
	$('textarea.has-textarea-counter').each(function (i) {
		$(this).trigger('onkeypress');
	});
	
	enableFollowEvents();
	enableUnfollowEvents();
	enableSubmitDiscussionBox(false);
	enableReplyEvents();
	enableCommentsToggle();
	
	
	if ($('.glazes-videos').length > 0) enableGlazesVideos();
	
	$('a.show-mybrands-popup').mouseenter(function(e) {
		e.preventDefault();
		var position  = $(this).offset();
		var page_link = $(this).attr('href');
		
		showMyBrandsPopup(page_link, position.top + $(this).height(), parseInt(position.left + ($(this).width() / 2)));
	});
	
	if ($(".videoAdOpen").length > 0) $(".videoAdOpen").colorbox({width:"662px", height:"720px", iframe:true, scrolling: false});
});

function showMyBrandsPopup(page_link, top, left)
{
	var dialogHTML  = '<div id="mybrands-popup"><div class="background png32t"></div><div class="header">This link will take you to <a href="' + page_link + '" target="_blank" title="Visit MyBrands">MyBrands.com</a></div>';
	dialogHTML     += '<div class="logo-section"><a href="' + page_link + '" target="_blank" title="Visit MyBrands"><span class="logo"></span></a></div>';
	dialogHTML     += '<div class="contact"><strong>Email:</strong> <a href="mailto:customercare@mybrands.com" title="Email MyBrands.com">customercare@mybrands.com</a><br /><strong>Toll-Free:</strong> 1-888-281-6400</div></div>';
	
	if ($('#mybrands-popup').length == 0)
	{
		$("#rap").append(dialogHTML);
	}
	
	$("#mybrands-popup").css({top: top + "px", left: (left - 178) + "px"});
	
	$("body").mousemove(function(e) {
		var position = $('#mybrands-popup').offset();
		var yOffset  = e.pageY - position.top;
		var xOffset  = e.pageX - position.left;
		
		if (yOffset < -35 || yOffset > 190 || xOffset < -25 || xOffset > 390)
		{
			$("body").unbind('mousemove');
			$("#mybrands-popup").remove();
		}
	});
}


function enableGlazesVideos()
{
	loadGlazesVideo("Amazing Glazes: How-To Basics", "how-to-basics.f4v", false);
	
	$('#video-glazes-basics').click(function() {loadGlazesVideo("Amazing Glazes: Easy Applications", "how-to-basics.f4v", true)});
	$('#video-glazes-applications').click(function() {loadGlazesVideo("Amazing Glazes: Easy Applications", "easy-applications.f4v", true)});
	$('#video-glazes-designs').click(function() {loadGlazesVideo("Amazing Glazes: Inspired Designs", "inspired-designs.f4v", true)});
}

function loadGlazesVideo(name, file, autoplay)
{
	var basepath = siteURL;
	var params   = {};
	params.menu  = "false";
	params.base  = basepath;
	params.allowFullScreen = "true";
	
	var flashvars = {};
	flashvars.video_url = siteURL + "/content/videos/amazing-glazes/" + file;
	
	if (autoplay) flashvars.autoplay  = "true";
	
	swfobject.embedSWF(siteURL + "/swf/video-player/amazing-glazes.swf", "glazes-swf", "448", "298", "9.0.128", "", flashvars, params);
	
	$('.glazes-videos .title').html(name);
}


/*
/*  User API Class: Handles user related calls and actions
/*****************************************************************************************************/

var account = new function() {
	var _self = this;
	var _userid;
	var _username;
	var _logouthash;
	var _userLoggedIn = userLoggedIn;
	var $dialogLogin = $('#dialog-login');
	
	// Facebook
	var _fbAPILoaded = false;
	var _userLoggedIntoFB = false;
	var _userFacebbokEnabled = false;
	var _fbUserid
	var _accessToken;
	var _scope = 'email, publish_stream';
	var _fbPermissions = {};
	
	bindEvents();
	
	var _announcement = new Announcement();
	
	$(function() {
		// Show announcment if not logged in
		if ( ! _userLoggedIn) {
			_announcement.show();
		}
	});
	
	
	/* Public Functions
	----------------------------------------------- */
	
	this.isUserLoggedIn = function() {
		return _userLoggedIn;
	}
	
	// Checks if the user is logged into the website
	this.checkWebsiteLogin = function(callbackObj) {
		$.ajax({
			context: this,
			data: {
				login_method: 'facebook'
			},
			url: siteURL + '/api/account/login-status/',
			type: 'POST',
			dataType: 'json',
			success: function(data) {
				processLoginStatus(data, callbackObj);
			}
		});
	}
	
	this.connectWithFacebook = function() {
		FB.getLoginStatus(function(response) {
			if (response.status === 'connected') {
				processFacebookResponse(response);
				doWebsiteFacebookConnect();
			}
			else {
				_userLoggedIntoFB = response.status === 'not_authorized';
				doFacebookLogin();
			}
		});
	}
	
	this.postFacebookFeed = function(wallPost) {
		if ( ! _fbAPILoaded) return;
		
		FB.ui({
				method: 'feed',
				name: wallPost.name,
				link: wallPost.link,
				picture: wallPost.picture,
				caption: wallPost.message,
				description: wallPost.description
			},
			function(response) {
				if (response && response.post_id) {
					console.log('Post was published.');
				}
				else {
					console.log('Post was not published.');
				}
			}
		);
	}
	
	// This is called once the Facebook API has finished loading
	this.bindFacebookEvents = function() {
		_fbAPILoaded = true;
		
		$('.facebook-button').live('click', function() {
			_self.connectWithFacebook();
		});
		
		if ($('.share-on-facebook').length > 0 || _userLoggedIn && ! _announcement.shownPreviously()) checkFacebookLogin();
		
		$('.share-on-facebook-button').live('click', function(e) {
			e.preventDefault();
			$this = $(this);
			
			_self.postFacebookFeed({
				message: $this.data('message'),
				picture: $this.data('picture'),
				link: $this.data('link'),
				name: $this.data('name'),
				description: $this.data('description')
			});
		});
	}
	
	// Checks the login status of the user and shows the 
	// login dialog box if the user is not logged in.
	// Returns false if the user is already logged in.
	this.promptUserToLogin = function() {
		if (_userLoggedIn) return false;
		
		_self.checkWebsiteLogin({
			loggedOut: function() {
				showLoginDialog();
			}
		});
		
		return true;
	}
	
	this.loginUser = function(loginMethod, username, password) {
		$.ajax({
			context: this,
			data: {
				login_method: loginMethod,
				username: username,
				password: password
			},
			url: siteURL + '/api/account/login/',
			type: 'POST',
			dataType: 'json',
			success: function(data) {
				processLoginStatus(data);
			}
		});
	}
	
	
	/* Private Functions
	----------------------------------------------- */
	
	function bindEvents() {
		$('.disable-facebook-connect-prompts').live('click', function() {
			$('.fb-connect-notification').hide();
			$.ajax({
				context: this,
				data: {},
				url: siteURL + '/api/account/disable-facebook-connect-prompts/',
				type: 'POST',
				dataType: 'json'
			});
		});
	}
	
	/* Website Login/Registration Functions */
	// Handles Facebook Login, Registration, and Account Linking
	function doWebsiteFacebookConnect(desiredUsername) {
		var data = {};
		
		if (desiredUsername == undefined) desiredUsername = '';
		
		$.ajax({
			context: this,
			url: siteURL + '/api/account/facebook-connect/',
			data: {
				desired_username: desiredUsername
			},
			type: 'POST',
			dataType: 'json',
			success: function(data) {
				processLoginStatus(data);
			}
		});
	}
	
	function processLoginStatus(data, callbackObj) {
		if ( ! callbackObj) callbackObj = {};
		var wasLoggedIn = _userLoggedIn;
		
		_userLoggedIn = data.login;
		_username = data.username;
		_logouthash = data.logouthash;
		
		if (_userLoggedIn) {
			// Hide any dialogs and update header tabs
			
			if (wasLoggedIn) {
				// User was already logged in, so some other action was taken
				// (for example Facebook account linking).
				// Display any errors to the user.
				hideBlocker();
				if (data.has_error) alert(data.error_msg);
			}
			else {
				// login state has changed...
				window.location.reload();
			}
			
			if (callbackObj.loggedIn) callbackObj.loggedIn();
		}
		else {
			if (data.has_error) {
				// Show login error message when login dialog is visible
				if ($dialogLogin.length > 0) {
					$dialogLogin.find('.error-message').html(data.error_msg);
				}
				else if ($('#dialog-register-confirm').length > 0) {
					$('#dialog-register-confirm').find('.error-message').html(data.error_msg);
				}
				else {
					alert(data.error_msg);
				}
			}
			else if (data.confirm_account_create) {
				// Backend has requested to confirm account creation so show confirm dialog
				showRegisterConfirmDialog(data.firstname, data.username);
				
			}
			if (callbackObj.loggedOut) callbackObj.loggedOut();
		}
	}
	
	/* Facebook Login Functions */
	function doFacebookLogin() {
		FB.login(function(response) {
			if (response.authResponse) {
				processFacebookResponse(response);
				doWebsiteFacebookConnect();
			}
			else {
				alert("Duncan Hines could not connect with Facebook.  If you got a dialog asking for 'Post to Facebook' permissions, then click the blue Facebook button again to login or complete registeration.  You will not be asked for permissions again.");
			}
		},
		{
			scope: _scope
		});
	}
	
	function checkFacebookLogin() {
		FB.getLoginStatus(function(response) {
			if (response.status === 'connected') {
				processFacebookResponse(response);
			}
			else {
				_userLoggedIntoFB = response.status === 'not_authorized';
				$('.share-on-facebook input[type=checkbox]').prop('checked', false);
				_announcement.show(true);
			}
		});
	}
	
	function processFacebookResponse(response) {
		_userLoggedIntoFB = true;
		_userFacebbokEnabled = true;
		_fbUserid = response.authResponse.userID;
		_accessToken = response.authResponse.accessToken;
		
		// Remove any Facebook Connect Call to Action Notifications
		$('.fb-connect-notification').hide();
		
		// Show any relavent callouts to user
		FB.api('/me/permissions', function(response) {
			if ( !! response.data && !! response.data[0]) {
				_fbPermissions = response.data[0];
				
				if (_fbPermissions.publish_stream == 1) {
					// Show any hidden share checkboxes
					$('.share-on-facebook').show();
				}
				else if ($('#member-create-tip-content').length > 0 || $('#memeber-create-recipe').length > 0) {
					// Uncheck share on facebook checkboxes for tips
					$('.share-on-facebook input[type=checkbox]').prop('checked', false);
				}
			}
		});
	}
	
	function showRegisterConfirmDialog(name, username) {
		var $dialogRegisterConfirm = $('#dialog-register-confirm');
		
		closeDialogs();
		showBlocker();
				
		if ($dialogRegisterConfirm.length == 0) {
			var html = "";
			html += '<div id="dialog-register-confirm" class="dialog">';
			html += '	<div class="close-button"></div>';
			html += '	<p>Hi <strong class="name"></strong>!,</p>';
			html += '	<p>You are about to create a new Baker\'s Club account. <strong>If you already have an account, please <a href="/bakers-club" title="">log in now</a> with your username and password.</strong> You can combine your account with Facebook afterwards.</p>';
			html += '	<br />';
			html += '	<p>For new Baker\'s Club members, please click confirm to create your account now!</p>';
			html += '	<div class="items">';
			html += '		<div class="error-message"></div>';
			html += '		<label>Desired Username</label>';
			html += '		<input name="username" type="text" value="" />';
			html += '	</div>';
			html += '	<div class="submit-button"></div>';
			html += '</div>';
			
			$("#rap").append(html);
			$dialogRegisterConfirm = $('#dialog-register-confirm');
			
			if (isIE6()) {
				centerAbsoluteElement($dialogRegisterConfirm);
				$(window).resize(function() {
					centerAbsoluteElement($dialogRegisterConfirm);
				});
				$(window).scroll(function() {
					centerAbsoluteElement($dialogRegisterConfirm);
				});
			}
			else {
				centerFixedElement($dialogRegisterConfirm);
				$(window).resize(function() {
					centerFixedElement($dialogRegisterConfirm);
				});
			}
			
			$dialogRegisterConfirm.find('.submit-button').click(function(e) {
				e.preventDefault();
				var desiredUsername = $dialogRegisterConfirm.find('input[name=username]').val();
				doWebsiteFacebookConnect(desiredUsername);
			});
			
			$dialogRegisterConfirm.find('.close-button').click(function() {
				hideBlocker();
			});
		}
		
		$dialogRegisterConfirm.find('.name').text(name);
		$dialogRegisterConfirm.find('input[name=username]').val(username);
		
		$dialogRegisterConfirm.show();
	}
	
	/* Login Dialog */
	function showLoginDialog() {
		closeDialogs();
		showBlocker();
				
		if ($dialogLogin.length == 0) {
			var html = "";
			html += '<div id="dialog-login" class="dialog">';
			html += '	<div class="close-button"></div>';
			html += '	<h3 class="seo-header login-header">Log into your Baker\'s Club account:</h3>';
			html += '	<div class="facebook-button login"></div>';
			html += '	<p style="font-size: 14px;">Log in with your Facebook ID — it\'s easy and there\'s no<br />need to remember your username and password</p>';
			html += '	<div class="label-separator"><div class="line"></div><div class="label">OR</div><div class="line"></div></div>';
			html += '	<div class="error-message error-label"></div>';
			html += '	<input class="username" type="text" name="username" maxlength="20" accesskey="u" placeholder="Username" value="" />';
			html += '	<input class="password" type="password" name="password" maxlength="20" placeholder="Password" />';
			html += '	<div class="login-button"></div>';
			html += '	<div class="help-text">';
			html += '		Not a member? <a href="/bakers-club" title="Sign up to The Baker\'s Club">Sign up here</a>.<br />';
			html += '		If you forgot your password, <a href="/forums/login.php?do=lostpw" title="Retreive lost password.">retreive it here</a>.';
			html += '	</div>';
			html += '</div>';
			
			$("#rap").append(html);
			$dialogLogin = $('#dialog-login');
			
			$('#dialog-login input').placeholder();
			
			if (isIE6()) {
				centerAbsoluteElement($dialogLogin);
				$(window).resize(function() {
					centerAbsoluteElement($dialogLogin);
				});
				$(window).scroll(function() {
					centerAbsoluteElement($dialogLogin);
				});
			}
			else {
				centerFixedElement($dialogLogin);
				$(window).resize(function() {
					centerFixedElement($dialogLogin);
				});
			}
			
			$dialogLogin.find('.login-button').click(function(e) {
				e.preventDefault();
				loginDialogSubmit();
			});
			
			$dialogLogin.find('.close-button').click(function() {
				hideBlocker();
			});
		}
		
		$dialogLogin.show();
	}
	
	function loginDialogSubmit() {
		var username = $.trim($dialogLogin.find('input[name=username]').val());
		var password = $.trim($dialogLogin.find('input[name=password]').val());
		var $errorMessage = $dialogLogin.find('.error-message');
		
		if (username.length == 0 || password.length == 0) {
			$errorMessage.html('A username and password is required to log into the Baker\'s Club.');
			return false;
		}
		else {
			$errorMessage.html('');
		}
		
		if (username.length < 3) {
			$errorMessage.html('Username must be at least 3 characters.');
			return false;
		}
		else {
			$errorMessage.html('');
		}
		
		_self.loginUser('standard', username, password);
	}
}



/*
/*  Header Bar Widget
/*****************************************************************************************************/

var HeaderBarWidget = function() {
	var _self = this;
	var $header = $('#header');
	var $headerRegisterBox = $('#header-register-box');
	var $headerLoginBox = $('#header-login-box');
	
	bindEvents();
	
	
	/* Public Functions
	----------------------------------------------- */
	
	// Refreshes the header bar widget with logged in username and logout button
	this.updateUser = function(username, logouthash) {
		
	}
	
	/* Private Functions
	----------------------------------------------- */
	
	function bindEvents() {
		$header.find('.toggle-login-box').click(function(e) {
			e.preventDefault();
			$headerLoginBox.toggle();
			$headerRegisterBox.hide();
		});
		$headerLoginBox.find('.close-button').click(function(e) {
			$headerLoginBox.hide();
		});
		
		$header.find('.toggle-register-box').click(function(e) {
			e.preventDefault();
			$headerRegisterBox.toggle();
			$headerLoginBox.hide();
		});
		$headerRegisterBox.find('.close-button').click(function(e) {
			$headerRegisterBox.hide();
		});
	}
}


function updateLoginHeader(username, logouthash)
{
	var html = '<span class="text font-lubalin-demi-11">Hi <a href="' + siteURL + '/bakers-club/edit-profile" title="Edit Profile">' + username + '</a></span>';
	
	$('#header-login-box').remove();
	$('#header .tab-member').html(html);
	
	html =  '<form action="' + siteURL + '/bakers-club/logout" method="post"><input type="hidden" name="do_logout" value="1" />';
	html += '<input type="hidden" name="logouthash" value="' + logouthash + '" />';
	html += '<input type="image" src="' + siteURL + '/images/header/tab-logout.png"  width="64" height="33" alt="Logout" /></form>';
	
	$('.toggle-login-box').unbind();
	$('#header .tab-member').removeClass("toggle-register-box");
	$('#header .tab-login').removeClass("toggle-login-box");
	$('#header .tab-login').html(html);
}


/*
/*  Site Navigation Widget
/*****************************************************************************************************/

var SiteNavWidget = function() {
	var $navButtons = $('div.nav-menu-item');
	var $searchTextField = $('#nav-search-text-input');
	
	// Navigation Menu Highlight Function
	$navButtons.mouseover(function() {
		var img = $(this).find('img');
		var src = img.attr('src').replace(/\/menu\//, '/menu-hl/');
		img.attr('src', src);
	});
	
	$navButtons.mouseout(function() {
		var img = $(this).find('img');
		var src = img.attr('src').replace(/\/menu-hl\//, '/menu/');
		img.attr('src', src);
	});
	
	// Search Box Functions
	$searchTextField.focus(function() {
		if ($(this).val() == 'Search') $(this).val('');
	});
	
	$searchTextField.blur(function() {
		if ($(this).val() == '') $(this).val('Search');
	});
}



/*****************************************************************************************************/
/*  Follow Baker: Allows following of baker's via AJAX                                               */
/*****************************************************************************************************/

function enableFollowEvents()
{
	$('.follow').click(function()
	{
		followBaker($(this));
		return false;
	});
}

function followBaker(clickedElem)
{
	if (account.promptUserToLogin()) return;
	
	var post_url = clickedElem.attr('href');
	var ind      = post_url.indexOf('?');
	if (ind > 0) post_url = post_url.substr(0, ind);
	
	// Track Click in Analytics
	_gaq.push(['_trackPageview', '/followbaker']);
	
	$.post(post_url, 
		{
			ajax:   1,
			action: 'follow'
		},
		function(data)
		{
			if (data.has_error)
			{
				alert('error: ' + data.error_msg);
			}
			else
			{
				$('.follow').each(function (index) {
					if ($(this).hasClass('user-' + data.username_slug))
					{
						$(this).parent().html('following');
					}
				});
			}
		},
		"json"
	);
	
}

function enableUnfollowEvents()
{
	$('.unfollow').click(function()
	{
		unfollowBaker($(this));
		return false;
	});
}

function unfollowBaker(clickedElem)
{
	if (account.promptUserToLogin()) return;
	
	var topElem = clickedElem.closest('td');
	//var ids = topElem.attr('id').split('-');
	//var userid = ids[1];

	var post_url = topElem.find('a').attr('href');

	
	$.post(post_url,
		{
			ajax:   1,
			action: 'unfollow'
		},
		function(data)
		{
			if (data.has_error)
			{
				alert('Error: ' + data.error_msg);
			}
			else
			{
				topElem.fadeTo(300, 0.3);
				clickedElem.fadeOut(300);
			}
		},
		"json"
	);

}



/*****************************************************************************************************/
/*  Discussions and Reviews Submition: Enables the inline discussion box and reloads discussions     */
/*****************************************************************************************************/

function enableSubmitDiscussionBox(justLoggedIn)
{
	$submitReview = $('#submit-review');
	if ($submitReview.length == 0) return;
	$submitReview.unbind();
	$submitReview.find('.submit-button').unbind();
	
	if ( ! account.isUserLoggedIn())
	{
		$('#review-promo-msg').html('Please log in or sign up to make a review.');
		
		$submitReview.click(function () {
			account.promptUserToLogin();
		});
		return;
	}

	createInputStars('yourrating');
	
	var $reviewTextbox = $('#review-textbox');
	$submitReview.find('.footer').css('display', 'none');
	$('#review-promo-msg').html('Have something to say? Start a discussion!');
	
	$reviewTextbox.css('overflow', 'hidden');
	if ($reviewTextbox.val().length == 0) $('#review-promo-msg').css('display', 'block');
	$('#review-promo-msg').click(function () {$reviewTextbox.focus();});
	
	$reviewTextbox.height(15);
	$reviewTextbox.height($reviewTextbox.attr('scrollHeight'));
	$reviewTextbox.focus(function () {
		$reviewTextbox.height(15);
		$(this).height($(this).attr('scrollHeight') + 15);
		$('#review-promo-msg').css('display', 'none');
		$('#submit-review .footer').css('display', 'block');
	});
	$('#main').click(function (e) {
		// Collapse when clicking outside submit review box and no text has been entered
		if ($(e.target).closest('#submit-review').length == 1 || $reviewTextbox.val().length > 0) return;
		
		$reviewTextbox.height(15);
		$(this).height($(this).attr('scrollHeight'));
		$('#review-promo-msg').css('display', 'block');
		$submitReview.find('.footer').css('display', 'none');
	});
	$reviewTextbox.keyup(function () {
		$reviewTextbox.height(15);
		$(this).height($(this).attr('scrollHeight') + 15);
	});
	
	$submitReview.find('.submit-button').click(submitDiscussion);
	
}

function submitDiscussion()
{
	// Avoid accidental flooding.
	if (submittingDiscussion) return false;
	
	var review = $.trim($('#review-textbox').val());
	var shareOnFacebook = $('#submit-review .share-on-facebook').css('display') == 'block' && $('#submit-review input[name=share_on_facebook]').prop('checked');
	
	if (review.length > 1500)
	{
		alert('Review cannot be longer than 1500 characters');
		return false;
	}
	else if (review.length < 3)
	{
		alert('Review must be at least 3 characters');
		return false;
	}
	
	var post_url = getURL();
	submittingDiscussion = true;
	
	// Track Click in Analytics
	_gaq.push(['_trackPageview', '/submitreview']);
	
	$.ajax({
		url: post_url, 
		type: 'POST',
		dataType: 'json',
		data: {
			ajax: 1,
			action: 'submit-discussion',
			review: review,
			share_on_facebook: shareOnFacebook
		},
		complete: function(XMLHttpRequest, textStatus) {
			submittingDiscussion = false;
		},
		success: function(data) {
			if (data.has_error) {
				alert('Could not submit dicussion: ' + data.error_msg);
			}
			else {
				finishDiscussionsReload(data);
				
				// Prompt user to do wall post if data is received from backend
				if (data.wall_post) account.postFacebookFeed(data.wall_post);
			} // end else
		} // end success function
	});
	
	return true;
}

function reloadDiscussions()
{
	// Check if discussions exist
	if ($('#reviews-section').length == 0) return false;
	
	var post_url = getURL();
	
	$.post(post_url, 
		{
			ajax:   1,
			action: 'load-reviews'
		},
		function(data)
		{
			if (data.has_error) alert('error loading reviews: ' + data.error_msg);
			else finishDiscussionsReload(data);
		},
		"json"
	);

	return true;
}

function finishDiscussionsReload(data)
{
	$submitReview = $('#submit-review');
	
	// Unbind all events
	$submitReview.unbind();
	$('#review-promo-msg').unbind();
	$('#review-textbox').unbind();
	$('#main').unbind();
	$submitReview.find('.submit-button').unbind();
	$('.follow').unbind();
	$('.toggle-comments').unbind();
	
	$('#reviews-section').html(data.html);
	enableSubmitDiscussionBox();
	enableFollowEvents();
	enableReplyEvents();
	enableCommentsToggle();
}


/*****************************************************************************************************/
/*  Comments Submission: Handles inline reply elements and  comment submition                         */
/*****************************************************************************************************/

function enableCommentBox(elemCommentFooter)
{
	// Check if logged in first
	if (account.promptUserToLogin()) return;
	
	var reply_box     = '<div id="reply-box"><div class="hr-separator"></div><div class="header">Type Your Reply:</div><div class="submit-box-top-edge"></div><div class="submit-box-middle"><textarea class="comment" rows="1" cols="40"></textarea></div><div class="submit-box-bot-edge"></div><div class="footer"><input class="reply png32t" type="image" value="Post Reply" src="' + imagePath + '/common/buttons-white/post-reply.png" /><input class="cancel png32t" type="image" value="Cancel" src="' + imagePath + '/common/buttons-white/cancel.png" /></div></div>';
	
	if ($('#reply-box').length > 0)
	{
		reply_box = $('#reply-box');
		
		// Reply Box is animating so disregard submit request
		if (reply_box.queue().length == 1) return;
		
		// Reply Box is already displayed, so ignore event
		if (elemCommentFooter.children('#reply-box').get(0) && reply_box.css('display') == 'block') return;
		
		$('#reply-box .reply').unbind();
		$('#reply-box .cancel').unbind();
		
		if (reply_box.css('display') == 'block')
		{
			reply_box.slideUp(150, function() {enableCommentBox(elemCommentFooter)});
			return;
		}
		
		reply_box.detach();
	}
	
	// Format Reply Box and setup for animation
	elemCommentFooter.append(reply_box);
	$('#reply-box').hide();
	updateReplyBoxHeight();
	
	// Display the reply box
	$('#reply-box').slideDown(400);
	
	$('#reply-box .comment').unbind();
	$('#reply-box .comment').keyup(function () {
		updateReplyBoxHeight();
	});
	
	$('#reply-box .cancel').unbind();
	$('#reply-box .cancel').click(function(){
		$('#reply-box .reply').unbind();
		$('#reply-box .cancel').unbind();
		$('#reply-box').slideUp(300); // optional param: function() {$(this).detach()}
	});
	
	$('#reply-box .reply').unbind();
	$('#reply-box .reply').click(function(){
		submitComment();
	});
}

function submitComment()
{
	// Avoid accidental flooding
	if (submittingComment) return;
	
	var post_url      = getURL();
	var comment       = $('#reply-box .comment').val();
	var ids           = $('#reply-box').parents('.review-thread').attr('id').split('-');
	var discussion_id = ids[1];
	
	if (comment.length < 4)
	{
		alert("The Comment field must be at least 4 characters in length.");
		return;
	}
	else if (comment.length > 1500)
	{
		alert("The Comment field cannot exceed 1500 characters.");
		return;
	}
	
	submittingComment = true;
	
	$.ajax({
		url:      post_url, 
		type:     'POST',
		dataType: 'json',
		data:     {ajax: 1, action: 'submit-comment', discussion_id: discussion_id, comment: comment},
		complete: function(XMLHttpRequest, textStatus) {submittingComment = false;},
		success:  function(data)
		{
			if (data.has_error)
			{
				alert("Could not submit comment: " + data.error_msg);
			}
			else
			{
				$('.review-footer .reply').unbind();
				$('.follow').unbind();
				$('.toggle-comments').unbind();
				
				$('#reply-box').parents('.review-thread').html(data.html);
				
				$('.review-footer .reply').click(function() {enableCommentBox($(this).parents('.review-footer'));});
				enableFollowEvents();
				enableCommentsToggle();
			}
		}
	});
}

function enableReplyEvents()
{
	$('.review-footer .reply').click(function()	{enableCommentBox($(this).parents('.review-footer'));});
}

function updateReplyBoxHeight()
{
	var reply_box_tb = $('#reply-box .comment');
	if (reply_box_tb.length == 0) return;
	
	reply_box_tb.height(30);
	
	var rbHeight = reply_box_tb.attr('scrollHeight');
	if (rbHeight < 30) rbHeight = 30;
	
	reply_box_tb.height(rbHeight + 15);
	
}

function enableCommentsToggle()
{
	$('.toggle-comments').click(function(){
		var copy = $(this).html();
		
		var toggle_elem = $(this);
		
		var comments_list = $(this).parents('.review-content').children('.comments-list');
		if (comments_list.css('display') == 'block')
		{
			comments_list.find('.icon').fadeOut(200);
			comments_list.slideUp(400, function() {toggle_elem.html('Show' + toggle_elem.html().substring(4))});
		}
		else
		{
			comments_list.find('.icon').delay(200).fadeIn(250);
			comments_list.slideDown(400, function() {toggle_elem.html('Hide' + toggle_elem.html().substring(4))});
		}
	});
}


/*****************************************************************************************************/
/*  Announcements - loads only once                                                                  */
/*****************************************************************************************************/


function Announcement()
{
	var _self = this;
	var $announcementDialog = $('#dialog-announcement');
	var _mode = 'default';
	var _transitionEmailLink = '<a href="mailto:facebook-transition@duncanhines.com" title="">facebook-transition@duncanhines.com</a>';
	
	var _loggedOutFooter = 'Or you can register on the site by <a href="/bakers-club" title="">clicking here</a>. \
							<strong>Already a Baker\'s Club member? Please <a href="/bakers-club">log in now</a> with your current username and password.</strong> You can merge your account later with Facebook if you like.';
	
	var _loggedInFooter = 'If you experience any issues combining your Baker\'s Club account with Facebook, please contact us at ' + _transitionEmailLink + '.';
	
	this.show = function(loggedIn) {
		if ( isIE6() || ! _self.canShowOnPage() || _self.shownPreviously()) return;
		
		if ($announcementDialog.length == 0) createDialog(loggedIn);
		
		_self.setLastShownDate();
		showBlocker();
		$announcementDialog.show();
	}
	
	this.hide = function() {
		$announcementDialog.hide();
	}
	
	this.shownPreviously = function() {
		var cookieAnnouncement = getCookie('announcement');
		return cookieAnnouncement.length == 10;
	}
	
	this.canShowOnPage = function() {
		var path = window.location.pathname.substr(1);
		
		var indexOfSlash = path.indexOf('/');
		if (indexOfSlash > 0) {
			path = path.substring(0, indexOfSlash);
		}
		
		return path == '' || path == 'recipes' || path == 'products' || path == 'baking-tips';
	}
	
	this.setLastShownDate = function(date) {
		if ( date == undefined || ! date instanceof Date) date = new Date();
		
		var year = date.getFullYear();
		var month = (date.getMonth() + 1).toString();
		var day = date.getDate().toString();
		
		if (month < 10) month = '0' + month;
		if (day < 10) day = '0' + day;
		
		setCookie('announcement', year + '-' + month + '-' + day);
	}
	
	function createDialog(loggedIn) {
		var dialogClass = '';
		var footer = _loggedOutFooter;
		if (loggedIn) {
			dialogClass = 'logged-in';
			footer = _loggedInFooter;
		}
		
		var html = "";
		html += '<div id="dialog-announcement" class="dialog ' + dialogClass + '">'
		html += '	<div class="button-close"></div>';
		html += '	<div class="copy"></div>';
		html += '	<div class="facebook-button"></div>';
		html += '	<div class="footer">' + footer + '</div>';
		html += '</div>';
		
		$("#rap").append(html);
		$announcementDialog = $('#dialog-announcement');
		
		$announcementDialog.find('.button-close').live('click', function() {
			hideBlocker();
		});
	}
}


/*****************************************************************************************************/
/*  Content Reporting: Pop opens the report content dialog                                           */
/*****************************************************************************************************/

function reportContent(url)
{
	if (url.length == 0) return;
	if ($('#dialog-report-content').length > 0) $('#dialog-report-content').remove();
	reportURL = url;
	
	var dialogReportContentHTML = "";
	dialogReportContentHTML += '<div id="dialog-report-content" class="dialog">';
	dialogReportContentHTML += '<div class="background png32t"></div><div class="button-close"></div>';
	dialogReportContentHTML += '<div class="header"><img class="png32t" src="' + imagePath + '/dialogs/report-content/report-problem.png" width="127" height="16" alt="Report Problem" /></div>';
	dialogReportContentHTML += '<div class="help-text">';
	dialogReportContentHTML += '	Reporting is for notifying Duncan Hines about inappropriate or offensive content.';
	dialogReportContentHTML += '	For any questions or concerns, please visit the <a href="" title="Baker\'s Club Forums">Baker\'s Club Forums</a>.';
	dialogReportContentHTML += '</div>';
	dialogReportContentHTML += '<div class="error-container"><div><span id="error-label-report-content" class="error-label"></span></div></div>';
	dialogReportContentHTML += '<div class="dropdown-container"><select id="dropdown-report-reason"><option value="">Select Problem</option><option value="offensive-content">Offensive / Inappropriate Content</option></select></div>';
	dialogReportContentHTML += '<div class="submit"></div>';
	dialogReportContentHTML += '</div>';
	
	$("#rap").append(dialogReportContentHTML);
	var dialogReportContent = $('#dialog-report-content');
	
	if (isIE6())
	{
		centerAbsoluteElement(dialogReportContent);
		$(window).resize(function(){centerAbsoluteElement(dialogReportContent);});
		$(window).scroll(function(){centerAbsoluteElement(dialogReportContent);});
	}
	else
	{
		centerFixedElement(dialogReportContent);
		$(window).resize(function(){centerFixedElement(dialogReportContent);});
	}
	
	$('#dialog-report-content .submit').click(function() {doReportContent();return false;});
	$('.dialog .button-close').unbind();
	$('.dialog .button-close').click(function() {hideBlocker();});

	showBlocker();
}

function doReportContent()
{
	var problem = $('#dropdown-report-reason').val();
	
	
	if (reportURL.length == 0)
	{
		$('#error-label-report-content').html('Internal Error, please close and try again.');
		return;
	}
	else if (problem.length == 0)
	{
		$('#error-label-report-content').html('Please select a reason.');
		return;
	}
	$('#error-label-report-content').html('');
	
	$.post(reportURL, 
		{
			ajax:     1,
			action:   'report',
			problem:  problem
		},
		function(data)
		{
			if (data.has_error)
			{
				$('#error-label-report-content').html(data.error_msg);
			}
			else
			{
				$('#dialog-report-content .help-text').html(data.msg);
				$('#dropdown-report-reason').remove();
				$('#dialog-report-content .submit').remove();
			}
		},
		"json"
	);
	
	

}



/*****************************************************************************************************/
/*  Blocker: Grays out the entire page when an inline dialog box is showing                          */
/*****************************************************************************************************/

function blockerIE6Resize() {
	$('div#blocker').css("width", $(window).width() + $(window).scrollLeft());
	$('div#blocker').css("height",$(window).height() + $(window).scrollTop());	
}

function enableIE6BlockerResize() {
	if ( ! ie6WindowsResizeEnabled)
	{
		$(window).resize(function() {blockerIE6Resize()});
		$(window).scroll(function() {blockerIE6Resize()});
		ie6WindowsResizeEnabled = true;
	}
	blockerIE6Resize();
}

function showBlocker() {
	if ($('div#blocker').length > 0) return;
	$("div#rap").before("<div id=\"blocker\"></div>");
	
	if (isIE6()) enableIE6BlockerResize();
	
	$('div#blocker').click(function() {hideBlocker()});
}

function hideBlocker() {
	$('div#blocker').remove();
	closeDialogs();
}

function closeDialogs() {
	hideVideoPlayer();
	$('.dialog').hide();
}



/*****************************************************************************************************/
/*  User Ratings: Converts radio fields into graphical and clicable stars                            */
/*****************************************************************************************************/

function createInputStars(name)
{
	var container_id = "#stars-" + name;
	$(container_id + " span.star").addClass('star-default');
	$(container_id + " span.star").click(starClicked);
	
	starsRefresh(name);
}

function getStarRating(name)
{
	var val = $('#stars-' + name + ' input:radio:checked').val();
	return parseInt(val);
}

function setStarRating(name, value)
{
	// Track Click in Analytics
	_gaq.push(['_trackPageview', '/ratings']);

	// Send rating
	$.post(getURL(),
		{
			ajax:   1,
			submit: 1,
			rating: value,
			action: 'rate'
		},
		function(data)
		{
			if (data.has_error)
			{
				alert(data.error_msg);
			}
			else
			{
				var newRating = parseInt(data.rating);

				if ($('#stars-yourrating').length > 0)
				{
					$('#stars-yourrating input:radio:checked').attr('checked', false);
					$('#stars-yourrating input:radio[value=' + newRating + ']').attr('checked', true);
					starsRefresh('yourrating');
				}
				
				$('#content-info-rating').html(data.rating_html);
				
				if ($('#menu-rate').css('display') == 'block') {
					$('#menu-rate .message').html(data.html);
					createInputStars('contextrating');
					
					$('#menu-rate .share-on-facebook-button').slideDown();
				}
			}
		},
		"json"
	);
}

function starClicked(e)
{
	var inputElem  = $(this).find('input');
	var rating     = inputElem.val();
	var name       = inputElem.attr('name');
	var currRating = getStarRating(name);

	if (rating < 1 || rating > 5 || currRating == rating) return;
	
	setStarRating(name, rating);
}

function starsRefresh(name)
{
	var newValue = getStarRating(name);
	
	$("input:radio[name='" + name + "']").each(function() {
		var val = parseInt($(this).val());
		if (val <= newValue)
		{
			$(this).parents("span.star").addClass("star-selected");
		}
		else
		{
			$(this).parents("span.star").removeClass("star-selected");
		}
	});
}



/*****************************************************************************************************/
/*  Recipe Category/Occasion/Favorite Module: Animations and sets cookie                             */
/*****************************************************************************************************/

function showRecipesByType(instant)
{
	var animateTime = 500;
	if (instant) animateTime = 0;
	
	setActiveRecipeCat("recipe-cat-recipes-by-type", animateTime);
	if ( ! instant) setCookie('recipe_nav_box', 'type');
	
	$("#recipe-cat-recipes-by-occasion").animate({marginTop: 153}, animateTime);
	$("#recipe-cat-my-fav-recipes").animate({marginTop: 183}, animateTime);
}

function showRecipesByOccasion(instant)
{
	var animateTime = 500;
	if (instant) animateTime = 0;
	
	setActiveRecipeCat("recipe-cat-recipes-by-occasion", animateTime);
	if ( ! instant) setCookie('recipe_nav_box', 'occasion');
	
	$("#recipe-cat-recipes-by-occasion").animate({marginTop: 30}, animateTime);
	$("#recipe-cat-my-fav-recipes").animate({marginTop: 183}, animateTime);
}

function showMyFavoriteRecipes(instant)
{
	var animateTime = 500;
	if (instant) animateTime = 0;
	
	setActiveRecipeCat("recipe-cat-my-fav-recipes", animateTime);
	if ( ! instant) setCookie('recipe_nav_box', 'favorite');
	
	$("#recipe-cat-recipes-by-occasion").animate({marginTop: 30}, animateTime);
	$("#recipe-cat-my-fav-recipes").animate({marginTop: 60}, animateTime);
}

function setActiveRecipeCat(id, animateTime)
{
	var recipeCat;
	var recipeCats = new Array("recipe-cat-recipes-by-type", "recipe-cat-recipes-by-occasion", "recipe-cat-my-fav-recipes");
	
	var slideDownTime = animateTime + 50;
	var slideUpTime   = animateTime - 50;
	
	if (animateTime < 50)
	{
		slideDownTime = 0;
		slideUpTime   = 0;
	}
	
	for (var i in recipeCats)
	{
		recipeCat = "#" + recipeCats[i];
		if (recipeCats[i] == id)
		{
			$(recipeCat).find(".recipe-cat-button").attr("src", imagePath + "/recipe-cat-box/button-collapse.png");
			$(recipeCat).children(".recipe-cat-content").slideDown(slideDownTime);
		}
		else
		{
			$(recipeCat).find(".recipe-cat-button").attr("src", imagePath + "/recipe-cat-box/button-expand.png");
			$(recipeCat).children(".recipe-cat-content").slideUp(slideUpTime);
		}
	}
}



/*****************************************************************************************************/
/*  Videos: Opens an inline dialog that plays videos                                                 */
/*****************************************************************************************************/

function loadVideo(title, path)
{
	showBlocker();
	showVideoPlayer();
	
	$('#video-overlay-320-240 .title').html(title);
	
	var params   = {};
	params.menu  = "false";
	
	var flashvars = {};
	flashvars.video_url = siteURL + path;
	
	swfobject.embedSWF(siteURL + "/swf/video-player/shell.swf", "video-player-swf", "480", "406", "9.0.0", "", flashvars, params);
	
}

function showVideoPlayer()
{
	$("div#rap").before("<div id=\"video-overlay-320-240\"><div class=\"background png32t\"></div><div class=\"title\"></div><div class=\"close\"><img class=\"png32t\" src=\"" + imagePath + "/common/video-player/close-button.png\" width=\"47\" height=\"11\" alt=\"close\" /></div><div id=\"video-player-swf\"></div></div>");
	$("#video-overlay-320-240 .close").click(function() {hideVideoPlayer();});
	
	$(window).resize(function(){
		positionVideoPlayer();
	});

	$(window).scroll(function(){
		positionVideoPlayer();
	});
	
	positionVideoPlayer();
}

function positionVideoPlayer()
{
	var xpos = $(window).width()  - $("#video-overlay-320-240").width();
	var ypos = $(window).height() - $("#video-overlay-320-240").height();
	
	
	if (xpos < 0) xpos = 0;
	if (ypos < 0) ypos = 0;
	
	
	xpos = xpos / 2 + $(window).scrollLeft();
	ypos = ypos / 2 + $(window).scrollTop();
	
	
	$("#video-overlay-320-240").css("left", xpos);
	$("#video-overlay-320-240").css("top",  ypos);
}

function hideVideoPlayer()
{
	$('div#blocker').remove();
	$("#video-overlay-320-240").remove();
}



/*****************************************************************************************************/
/*  Support Functions                                                                                */
/*****************************************************************************************************/

function centerAbsoluteElement(elem)
{
	var windowPos  = $(window).scrollTop();
	var windowSize = $(window).height();
	var elemSize   = elem.height();
	var offset     = (windowSize - elemSize) >> 1;
	
	if (offset < 0) offset = 0;
	elem.css("top", windowPos + offset);
	
	
	windowPos   = $(window).scrollLeft();
	windowSize  = $(window).width();
	elemSize    = elem.width();
	offset      = (windowSize - elemSize) >> 1;
	
	if (offset < 0) offset = 0;
	elem.css("left", windowPos + offset);
}

function centerFixedElement(elem)
{
	var windowSize = $(window).height();
	var elemSize   = elem.height();
	var offset     = (windowSize - elemSize) >> 1;
	
	if (offset < 0) offset = 0;
	elem.css("top", offset);
	
	
	windowSize  = $(window).width();
	elemSize    = elem.width();
	offset      = (windowSize - elemSize) >> 1;
	
	
	if (offset < 0) offset = 0;
	elem.css("left", offset);
}


function isIE6()
{
	return jQuery.browser.msie && jQuery.browser.version.substr(0,1) == "6";
}


function createSlug(str)
{
	var result = str.toLowerCase();
	result     = result.replace(/ |_|\.|,|\/|&/g, '-');
	result     = result.replace(/[^-a-z0-9]/g, '');
	result     = result.replace(/-+/g, '-');
	result     = result.replace(/^-|-$/g, '');
	return result;
}

function number_alpha_numeric_chars(str)
{
	var result = str.replace(/[^a-z0-9]/ig, '');
	return result.length;
}

function getURL()
{
	var url = window.location.toString();
	return url;
}

function getURI()
{
	var uri = window.location.toString();
	
	uri = uri.replace(/^http:\/\/[\w\.]*/, "");
	
	if (siteURL.length > 0 && uri.indexOf(siteURL) == 0) uri = uri.substring(siteURL.length);
	
	// Cleanup slashes
	uri = uri.replace(/\/+/g, "/");
	uri = uri.replace(/^\//, "");
	uri = uri.replace(/\/$/, "");
	
	return uri;
}

function setCookie(name, value)
{
	var expireDate = new Date();
	expireDate.setDate(expireDate.getDate() + 365);
	
	document.cookie = name + "=" + escape(value) + ";expires=" + expireDate.toGMTString() + "; path=/";
}

function getCookie(name)
{
	var index = document.cookie.indexOf(name + "=");
	if (index < 0) return "";
	
	
	var start = index + name.length + 1;
	var end   = document.cookie.indexOf(";", start);
	if (end < 0) end = document.cookie.length;
	
	return unescape(document.cookie.substring(start, end));
}

function cleanEmailsList(emails)
{
	var email_list = emails.replace(/\n|\s/g, '');
	email_list     = email_list.replace(/,+/g, ', ');
	email_list     = email_list.replace(/^,\s|,\s$/g, '');
	return email_list;
}


function h1imgswap(id, name, src, width, height)
{
	$(id).replaceWith('<img class="png32t" src="' + src + '" width="' + width + '" height="' + height + '" alt="' + name + '" />');
}

function update_counter(textarea, count)
{
	var chars_remaining = count - textarea.value.length;
	var message = '';
	
	// Truncate excess characters
	if (chars_remaining < 0) textarea.value = textarea.value.substr(0, count);
	
	// Set Counter Message
	if (chars_remaining <= 0)
		message = 'No more characters remaining';
	else if (chars_remaining == 1)
		message = '1 character remaining';
	else
		message = chars_remaining + ' characters remaining';
	
	$('#counter-' + textarea.id).html(message);
}



/*****************************************************************************************************/
/*  Validation Functions                                                                             */
/*****************************************************************************************************/

function validEmails(emails)
{
	var email_list   = emails.split(',');
	var num_emails   = email_list.length;
	var emails_found = 0;
	
	for (var i = 0; i < num_emails; i++)
	{
		email = $.trim(email_list[i]);
		if (email.length == 0) continue;
		
		if ( ! regexEmail.test(email) ) return false;
		emails_found++;
	}
	return emails_found > 0;
}

function validEmail(email)
{
	return regexEmail.test(email);
}

/*
$('#form-register').submit(function() {doRegistration();return false;});
$('#form-register input[name=firstname]').blur(function() {validateFirstName();});
$('#form-register input[name=lastname]').blur(function() {validateLastName();});
$('#form-register input[name=username]').blur(function() {validateUsername();});
$('#form-register input[name=email]').blur(function() {validateEmail();});
$('#form-register input[name=zipcode]').blur(function() {validateZipCode();});
$('#form-register input[name=password]').blur(function() {validatePassword();});
$('#form-register input[name=password_confirm821]').blur(function() {validatePasswordConfirm();});


var firstname        = $.trim($('#form-register input[name=firstname]').val());
var lastname         = $.trim($('#form-register input[name=lastname]').val());
var username         = $.trim($('#form-register input[name=username]').val());
var email            = $.trim($('#form-register input[name=email]').val());
var zipcode          = $.trim($('#form-register input[name=zipcode]').val());
var password          = $('#form-register input[name=password]').val();
var password_confirm  = $('#form-register input[name=password_confirm821]').val();

if ( firstname.length        > 0) validateFirstName();
if ( lastname.length         > 0) validateLastName();
if ( zipcode.length          > 0) validateZipCode();
if ( password.length         > 0) validatePassword();
if ( password_confirm.length > 0) validatePasswordConfirm();
if ( username.length         > 0) validateUsername();
if ( email.length            > 0) validateEmail();



// Does registration through inline dialog box
function doRegistration()
{
	var firstname        = $.trim($('#form-register input[name=firstname]').val());
	var lastname         = $.trim($('#form-register input[name=lastname]').val());
	var username         = $.trim($('#form-register input[name=username]').val());
	var email            = $.trim($('#form-register input[name=email]').val());
	var address          = $.trim($('#form-register input[name=address]').val());
	var city             = $.trim($('#form-register input[name=city]').val());
	var state            = $.trim($('#form-register select[name=state]').val());
	var zipcode          = $.trim($('#form-register input[name=zipcode]').val());
	
	var password           = $('#form-register input[name=password]').val();
	var password_confirm   = $('#form-register input[name=password_confirm821]').val();
	var is_opt_newsletter  = $('#form-register input[name=opt_newsletter]').attr('checked');
	
	var has_error = false;
	
	if ( ! validateFirstName()       ) has_error = true;
	if ( ! validateLastName()        ) has_error = true;
	if ( ! validateZipCode()         ) has_error = true;
	if ( ! validatePassword()        ) has_error = true;
	if ( ! validatePasswordConfirm() ) has_error = true;
	if ( ! validateUsername()        ) has_error = true;
	if ( ! validateEmail()           ) has_error = true;
	
	if (checkingRegisterEmail || checkingRegisterUsername) doRegistrationAfterChecking = true;
	
	if (has_error || checkingRegisterEmail || checkingRegisterUsername || registerEmailInUse || registerUsernameInUse) return false;
	
	// Ignore state errors
	if (state.length != 2) state = '';
	
	var opt_newsletter = '';
	
	if (is_opt_newsletter)
	{
		opt_newsletter = 'yes';
	}
	
	$.post(siteURL + '/bakers-club/ajax_register/', 
		{
			ajax:           1,
			firstname:      firstname,
			lastname:       lastname,
			username:       username,
			password:       password,
			email:          email,
			address:        address,
			city:           city,
			state:          state,
			zipcode:        zipcode,
			opt_newsletter: opt_newsletter
		},
		function(data)
		{
			if (data == 'true')
			{
				hideBlocker();
			}
			else
			{
				alert(data);
			}
		}
	);

	return true;
}



function validateFirstName()
{
	var firstname = $.trim($('#form-register input[name=firstname]').val());
	if (firstname.length == 0)
	{
		$('#error-label-firstname').html('First Name is required.');
		return false;
	}
	else if ( ! regexProperName.test(firstname))
	{
		$('#error-label-firstname').html('First Name contains invalid characters.');
		return false;
	}
	else
	{
		$('#error-label-firstname').html('');
		return true;
	}
}

function validateLastName()
{
	var lastname = $.trim($('#form-register input[name=lastname]').val());
	if (lastname.length == 0)
	{
		$('#error-label-lastname').html('Last Name is required.');
		return false;
	}
	else if ( ! regexProperName.test(lastname))
	{
		$('#error-label-lastname').html('Last Name contains invalid characters.');
		return false;
	}
	else
	{
		$('#error-label-lastname').html('');
		return true;
	}
}

function validateUsername()
{
	var username = $.trim($('#form-register input[name=username]').val());
	if (username.length == 0)
	{
		$('#error-label-username').html('Username is required.');
		return false;
	}
	else if (number_alpha_numeric_chars(username) < 3)
	{
		$('#error-label-username').html('3 letters and numbers are required for username.');
		return false;
	}
	else if (registerUsername != username)
	{
		// Let's check if username is in use.
		$('#error-label-username').html('Checking if username is in use...');
		registerUsername         = username;
		registerUsernameInUse    = true;
		checkingRegisterUsername = true;
		
		$.post(siteURL + '/bakers-club/ajax_valid_username/', 
			{
				ajax:     1,
				username: username
			},
			function(data)
			{
				checkingRegisterUsername = false;
				if (data == 'true')
				{
					$('#error-label-username').html('');
					registerUsernameInUse = false;
					
					if ( ! checkingRegisterEmail && doRegistrationAfterChecking)
					{
						doRegistrationAfterChecking = false;
						if ( ! registerEmailInUse)
						{
							//alert('yes1');
							doRegistration();
						}
					}
					
					return true;
				}
				else
				{
					$('#error-label-username').html(data);
					registerUsernameInUse       = true;
					doRegistrationAfterChecking = false;
				}
			}
		);
		return true;
	}
	else
	{
		if (registerUsernameInUse)
		{
			$('#error-label-username').html('Username is already in use.');
			return false;
		}
		else
		{
			$('#error-label-username').html('');
			return true;
		}
	}
}

function validateEmail()
{
	var email = $.trim($('#form-register input[name=email]').val());
	if (email.length == 0)
	{
		$('#error-label-email').html('Email is required.');
		return false;
	}
	else if ( ! regexEmail.test(email))
	{
		$('#error-label-email').html('Not a valid email address.');
		return false;
	}
	else if (registerEmail != email)
	{
		// Let's check if email is in use.
		$('#error-label-email').html('Checking if email is in use...');
		registerEmail         = email;
		registerEmailInUse    = true;
		checkingRegisterEmail = true;
		
		$.post(siteURL + '/bakers-club/ajax_valid_email/', 
			{
				ajax:     1,
				email: email
			},
			function(data)
			{
				checkingRegisterEmail = false;
				if (data == 'true')
				{
					$('#error-label-email').html('');
					registerEmailInUse = false;
					
					if ( ! checkingRegisterUsername && doRegistrationAfterChecking)
					{
						doRegistrationAfterChecking = false;
						if ( ! registerUsernameInUse)
						{
							//alert('yes2');
							doRegistration();
						}
					}
					
					return true;
				}
				else
				{
					$('#error-label-email').html(data);
					registerEmailInUse          = true;
					doRegistrationAfterChecking = false;
				}
			}
		);
		return true;
	}
	else
	{
		if (registerEmailInUse)
		{
			$('#error-label-email').html('Email is already in registered.');
			return false;
		}
		else
		{
			$('#error-label-email').html('');
			return true;
		}
	}
}



function validatePassword()
{
	var password = $('#form-register input[name=password]').val();
	if (password.length == 0)
	{
		$('#error-label-password').html('Password is required.');
		return false;
	}
	else if (password.length < 5)
	{
		$('#error-label-password').html('Password must be 5 characters long.');
		return false;
	}
	else
	{
		$('#error-label-password').html('');
		return true;
	}
}


function validatePasswordConfirm()
{
	var password_confirm = $('#form-register input[name=password_confirm821]').val();
	if (password_confirm.length == 0)
	{
		$('#error-label-confirm-password').html('Confirm Password is required.');
		return false;
	}
	else if (password_confirm != $('#form-register input[name=password]').val())
	{
		$('#error-label-confirm-password').html('Confirm Password doesn\'t match Password.');
		return false;
	}
	else
	{
		$('#error-label-confirm-password').html('');
		return true;
	}
}

function validateZipCode()
{
	var zipcode = $.trim($('#form-register input[name=zipcode]').val());
	if (zipcode.length > 0 && ! regexZipCode.test(zipcode))
	{
		$('#error-label-zipcode').html('Not a valid ZIP Code.');
		return false;
	}
	else
	{
		$('#error-label-zipcode').html('');
		return true;
	}
}
*/


/*! http://mths.be/placeholder v1.8.7 by @mathias */
/* This is used for IE support of placeholder tags */
;(function(window, document, $) {

	var isInputSupported = 'placeholder' in document.createElement('input'),
	    isTextareaSupported = 'placeholder' in document.createElement('textarea'),
	    prototype = $.fn,
	    placeholder;

	if (isInputSupported && isTextareaSupported) {

		placeholder = prototype.placeholder = function() {
			return this;
		};

		placeholder.input = placeholder.textarea = true;

	} else {

		placeholder = prototype.placeholder = function() {
			return this
				.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
				.not('.placeholder')
				.bind('focus.placeholder', clearPlaceholder)
				.bind('blur.placeholder', setPlaceholder)
				.trigger('blur.placeholder').end();
		};

		placeholder.input = isInputSupported;
		placeholder.textarea = isTextareaSupported;

		$(function() {
			// Look for forms
			$(document).delegate('form', 'submit.placeholder', function() {
				// Clear the placeholder values so they don’t get submitted
				var $inputs = $('.placeholder', this).each(clearPlaceholder);
				setTimeout(function() {
					$inputs.each(setPlaceholder);
				}, 10);
			});
		});

		// Clear placeholder values upon page reload
		$(window).bind('unload.placeholder', function() {
			$('.placeholder').val('');
		});

	}

	function args(elem) {
		// Return an object of element attributes
		var newAttrs = {},
		    rinlinejQuery = /^jQuery\d+$/;
		$.each(elem.attributes, function(i, attr) {
			if (attr.specified && !rinlinejQuery.test(attr.name)) {
				newAttrs[attr.name] = attr.value;
			}
		});
		return newAttrs;
	}

	function clearPlaceholder() {
		var $input = $(this);
		if ($input.val() === $input.attr('placeholder') && $input.hasClass('placeholder')) {
			if ($input.data('placeholder-password')) {
				$input.hide().next().show().focus().attr('id', $input.removeAttr('id').data('placeholder-id'));
			} else {
				$input.val('').removeClass('placeholder');
			}
		}
	}

	function setPlaceholder() {
		var $replacement,
		    $input = $(this),
		    $origInput = $input,
		    id = this.id;
		if ($input.val() === '') {
			if ($input.is(':password')) {
				if (!$input.data('placeholder-textinput')) {
					try {
						$replacement = $input.clone().attr({ 'type': 'text' });
					} catch(e) {
						$replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
					}
					$replacement
						.removeAttr('name')
						// We could just use the `.data(obj)` syntax here, but that wouldn’t work in pre-1.4.3 jQueries
						.data('placeholder-password', true)
						.data('placeholder-id', id)
						.bind('focus.placeholder', clearPlaceholder);
					$input
						.data('placeholder-textinput', $replacement)
						.data('placeholder-id', id)
						.before($replacement);
				}
				$input = $input.removeAttr('id').hide().prev().attr('id', id).show();
			}
			$input.addClass('placeholder').val($input.attr('placeholder'));
		} else {
			$input.removeClass('placeholder');
		}
	}

}(this, document, jQuery));
