/* $Id: hover_menu.js 613 2009-11-21 00:37:07Z rfludwick $ */

/**
 * OMGN comments
 */
var OMGNComments =
{
	/**
	 * Facebook enabled
	 */
	facebook_enabled : false,

	/**
	 * Initializes the comments
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param facebook_enabled A flag for if Facebook's Open Graph is enabled
	 * @return void
	 */
	init : function(facebook_enabled)
	{
		if (facebook_enabled)
		{
			this.facebook_enabled = true;
		}

		// Form submission
		var form = $("comment_form");

		if (form)
		{
			form.observe("submit", this.post.bind(this));
		}

		// Edit comments
		var edit_comments = $$("a.edit_comment");

		edit_comments.each(function(item)
		{
			item.observe("click", this.showEdit.bind(this));
		}.bind(this));

		// Delete comments
		var delete_comments = $$("a.delete_comment");

		delete_comments.each(function(item)
		{
			item.observe("click", this.deleteComment.bind(this));
		}.bind(this));
	},

	/**
	 * Posts a comment
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event, if there is one
	 * @return void
	 */
	post : function(event)
	{
		var comment = $F("comment"),
			article_id = $("article_id"),
			blog_post_id = $("blog_post_id"),
			submit = $("submit");

		// Data validation
		if (!comment.length)
		{
			OMGNOverlay.showError("You cannot submit a blank comment.");
		}
		else if ((article_id || blog_post_id) && submit)
		{
			var parameters = new Hash(),
				comment_form_div = $("comment_form_div");

			parameters.set("comment", comment);

			if (article_id)
			{
				parameters.set("article_id", $F(article_id));
			}
			else
			{
				parameters.set("blog_post_id", $F(blog_post_id));
			}

			submit.disable();

			if (comment_form_div)
			{
				OMGNAjaxBase.fadeElement(comment_form_div);
			}

			// Make the Ajax request
			OMGNAjaxBase.showProcessing();

			new Ajax.Request("/ajax/comments/post",
			{
				method : "post",
				parameters : parameters,
				onFailure : function()
				{
					submit.enable();

					if (comment_form_div)
					{
						OMGNAjaxBase.unfadeElement(comment_form_div);
					}

					OMGNAjaxBase.hideProcessing();

					OMGNAjaxBase.showError();
				}.bind(this),
				onSuccess : function(request)
				{
					submit.enable();

					if (comment_form_div)
					{
						OMGNAjaxBase.unfadeElement(comment_form_div);
					}

					OMGNAjaxBase.hideProcessing();

					// Check for some sort of error
					if (!request.responseText.isJSON())
					{
						OMGNAjaxBase.showError();
					}
					else
					{
						var results = request.responseText.evalJSON(true);

						if (results["error"])
						{
							OMGNAjaxBase.showError(results["error"]);
						}
						else
						{
							// Clear the contents?
							var content_comments = $("content_comments"),
								descendants = content_comments.descendants();

							if ((descendants.size() == 1) && (descendants[0].hasClassName("print_hide")))
							{
								content_comments.update();
							}

							// Clear the contents, show the comment
							$("comment").clear();

							content_comments.insert({
								"top" : "<div>" +
									"<p>" +
									(results["user_avatar_src"] ? '<a href="/user/details/' + results["username"] + '" title="' + results["username"] + '"><img src="' + results["user_avatar_src"] + '" width="' + results["user_avatar_width"] + '" height="' + results["user_avatar_height"] + '" alt="' + results["username"] + '" title="' + results["username"] + '" class="user_avatar_standard_float" /></a>' : "") +
									'<a href="/user/details/' + results["username"] + '" title="' + results["username"] + '">' + results["username"] + '</a> - ' + results["date_created"] + '<span class="comment_controls" id="comment_controls_"' + results["comment_id"] + '> &nbsp; [ ' + (results["is_moderator"] ? '<a href="#" title="Block Comment" class="block_comment ' + results["type"] + '" id="block_comment_' + results["comment_id"] + '" id="block_comment_' + results["comment_id"] + '">Block Comment</a>' : "") + '<span id="edit_comment_wrap_' + results["comment_id"] + '">' + (results["is_moderator"] ? " | " : "") + '<a href="#" title="Edit Comment" class="edit_comment article" id="edit_comment_' + results["comment_id"] + '">Edit Comment</a></span><span id="delete_comment_wrap_' + results["comment_id"] + '"> | <a href="#" title="Delete Comment" class="delete_comment article" id="delete_comment_' + results["comment_id"] + '">Delete Comment</a></span> ]</span>' +
									"</p>" +
									'<div id="comment_' + results["comment_id"] + '">' +
									"<p>" + results["comment"] + "</p>" +
									'<div class="clear"></div>' +
									"</div>" +
									"</div>"
							});

							// Event handlers
							$("edit_comment_" + results["comment_id"]).observe("click", this.showEdit.bind(this));
							$("delete_comment_" + results["comment_id"]).observe("click", this.deleteComment.bind(this));

							if (results["is_moderator"])
							{
								$("block_comment_" + results["comment_id"]).observe("click", OMGNCommentsAdmin.blockComment.bind(OMGNCommentsAdmin));
							}

							// Hide controls after 120 seconds
							setTimeout(function()
							{
								var block_comment = $("block_comment_" + results["comment_id"]);

								if (block_comment)
								{
									var delete_comment = $("delete_comment_wrap_" + results["comment_id"]);

									if (delete_comment)
									{
										delete_comment.remove();
									}
								}
								else
								{
									var comment_controls = $("comment_controls_" + results["comment_id"]);

									if (comment_controls)
									{
										comment_controls.remove();
									}
								}
						   	}.bind(this), 120000);

							// Open Graph?
							if (this.facebook_enabled)
							{
								var parameters = new Hash();

								if (article_id)
								{
									parameters.set("article_id", $F(article_id));
								}
								else
								{
									parameters.set("blog_post_id", $F(blog_post_id));
								}

								new Ajax.Request("/ajax/social/facebook/open-graph/comment-on",
								{
									method : "post",
									parameters : parameters
								});
							}
						}
					}
				}.bind(this)
			});
		}

		if (event)
		{
			Event.stop(event);
		}
	},

	/**
	 * Shows the edit overlay for a comment
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event
	 * @return void
	 */
	showEdit : function(event)
	{
		// Get the comment ID
		var comment_id = event.element().identify().match(/^edit_comment_(\d+)$/)[1];

		// Build the content
		var content = '<form id="ajax_edit_comment">' +
			'<div class="form edit_comment" id="edit_comment_div">' +
			"<ul>" +
			"<li>" +
			'<label for="comment" class="required">Comment:</label>' +
			"</li>" +
			"<li>" +
			'<textarea name="overlay_comment" id="overlay_comment" class="comment" rows="1" cols="1">' + OMGNAjaxBase.stripHTMLTags($("comment_" + comment_id).innerHTML).strip() + '</textarea>' +
			"</li>" +
			"<li>" +
			required_fields +
			'<input type="hidden" name="overlay_comment_id" id="overlay_comment_id" value="' + comment_id + '" /><input type="submit" name="edit_comment" id="edit_comment" value="Edit Comment" /> <input type="button" name="edit_comment_close" id="edit_comment_close" value="Close" />' +
			"</li>" +
			"</ul>" +
			"</div>" +
			"</form>";

		// Write the overlay
		OMGNOverlay.write(content, "edit_comment");

		// Attach event listeners
		OMGNOverlay.attachClickClose($A([
			"edit_comment_close"
		]));

		$("ajax_edit_comment").observe("submit", this.editComment.bind(this));
		$("edit_comment").observe("click", this.editComment.bind(this));

		// Stop
		Event.stop(event);
	},

	/**
	 * Edits a comment
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event
	 * @return void
	 */
	editComment : function(event)
	{
		var comment = $F("overlay_comment"),
			comment_id = $F("overlay_comment_id"),
			article_id = $("article_id"),
			blog_post_id = $("blog_post_id"),
			edit_comment_div = $("edit_comment_div");

		// Data validation
		if (!comment.length)
		{
			alert("You must enter a comment.");
		}
		else if (edit_comment_div)
		{
			var parameters = new Hash(),
				overlay_close = $("overlay_close");

			parameters.set("comment", comment);
			parameters.set("comment_id", comment_id);
			parameters.set("content_type", (article_id ? "article" : "blog_post"));

			OMGNOverlay.removeClickClose($A([
				"overlay_close"
			]));

			OMGNAjaxBase.fadeElement(edit_comment_div);

			if (overlay_close)
			{
				OMGNAjaxBase.fadeElement(overlay_close);
			}

			// Make the Ajax request
			OMGNAjaxBase.showProcessing();

			new Ajax.Request("/ajax/comments/edit",
			{
				method : "post",
				parameters : parameters,
				onFailure : function()
				{
					OMGNOverlay.attachClickClose($A([
						"overlay_close"
					]));

					this.insertError(OMGNAjaxBase.default_error + " " + OMGNAjaxBase.contact_link);

					OMGNAjaxBase.unfadeElement(edit_comment_div);

					if (overlay_close)
					{
						OMGNAjaxBase.unfadeElement(overlay_close);
					}

					OMGNAjaxBase.hideProcessing();
				}.bind(this),
				onSuccess : function(request)
				{
					OMGNOverlay.attachClickClose($A([
						"overlay_close"
					]));

					OMGNAjaxBase.hideProcessing();

					OMGNAjaxBase.unfadeElement(edit_comment_div);

					if (overlay_close)
					{
						OMGNAjaxBase.unfadeElement(overlay_close);
					}

					// Check for some sort of error
					if (!request.responseText.isJSON())
					{
						this.insertError(OMGNAjaxBase.default_error + " " + OMGNAjaxBase.contact_link);
					}
					else
					{
						var results = request.responseText.evalJSON(true);

						if (results["error"])
						{
							this.insertError(results["error"]);
						}
						else
						{
							var comment = $("comment_" + comment_id);

							if (comment)
							{
								comment.update(results["comment"] +
									'<div class="clear"></div>');
							}

							OMGNOverlay.remove();
						}
					}
				}.bind(this)
			});
		}

		// Stop
		Event.stop(event);
	},

	/**
	 * Inserts an error
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param error The error message
	 * @return void
	 */
	insertError : function(error)
	{
		var edit_comment_div = $("edit_comment_div");

		if (edit_comment_div)
		{
			var overlay_error = $("overlay_error"),
				content = '<div class="error after" id="overlay_error">' + error + "</div>";

			if (overlay_error)
			{
				overlay_error.update(content);
			}
			else
			{
				edit_comment_div.insert({
					top : content
				});
			}
		}
	},

	/**
	 * Deletes a comment
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event
	 * @return void
	 */
	deleteComment : function(event)
	{
		// Prep
		var parameters = new Hash(),
			element = event.element(),
			id = element.identify().match(/^delete_comment_(\d+)$/)[1],
			content_type = null;

		if (element.hasClassName("article"))
		{
			content_type = "article";
		}
		else
		{
			content_type = "blog_post";
		}

		parameters.set("comment_id", id);
		parameters.set("content_type", content_type);

		OMGNAjaxBase.fadeElement(element);

		// Mark read
		OMGNAjaxBase.showProcessing();

		new Ajax.Request("/ajax/comments/delete",
		{
			method : "post",
			parameters : parameters,
			onFailure : function()
			{
				OMGNAjaxBase.unfadeElement(element);

				OMGNAjaxBase.hideProcessing();

				OMGNAjaxBase.showError();
			}.bind(this),
			onSuccess : function(request)
			{
				OMGNAjaxBase.unfadeElement(element);

				OMGNAjaxBase.hideProcessing();

				// Check for some sort of error
				if (!request.responseText.isJSON())
				{
					OMGNAjaxBase.showError();
				}
				else
				{
					var results = request.responseText.evalJSON(true);

					if (results["error"])
					{
						OMGNAjaxBase.showError(results["error"]);
					}
					else
					{
						// Great success
						var comment = $("comment_" + id),
							comment_controls = $("comment_controls_" + id);

						if (comment)
						{
							comment.update('<p class="comment_inaccessible">' +
								"This comment has been deleted by its author." +
								"</p>" +
								'<div class="clear"></div>');
						}

						if (comment_controls)
						{
							comment_controls.remove();
						}

						OMGNOverlay.showSuccess("Comment successfully deleted.");
					}
				}
			}.bind(this)
		});

		// Stop
		Event.stop(event);
	}
};
