var global_reviews_array = new Array();
function GetReviewController(review_id)
{
	if(!(global_reviews_array[review_id]))
	{
		global_reviews_array[review_id] = new ReviewController(review_id);
	}
	
	return(global_reviews_array[review_id]);
}

function ReviewController(review_id)
{
	var MAX_REVIEW_LENGTH		= 4096;
	var MAX_RESPONSE_LENGTH		= 4096;

	var review_response = null;
	var in_transition = false;
	var helpfulness = null;

	this.GetResponseController = function()
	{
		if(review_response == null)
		{
			review_response = new ResponseController();
		}

		return(review_response);
	}

	this.GetHelpfulness = function()
	{
		if(helpfulness == null)
		{
			helpfulness = new HelpfulnessController();
		}

		return(helpfulness);
	}

	function ResponseController()
	{
		var AJAX_RESPOND_PAGE = "/ajax/reviewrespond.php";
		var OPEN_LINK_TEXT = "cancel";
		
		var postbutton = new Button("postbutton" + review_id);
		
		// For writing the response
		var response_window = new WindowDisplayer("review_response_" + review_id, null, OPEN_LINK_TEXT);

		// For displaying the response
		var response_display_window = null;

		// This changes the "Leave a response" to an animated "Saving response"
		var header_animator = new HeaderAnimator("response_" + review_id, "Saving Response");
		
		// This is the animated dot "Deleting" text for when they delete a response
		var delete_animator = null;

		// This will get filled on a successful response submit/edit when the server respondss
		var response_html = null;

		this.Toggle = function()
		{		
			var textarea_id = "response" + review_id;
			
			if(response_window.IsOpen())
			{
				StopCharsRemaining(textarea_id);
			}
			else
			{
				CheckCharsRemaining(textarea_id, MAX_RESPONSE_LENGTH);
			}
			
			if(HasResponse())
			{
				if(response_window.IsOpen())
				{
					var func = function() {
						GetResponse().Open(RenderHacks);
					};
					response_window.Toggle(func);
				}
				else
				{
					var func = function() {
						response_window.Toggle(RenderHacks);
					};
					GetResponse().Close(func);
				}
			}
			else
			{
				response_window.Toggle(RenderHacks);
			}
		}

		this.Save = function()
		{
			if(in_transition)
			{
				return;
			}

			var body_element = document.getElementById("response" + review_id);
			if(body_element.value.length == 0)
			{
				alert("You can't write a blank response. If you want to close this response form, click \"cancel\" above.");
				return;
			}

			in_transition = true;

			var params = new Array();
			params["review_id"] = review_id;
			params["response"] = body_element.value;

			// Kick off our animations and what not.
			StartAnimation();

			var ajax = new AjaxRequest(AJAX_RESPOND_PAGE);
			ajax.Send(params, HandleResponse, HandleError);
		}
		
		this.Delete = function()
		{
			if(confirm("Are you sure you want to delete this response?  This is permanent."))
			{
				in_transition = true;
				
				var params = new Array();
				params["review_id"] = review_id;
				params["delete"] = 1;
				
				GetDeleteAnimator().Start("Deleting response");
				
				var ajax = new AjaxRequest(AJAX_RESPOND_PAGE);
				ajax.Send(params, HandleDeleteResponse, HandleDeleteError);
			}
		}

		function HandleResponse(response)
		{
			in_transition = false;
			StopCharsRemaining("response" + response.GetField("review_id"));
			response_html = response.GetField("response");
			response_window.Close(AddResponseHTML);
		}

		function HandleError()
		{
			in_transition = false;
			StopAnimation();
		}
		
		function HandleDeleteResponse(response)
		{
			var func = function()
			{
				GetDeleteAnimator().Stop();
				
				// The response is just hidden in the HTML at this point - we need to actually get rid of it
				var response_element = document.getElementById("actual_response_" + review_id);
				response_element.parentNode.removeChild(response_element);
			
				// Plop in our new activity links (moderate/respond/etc)
				var activity_links_wrapper = document.getElementById("activity_links_" + review_id + "_wrapper");
				activity_links_wrapper.innerHTML = response.GetField("activity_links");
				
				// Clear out the textarea
				document.getElementById("response" + review_id).value = "";
				
				RenderHacks();
			
				in_transition = false;
			};
				
			if(GetResponse().IsOpen())
			{				
				// All the stuff above will run once the response disappears
				GetResponse().Close(func);
			}
			else
			{
				response_window.Close(func);
			}
		}
		
		function HandleDeleteError()
		{
			in_transition = false;
			GetDeleteAnimator().Stop();
		}

		function StartAnimation()
		{
			postbutton.Disable("Respond!");
			header_animator.Start();
		}

		function StopAnimation()
		{
			postbutton.Enable();
			header_animator.Stop();
		}
		
		function HasResponse()
		{
			return(document.getElementById("actual_response_" + review_id));
		}

		function AddResponseHTML()
		{
			StopAnimation();
			
			if(HasResponse())
			{
				var old_response = document.getElementById("actual_response_" + review_id);
				old_response.parentNode.replaceChild(DOMNodeFromHTML(response_html), old_response);
			}
			else
			{
				var anchor = document.getElementById("review_response_anchor_" + review_id);
				anchor.parentNode.insertBefore(DOMNodeFromHTML(response_html), anchor.nextSibling);
			}

			ShowResponse();
			
			// Change "respond" to "edit", and add "delete"
			response_window.SetOriginalLinkText("edit");
			document.getElementById("review_response_" + review_id + "_link").innerHTML = "edit";
			document.getElementById("review_response_delete_" + review_id + "_link").style.display = "";
		}

		function RenderHacks(callback)
		{		
			// Necessary evil for IE and other stupid browsers.
			var paragraphs = null;
			var paragraph = null;

			for(var i=0; i<PageGlobals.review_ids.length; i++)
			{
				paragraph = document.getElementById("review_response_" + PageGlobals.review_ids[i]);

				if(paragraph)
				{
					paragraphs = paragraph.getElementsByTagName("p");
					AddRemoveSpace(paragraphs[0]);
				}
			}

			if(typeof callback == "function")
			{
				callback();
			}
		}
		
		function GetResponse()
		{
			if(response_display_window == null)
			{
				response_display_window = new WindowDisplayer("actual_response_" + review_id);
				response_display_window.SetOffsetHack(10);
			}
			
			return(response_display_window);
		}
		
		function ShowResponse()
		{
			GetResponse().Open(RenderHacks);
		}
		
		function HideResponse()
		{
			GetResponse().Close(RenderHacks);
		}
		
		function GetDeleteAnimator()
		{
			if(delete_animator == null)
			{
				delete_animator = new DotAnimatedText("review_activity_" + review_id, "working");
			}
			
			return(delete_animator);
		}
		
		/*
		function ResponseBox()
		{
			var response_window = new WindowDisplayer("actual_response_" + review_id);
			response_window.SetOffsetHack(10);

			this.Show = function()
			{
				response_window.Open(RenderTheseHacks);
			}

			function RenderTheseHacks()
			{
//				RenderHacks(ClearOtherTextareas);
				RenderHacks();
			}

			function ClearOtherTextareas()
			{
				var textarea_element;

				// When the textarea goes away, firefox (and possibly other browsers) tends to bump whatever was
				// in the one above to the one below. Let's put a stop to that.
				for(var i=0; i<PageGlobals.review_ids.length; i++)
				{
					textarea_element = document.getElementById("response" + PageGlobals.review_ids[i]);

					if(textarea_element)
					{
						textarea_element.value = "";
					}
				}
			}
		}
		*/
	}

	function HelpfulnessController()
	{
		var AJAX_HELPFULNESS_PAGE = "/ajax/reviewhelpfulness.php";
		
		// Our types...
		var TYPE_YES = "y";
		var TYPE_NO = "n";
		var TYPE_ABUSIVE = "x";
		
		var judgement = null;
		
		this.Yes = function()
		{
			judgement = TYPE_YES;
			Save();
		}
		
		this.No = function()
		{
			judgement = TYPE_NO;
			Save();
		}
		
		this.Abusive = function()
		{
			judgement = TYPE_ABUSIVE;
			Save();
		}
		
		function Save()
		{
			if(!(user_logged_in))
			{
				alert("You must log in (at the top of the page) to rate reviews.");
				return;
			}
			
			document.getElementById("helpful_header_" + review_id).className = "voted";
			SetHelpfulButton(TYPE_YES);
			SetHelpfulButton(TYPE_NO);
			SetHelpfulButton(TYPE_ABUSIVE);
			
			var params = new Array();
			params["review_id"] = review_id;
			params["helpfulness"] = judgement;

			var ajax = new AjaxRequest(AJAX_HELPFULNESS_PAGE);
			ajax.Send(params, Nothing);
		}
		
		function Nothing(request)
		{
			// We're not going to worry about providing feedback here - hence the name.
		}
		
		function SetHelpfulButton(type)
		{
			var element = document.getElementById("helpful_" + type + "_" + review_id);
			if(type == judgement)
			{
				element.innerHTML = "<span>Voted up.</span>";
			}
			else
			{
				element.innerHTML = "";
			}
		}
	}
}