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

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

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);

	// Navigation Menu Highlight Function
	$('div.nav-menu-item').mouseover(function()
	{
		var img = $(this).find('img');
		var src = img.attr('src').replace(/\/menu\//, '/menu-hl/');
		img.attr('src', src);
	});
	
	$('div.nav-menu-item').mouseout(function()
	{
		var img = $(this).find('img');
		var src = img.attr('src').replace(/\/menu-hl\//, '/menu/');
		img.attr('src', src);
	});
	
	// Login Box Functions
	$('.toggle-login-box').click(function()
	{
		$('#login-box').toggle();
		return false;
	});
	
	$('#login-box .close-button').click(function()
	{
		$('#login-box').hide();
	});
	
	
	// Search Box Functions
	$('#nav-search-text-input').focus(function()
	{
		if ($(this).val() == 'Search') $(this).val('');
	});
	
	$('#nav-search-text-input').blur(function()
	{
		if ($(this).val() == '') $(this).val('Search');
	});
	
	// 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 ($('#recipe-top-box-member-photo .enlarge').length > 0) {
		$('#recipe-top-box-member-photo .enlarge').click(enlargeMemberRecipePhoto);
	}
	
	/*
	var cookieAnnounce = getCookie('announcement');
	if (cookieAnnounce.length == 0)
	{
		showAnnouncement();
		setCookie('announcement', '2011-03-01');
	}
	*/
	
	// Event Handlers for login/registration dialog
	
	/*
	$('#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();});
	*/

});


function enlargeMemberRecipePhoto()
{
	var src = $(this).attr('src');
	src = src.replace(/\.jpg$/i, "-full.jpg");
	
	displayPhoto(src);
}


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);
}


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

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

