var requiredElements = {};


$(document).ready(document_Ready);


var proxy_Error = function(code, msg)
{
	alert("::ERROR::\n\n" + code + "\n" + msg);
}

function document_Ready()
{
	assignRequiredElements("RegistrationFormContainer");
	assignRequiredElements("CommentsFormContainer");
	assignEventHandlers();
}

	
function dumpObject(obj)
{
	var output = "";
	for(var attr in obj)
	{
		output += "\n" + attr + " : " + obj[attr];
	}
	alert(output);
}

function assignEventHandlers()
{
	$("#Comments_Submit").click(comments_Submit);
	$(".Comments_RateUp").click(comments_RateUp);
	$(".Comments_RateDown").click(comments_RateDown);
	$(".Comments_ReportOffensiveContent").click(comments_ReportOffensiveContent);
	$(".PostCommentLink").click(comments_ShowCommentForm);
	$("#Comments_Login_Submit").click(comments_login_Submit);
	$(".LogoutLink").click(logout);
	$(".RegisterLink").click(showRegistrationForm);
	
	var bindingElements = $("*[onEnterElementsBind]");
	var boundElements = [];
	$.each(bindingElements, function()
	{
		var bindingElement = $(this);
		var triggerType = bindingElement.attr("onEnterTrigger");
		var elements = bindingElement.attr("onEnterElementsBind").split(",");
		$.each(elements, function(i, val)
		{
			$("#" + val).bind("keyup", function(){ element_OnEnter_Trigger(event,bindingElement,triggerType) });
		});
	});
}

function element_OnEnter_Trigger(event,bindingElement,triggerType)
{
	if(event.keyCode == 13) // enter
	{
		bindingElement.trigger(triggerType);
	}
}

function assignRequiredElements(formContainer)
{
	requiredElements[formContainer] = $("#" + formContainer + " input[Required=1],#"+ formContainer +" textarea[Required=1]");
	var elems = requiredElements[formContainer];
	$.each(elems, function()
	{
		$(this).parent().prev("div").children("label").before("*")
	});
	
	if(elems.length > 0)
	{
		$("#ReqFields").text("*Required Fields");
	}
}

function validateForm(form)
{
	var passed = true;
	var failedElements = [];
	var elems = requiredElements[form];
	
	$.each(elems, function()
	{
		var elem = $(this);
		if(elem.val() == "")
		{
			passed = false;
			failedElements.push(elem);
		}
		else if(elem.attr("Validate") != null)
		{
			switch(elem.attr("Validate").toLowerCase())
			{
				case "email":
					var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i ;
					if (!filter.test(elem.val()))
					{
						passed = false;
						failedElements.push(elem);
					}
				break;
				case "captcha":
					var captchaAnswer = eval( $("#captchaEquation").text() );
					var captchaHumanAnswer = $.trim( $("#Comments_Captcha").val() );
					if(captchaHumanAnswer != captchaAnswer)
					{
						var rand1 = Math.floor( Math.random() * (100 + 1) );
						var rand2 = Math.floor( Math.random() * (10 + 1) );
						$("#captchaEquation").text( rand1 + "+" + rand2 );
						$("#Comments_Captcha").val("").select();
						passed = false;
						failedElements.push( elem );
					}
				break;
			}
		}
	});
	
	if(!passed)
	{
		var output = "";
		$.each(failedElements, function()
		{
			var elem = $(this);
			if(elem.attr("Message") == null)
			{
				elem.attr("Message", "Please provide a value for " + elem.attr("Name"));
			}
			output += "\n" + elem.attr("Message");
		});
		failedElements[0].select();
		alert(output);
	}
	
	return passed;
}

function comments_Submit()
{
	if(validateForm( $(this).attr("BoundForm") ))
	{
		var author = {};
		// get form values
		author.Username = $("#Comments_Name").val();
		author.Email = $("#Comments_Email").val();
		author.Website = $("#Comments_Website").val();
		author.FollowUpNotifications = $("#Comments_FollowUpNotification").attr("checked");
		// account id exists if already logged in
		var accountID = $("#BlogAccountID").val();
		if(accountID != null)
		{
			author.BlogAccountID = accountID;
		}
		
		var comments = $("#Comments_Comments").val();
		var postID = $("#BlogPostID").val();
		
		var proxy = new BlogProxy();
		var proxy_Result = function(results)
		{
			var hrs = $("#BlogPostDelayHours").val();
			var mins = $("#BlogPostDelayMinutes").val();
			if (hrs == "0" && mins == "0")
			{
				location.reload(true);
			}
			else
			{
				alert("Comment posted successfully.");
				comments_Clear();
			}
		}
		var proxy_Error = function(code,msg)
		{
			alert("You must be logged in to post a comment.");
			alert(code + " : " + msg);
		}
		
		proxy.setCallbackHandler(proxy_Result);
		proxy.setErrorHandler(proxy_Error);
		
		proxy.PostComment(author, postID, comments);
	}
}