function followBaker(clickedElem)
{
	if ( ! userLoggedIn)
	{
		showLoginBox();
		return;
	}
	
	var post_url = clickedElem.attr('href');
	var ind      = post_url.indexOf('?');
	if (ind > 0) post_url = post_url.substr(0, ind);
	
	$.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 ( ! userLoggedIn)
	{
		showLoginBox();
		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)
{
	if ($('#submit-review').length == 0) return;
	$('#submit-review').unbind();
	$('#button-submit-review').unbind();
	
	if ( ! userLoggedIn)
	{
		$('#review-promo-msg').html('Please log in or sign up to make a review.');
		
		$('#submit-review').click(function () {
			showLoginBox();
		});
		return;
	}

	createInputStars('yourrating');
	
	var review_tb = $('#review-textbox');
	$('#submit-review .footer').css('display', 'none');
	$('#review-promo-msg').html('Have something to say? Start a discussion!');
	
	review_tb.css('overflow', 'hidden');
	if (review_tb.val().length == 0) $('#review-promo-msg').css('display', 'block');
	$('#review-promo-msg').click(function () {review_tb.focus();});
	
	
	review_tb.height(15);
	review_tb.height(review_tb.attr('scrollHeight'));
	review_tb.focus(function () {
		review_tb.height(15);
		$(this).height($(this).attr('scrollHeight') + 15);
		$('#review-promo-msg').css('display', 'none');
		$('#submit-review .footer').css('display', 'block');
	});
	review_tb.focusout(function () {
		if ($(this).val().length > 0) return;
		review_tb.height(15);
		$(this).height($(this).attr('scrollHeight'));
		$('#review-promo-msg').css('display', 'block');
		$('#submit-review .footer').css('display', 'none');
	});
	review_tb.keyup(function () {
		review_tb.height(15);
		$(this).height($(this).attr('scrollHeight') + 15);
	});
	
	$('#button-submit-review').click(submitDiscussion);
	
}

function submitDiscussion()
{
	// Avoid accidental flooding.
	if (submittingDiscussion) return false;
	
	var review = $.trim($('#review-textbox').val());
	
	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;
	
	$.ajax({
		url:      post_url, 
		type:     'POST',
		dataType: 'json',
		data:     {ajax: 1, action: 'submit-discussion', review: review},
		complete: function(XMLHttpRequest, textStatus) {submittingDiscussion = false;},
		success:  function(data)
		{
			if (data.has_error) alert('Could not submit dicussion: ' + data.error_msg);
			else finishDiscussionsReload(data);
		}
	});
	
	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)
{
	// Unbind all events
	$('#submit-review').unbind();
	$('#review-promo-msg').unbind();
	$('#review-textbox').unbind();
	$('#button-submit-review').unbind();
	$('.follow').unbind();
	$('.toggle-comments').unbind();
	
	$('#reviews-section').html(data.html);
	enableSubmitDiscussionBox();
	enableFollowEvents();
	enableReplyEvents();
	enableCommentsToggle();
}


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

function enableCommentBox(elemCommentFooter)
{
	// Check if logged in first
	if ( ! userLoggedIn)
	{
		showLoginBox();
		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 showAnnouncement()
{
	var dialogHTML = "";
	dialogHTML += '<div id="dialog-announce-update" class="dialog">'
	dialogHTML += '	<div class="background png32t"></div><div class="button-close"></div>'
	dialogHTML += '	<div class="inner" style="margin-top: 108px;""><img src="' + imagePath + '/dialogs/announce-update/we-upgraded-header.png" width="441" height="40" alt="We\'ve upgraded the Baker\'s Club and launched fun new features! You can now..." /></div>';
	dialogHTML += '	<div class="checkbox" style="margin-top: 172px;"></div><div class="check-item" style="margin-top: 174px;">Create richer profiles and follow friends to find their favorite recipes</div>';
	dialogHTML += '	<div class="checkbox" style="margin-top: 207px;"></div><div class="check-item" style="margin-top: 209px;">Have deeper conversations for recipes and baking tips</div>';
	dialogHTML += '	<div class="inner" style="margin-top: 250px;"">Not yet a Baker’s Club Member? <a style="text-decoration: underline;" href="' + siteURL + '/bakers-club" title="Join the Duncan Hines Baker\'s Club">Join Now!</a></div>';
	dialogHTML += '	<div class="inner" style="margin: 302px 0px 0px 260px;""><img src="' + imagePath + '/dialogs/announce-update/hope-you-enjoy.png" width="293" height="47" alt="We hope you enjoy the new features! -The Duncan Hines Team" /></div>';
	dialogHTML += '	<div class="note inner">*Please note: you will need to re-upload a profile picture if you uploaded one in the past</div>';
	dialogHTML += '</div>';

	$("#rap").append(dialogHTML);
	var dialog = $('#dialog-announce-update');

	if (isIE6())
	{
		centerAbsoluteElement(dialog);
		$(window).resize(function(){centerAbsoluteElement(dialog);});
		$(window).scroll(function(){centerAbsoluteElement(dialog);});
	}
	else
	{
		centerFixedElement(dialog);
		$(window).resize(function(){centerFixedElement(dialog);});
	}
	
	$('.dialog .button-close').unbind();
	$('.dialog .button-close').click(function() {hideBlocker();});

	showBlocker();
}



function displayPhoto(src)
{
	if ($('#dialog-photo-viewer').length > 0) $('#dialog-photo-viewer').remove();
	
	$("div#rap").before('<div id="dialog-photo-viewer" class="dialog"><img src="' + src + '" /></div>');
	
	var dialog = $('#dialog-photo-viewer');
	
	if (isIE6())
	{
		centerAbsoluteElement(dialog);
		$(window).resize(function(){centerAbsoluteElement(dialog);});
		$(window).scroll(function(){centerAbsoluteElement(dialog);});
	}
	else
	{
		centerFixedElement(dialog);
		$(window).resize(function(){centerFixedElement(dialog);});
	}
	
	$('.dialog .button-close').unbind();
	$('.dialog .button-close').click(function() {hideBlocker();});
	
	showBlocker();
}



/*****************************************************************************************************/
/*  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"
	);
	
	

}


/*****************************************************************************************************/
/*  User Login: Shows a inline dialog and updates page elements when user logs in via AJAX           */
/*****************************************************************************************************/

function showLoginBox()
{
	$.post(siteURL + '/bakers-club/ajax_login/', 
		{
			ajax: 1,
			check_login: 1
		},
		function(data)
		{
			if (data.login)
			{
				if ( ! userLoggedIn)
				{
					userLoggedIn = true;
					hideBlocker();
					updateLoginHeader(data.username, data.logouthash);
					reloadDiscussions();
				}
				
				if (callbackFunction) callbackFunction(callbackFunctionParam);
			}
			else if (data.has_error)
			{
				alert(data.error_msg);
			}
			else
			{
				// User isn't logged in, so show the login dialog box
				userLoggedIn = false;
				showBlocker();
				
				if ($('#dialog-login').length == 0)
				{
					var dialogLoginHTML = "";
					dialogLoginHTML += '<div id="dialog-login" class="dialog">';
					dialogLoginHTML += '<div class="background png32t"></div>';
					dialogLoginHTML += '<div class="button-close"></div>';
					dialogLoginHTML += '<div class="header"><img class="png32t" src="' + imagePath + '/dialogs/login/log-into-your-bakers-club-account.png" width="262" height="16" alt="Log into your Baker\'s Club account:" /></div>';
					dialogLoginHTML += '<div class="error-container"><div><span id="error-label-login" class="error-label"></span></div></div>';
					dialogLoginHTML += '<div class="username-container"><div><label>Username:</label><input class="tf-login" type="text" name="vb_login_username" maxlength="25" /></div></div>';
					dialogLoginHTML += '<div class="password-container"><div><label>Password:</label><input class="tf-login" type="password" name="vb_login_password" maxlength="20" /></div></div>';
					dialogLoginHTML += '<div class="help-text">';
					dialogLoginHTML += '	Not a member? <a href="/bakers-club" title="Sign up to The Baker\'s Club">Sign up here</a>.<br />';
					dialogLoginHTML += '	If you forgot your password, <a href="/forums/login.php?do=lostpw" title="Retreive lost password.">retreive it here</a>.';
					dialogLoginHTML += '</div>';
					dialogLoginHTML += '<div class="submit"></div>';
					dialogLoginHTML += '</div>';
					
					$("#rap").append(dialogLoginHTML);
					
					if (isIE6())
					{
						centerAbsoluteElement($('#dialog-login'));
						$(window).resize(function(){centerAbsoluteElement($('#dialog-login'));});
						$(window).scroll(function(){centerAbsoluteElement($('#dialog-login'));});
					}
					else
					{
						centerFixedElement($('#dialog-login'));
						$(window).resize(function(){centerFixedElement($('#dialog-login'));});
					}
					
					$('#dialog-login .submit').click(function() {doLogin();return false;});
					$('.dialog .button-close').click(function() {hideBlocker();});
				}
				
				$('#dialog-login').show();
				
				/*
				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();
				*/
			}
		},
		"json"
	);
}

function doLogin()
{
	var username = $.trim($('#dialog-login input[name=vb_login_username]').val());
	var password = $.trim($('#dialog-login input[name=vb_login_password]').val());
	
	if (username.length == 0 || password.length == 0)
	{
		$('#error-label-login').html('A username and password is required to log into the Baker\'s Club.');
		return false;
	}
	else
	{
		$('#error-label-login').html('');
	}
	
	if (username.length < 3)
	{
		$('#error-label-login').html('Username must be at least 3 characters.');
		return false;
	}
	else
	{
		$('#error-label-login').html('');
	}
	
	$.post(siteURL + '/bakers-club/ajax_login/', 
		{
			ajax:     1,
			do_login: 1,
			username: username,
			password: password
		},
		function(data)
		{
			if (data.login)
			{
				userLoggedIn = true;
				hideBlocker();
				updateLoginHeader(data.username, data.logouthash);
				reloadDiscussions();
			}
			else
			{
				$('#error-label-login').html(data.error_msg);
			}
		},
		"json"
	);

	return true;
}

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>';
	
	$('#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-login').removeClass("toggle-login-box");
	$('#header .tab-login').html(html);
}



/*****************************************************************************************************/
/*  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();
	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)
{
	// 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');
				}

				if ($('#stars-contextrating').length > 0)
				{
					$('#stars-contextrating input:radio:checked').attr('checked', false);
					$('#stars-contextrating input:radio[value=' + newRating + ']').attr('checked', true);
					starsRefresh('contextrating');
				}

				$('#content-info-rating').html(data.rating_html);
			}
		},
		"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);
}

/*****************************************************************************************************/
/*  Registration Functions: Allows registration through an inline Dialog.  Currently disabled.       */
/*****************************************************************************************************/

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;
}



/*****************************************************************************************************/
/*  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);
}


/*
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;
	}
}
*/