function comments_Clear()
{
	$("#Comments_Name").val("");
	$("#Comments_Email").val("");
	$("#Comments_Website").val("");
	
	$("#Comments_Captcha").val("")
	
	$("#Comments_Comments").val("");
	
	comments_ShowCommentForm();
}


function comments_RateUp()
{
	var commentID = $(this).attr("CommentID");
	rateComment(commentID, "up");
}

function comments_RateDown()
{
	var commentID = $(this).attr("CommentID");
	rateComment(commentID, "down");
}

function rateComment(commentID, direction)
{
	var proxy = new BlogProxy();
	var proxy_Result = function(results)
	{
		alert("Rated.");
	}
	
	proxy.setCallbackHandler(proxy_Result);
	proxy.setErrorHandler(proxy_Error);
	
	proxy.RateComment(commentID, direction);
}


function comments_ReportOffensiveContent()
{
	var commentID = $(this).attr("CommentID");
	
	var proxy = new BlogProxy();
	var proxy_Result = function(results)
	{
		alert("Report submitted successfully. Thank you.");
		if( parseInt($("#DisableCommentOnOffenseReport").val()) )
		{
			$("div[CommentID=" + commentID + "]").remove();
		}
	}
	
	proxy.setCallbackHandler(proxy_Result);
	proxy.setErrorHandler(proxy_Error);
	
	proxy.ReportOffensiveContent(commentID);
}


function comments_ShowCommentForm()
{
	var reqLogin = parseInt( $("#LoginRequired").val() );
	if(reqLogin)
	{
		showLoginForm();
		return;
	}
	var formContainer = $("#CommentsFormContainer");
	var link = $(".PostCommentLink");
	if(formContainer.css("display") == "none")
	{
		formContainer.show(350);
		link.text("[Hide comment form]");
	}
	else
	{
		formContainer.hide(350);
		link.text("[Post a comment]");
	}
	
	// if logged in, SELECT comments
	if($("#BlogAccountID").val() != -1)
	{
		setTimeout(function(){ $("#Comments_Comments").select(); }, 500);
	}
}


function showLoginForm()
{
	var regForm = $("#RegistrationFormContainer");
	var link = $(".PostCommentLink");
	if(regForm.css("display") == "none")
	{
		regForm.show(250);
		// delay select() until after animation completes
		setTimeout(function(){  $("#Comments_Login_Email").select();  }, 500);
		link.text("[Hide login form]");
	}
	else
	{
		regForm.hide(250);
		link.text("[Post a comment]");
	}
}


function comments_login_Submit()
{
	if (validateForm( $(this).attr("BoundForm") ))
	{
		var proxy = new BlogProxy();
		var proxy_Result = function(results){
			if (results) 
			{
				// results is the user's account id
				$("#BlogAccountID").val(results);
				
				$("*[AccountException=1]").remove();
				assignRequiredElements("CommentsFormContainer");
				
				// clear form
				$("#Comments_Login_Email").val("");
				$("#Comments_Login_Password").val("");
				$("#LoginRequired").val(0);
				// show comment forms
				$("#RegistrationFormContainer").hide(350);
				$("#CommentsFormContainer").show(350);
				$(".LogoutLink").show();
				$(".PostCommentLink").text("[Hide comment form]");
			}
			else 
			{
				alert("Some of your login credentials were not recognized. Please try again.");
			}
		}
		
		proxy.setCallbackHandler(proxy_Result);
		proxy.setErrorHandler(proxy_Error);
		
		proxy.Login($("#Comments_Login_Email").val(), $("#Comments_Login_Password").val());
	}
}


function logout()
{
	var proxy = new BlogProxy();
	var proxy_Result = function(results)
	{
		if(results)
		{
			//location.reload();
			$("#RegistrationFormContainer").hide(350);
			$("#CommentsFormContainer").hide(350);
			$(".LogoutLink").hide();
			$("#LoginRequired").val(1);
			$(".PostCommentLink").text("[Post a comment]");
		}
	}
	
	proxy.setCallbackHandler(proxy_Result);
	proxy.setErrorHandler(proxy_Error);
	
	proxy.Logout();
}


function showRegistrationForm()
{
	alert("Register.");
}
