(function($) {
	// static constructs
	$.tools = $.tools || {version: {}};

	$.tools.version.manager_blog_comment = '1.0';

	var current = null;

	// constructor
	function MANAGER_BLOG_COMMENT(container, conf) {
		// current instance
		var self = this;
		if(!current) { current = self; }

		// generic binding function
		function bind(name, fn){
			$(self).bind(name, function(e, args){
				if(fn && fn.call(this, args.index) === false && args) {
					args.proceed = false;
				}
			});
			
			return self;
		}

		// bind all callbacks from configuration
		$.each(conf, function(name, fn){
			if ($.isFunction(fn)) {
				bind(name, fn);
			}
		});

		// Children

		// Properties

		// Selection

		// Attributes

		/* ----------------- */
		/*   API Functions   */
		/* ----------------- */

		$.extend(self, {
			// Accessors
			getId: function() {
				return $(container).attr("id");	
			},

			// COMMENT FORM MODIFIERS
			expandCommentForm: function() {
				var formtag        = $("form",container);
				var commentDiv     = $("[name='commentform_div']",formtag);
				var commentTL      = $("[name='commentform_tl']",formtag);
				var commentTRLeft  = $("[name='commentform_tr_left']",formtag);
				var commentTRRight = $("[name='commentform_tr_right']",formtag);
				var commentBody    = $("textarea#body",formtag);

				$(commentBody).css("height",$(commentBody).attr("data-fullheight") + "px");
				$(commentDiv).css("height",$(commentDiv).attr("data-fullheight") + "px");
				$(commentTL).show();
				$(commentTRRight).show();
			},

			restoreCommentForm: function() {
				var formtag          = $("form[id^='" + self.getId() + "']",container);
				var formquote        = "";
				var addContainer     = $("[name='add']",container);
				var currentContainer = $(formtag).parents("[name='reply']::first");

				// Restore Original Position
				if(currentContainer.length > 0) {
					$("input#replyId",formtag).remove();
					$(addContainer).html(currentContainer.html());
					$(currentContainer).html("");
				}

				// New Form Tag
				formtag   = $("form[id^='" + self.getId() + "']",container);
				formquote = $("[name='quote']",formtag);

				var formtitle      = $("[name='title']",formtag);
				var errorDiv       = $("div[name='errormessage']",formtag);
				var commentDiv     = $("[name='commentform_div']",formtag);
				var commentTL      = $("[name='commentform_tl']",formtag);
				var commentTRLeft  = $("[name='commentform_tr_left']",formtag);
				var commentTRRight = $("[name='commentform_tr_right']",formtag);
				var commentBody    = $("textarea#body",formtag);

				$(formtitle).html("Leave a Comment");
				$(formquote).hide();
				$(errorDiv).hide();
				$("input#include_quote",formtag).removeAttr("checked");
				$(commentBody).css("height",$(commentBody).attr("data-minheight") + "px");
				$(commentDiv).css("height",$(commentDiv).attr("data-minheight") + "px");
				$(commentTL).hide();
				$(commentTRRight).hide();
			},

			// Begin Reply
			beginReply: function(cid) {
				var formtag          = $("form[id^='" + self.getId() + "']",container);
				var formtitle        = $("[name='title']",formtag);
				var formquote        = $("[name='quote']",formtag);
				var errorDiv         = $("div[name='errormessage']",formtag);
				var currentContainer = $(formtag).parents("[name='reply']::first");
				var targetContainer  = $(container).find("div[id$='_" + cid + "'] > [name='reply']");

				// If the target container has a form in it, assume it's The Form.
				if($(targetContainer).children("form").length > 0) {
					return true;
				}

				// If not replying, we must be in the add container.
				if(currentContainer.length == 0) {
					currentContainer = $(formtag).parents("[name='add']::first");
				}

				// Remove Existing Reply ID
				$("input#replyId",formtag).remove();

				$(formtag).prepend("<INPUT TYPE='hidden' NAME='replyId' ID='replyId' VALUE='" + cid + "'>");

				$(formtitle).html("Post Your Reply");
				$(formquote).show();
				$(errorDiv).hide();
				$(targetContainer).html(currentContainer.html());
				$(currentContainer).html("");
				$(targetContainer).show();

				// Get New Form Tag
				formtag = $("form[id^='" + self.getId() + "']",container);

				// Check off Include Quote
				$("input#include_quote",formtag).attr("checked","checked");

				// Auto-Expand Form
				self.expandCommentForm();
			},

			// PROCESS FUNCTIONS
			// Refreshes Comment List
			doRefresh: function() {
				var link       = "http://" + CGI["http_host"] + "/templates/blog/_remote/comment.cfm/mode/list"
				var params     = "json=1&postid=" + conf.postid;
				var page       = 1;
				var messageDiv = $("div[name='loadmessage']",loadDiv);
				var loadDiv    = $("div[name='loading']",container);
				var contentDiv = $("div[name='content']",container);

				$(messageDiv).html("Please wait, fetching comments...");
				$(loadDiv).show();
				$(contentDiv).hide();

				if(arguments.length > 0) {
					page   = arguments[0];
					params = self.paramAppend(params,"page",page);
				}

				if(conf.remote == 1) {
					params = self.paramAppend(params,"remote",conf.remote);
					params = self.paramAppend(params,"accountid",conf.accountid);
					params = self.paramAppend(params,"scriptid",conf.scriptid);
					params = self.paramAppend(params,"callerdomain",conf.callerdomain);
				}

				params = self.paramAppend(params,"format","json");
				params = self.paramAppend(params,"jsoncallback","?");

				$.getJSON(link, params, function(json) {
					if(json.recordcount > 0) {
						$(loadDiv).hide();
						$(contentDiv).html(json.data.content[0]).show();
					} else {
						alert("There was an error refreshing the comments. Please refresh the page.");
						$(loadDiv).hide();
						$(contentDiv).show();
					}
				});
			},

			// Post Comment
			doPost: function() {
				var formtag    = $("form[id^='" + self.getId() + "']",container);
				var link       = "http://" + CGI["http_host"] + "/templates/blog/_remote/comment.cfm/mode/post";
				var params     = "json=1";
				var loadDiv    = $("div[name='loading']",container);
				var contentDiv = $("div[name='content']",container);
				var messageDiv = $("div[name='loadmessage']",loadDiv);
				var errorDiv   = $("div[name='errormessage']",formtag);
				var submitBtn  = $("input#submit_btn",formtag);
				var cancelBtn  = $("input#cancel_btn",formtag);

				$(submitBtn).attr("disabled",true).css("cursor","default").animate({opacity:0.4},"fast");
				$(cancelBtn).attr("disabled",true).css("cursor","default").animate({opacity:0.4},"fast");

				// Form Elements
				var replyId      = self.getFieldValue("replyId",formtag);
				var emailaddress = self.getFieldValue("emailAddress",formtag);
				var password     = self.getFieldValue("password",formtag);
				var remember     = self.getFieldValue("remember",formtag);
				var body         = self.getFieldValue("body",formtag);

				if(body == "") {
					$(errorDiv).html("You must type something in the comment box.").show();
					$(submitBtn).attr("disabled",false).css("cursor","pointer").animate({opacity:1},"fast");
					$(cancelBtn).attr("disabled",false).css("cursor","pointer").animate({opacity:1},"fast");
					return false;
				}

				// Required Params
				params = self.paramAppend(params,"postId",conf.postid);
				params = self.paramAppend(params,"body",escape(body));

				// Optional Params
				if(replyId != "") {
					params = self.paramAppend(params,"replyId",replyId);
					params = self.paramAppend(params,"include_quote",$("input#include_quote:checked").length > 0 ? $("input#include_quote:checked").val() : 0);
				}
				if(emailaddress != "") { params = self.paramAppend(params,"emailaddress",escape(emailaddress)); }
				if(password != "") { params = self.paramAppend(params,"password",escape(password)); }
				if(remember != "") { params = self.paramAppend(params,"remember",remember); }

				if(conf.remote == 1) {
					params = self.paramAppend(params,"accountid",conf.accountid);
					params = self.paramAppend(params,"scriptid",conf.scriptid);
					params = self.paramAppend(params,"callerdomain",conf.callerdomain);
				}

				params = self.paramAppend(params,"format","json");
				params = self.paramAppend(params,"jsoncallback","?");

				$.getJSON(link, params, function(json) {
					if(json.recordcount > 0) {
						var DoCommit   = json.data.docommit[0];
						var definition = json.data.definition[0];

						if(DoCommit == true) {
							$(messageDiv).html(definition);
							$(loadDiv).show();
							$(contentDiv).hide();

							// Now to Refresh Comments
							setTimeout(function() {
								self.doRefresh();
							},2000);
						} else {
							$(errorDiv).html(definition).show();
							$(submitBtn).attr("disabled",false).css("cursor","pointer").animate({opacity:1},"fast");
							$(cancelBtn).attr("disabled",false).css("cursor","pointer").animate({opacity:1},"fast");
						}
					} else {
						$(errorDiv).html("There was an error. Please refresh the page.").show();
						$(submitBtn).attr("disabled",false).css("cursor","pointer").animate({opacity:1},"fast");
						$(cancelBtn).attr("disabled",false).css("cursor","pointer").animate({opacity:1},"fast");
					}
				});
			},

			// Restore Comment
			doRestore: function(cid) {
				var link       = "http://" + CGI["http_host"] + "/templates/blog/_remote/comment.cfm/mode/restore";
				var params     = "json=1";
				var loadDiv    = $("div[name='loading']",container);
				var contentDiv = $("div[name='content']",container);
				var messageDiv = $("div[name='loadmessage']",loadDiv);
				var doprocess  = confirm("Are you sure you want to restore this comment? It will be displayed to everyone.");

				if(doprocess == true) {
					$(messageDiv).html("Please wait. Performing Operation...");
					$(loadDiv).show();
					$(contentDiv).hide();

					// Required Params
					params = self.paramAppend(params,"id",cid);

					$.getJSON(link, params, function(json) {
						if(json.recordcount > 0) {
							var DoCommit   = json.data.docommit[0];
							var definition = json.data.definition[0];

							if(DoCommit == true) {
								$(messageDiv).html(definition);

								// Now to Refresh Comments
								setTimeout(function() {
									self.doRefresh();
								},2000);
							} else {
								alert(definition);
								$(loadDiv).hide();
								$(contentDiv).show();
							}
						} else {
							alert("The operation could not be completed. If this occurs frequently, please contact support.");
							$(loadDiv).hide();
							$(contentDiv).show();
						}
					});
				}
			},

			// Delete Comment
			doDelete: function(cid) {
				var link       = "http://" + CGI["http_host"] + "/templates/blog/_remote/comment.cfm/mode/delete";
				var params     = "json=1";
				var loadDiv    = $("div[name='loading']",container);
				var contentDiv = $("div[name='content']",container);
				var messageDiv = $("div[name='loadmessage']",loadDiv);
				var doprocess  = confirm("Are you sure you want to delete this comment?");

				if(doprocess == true) {
					$(messageDiv).html("Please wait. Performing Operation...");
					$(loadDiv).show();
					$(contentDiv).hide();

					// Required Params
					params = self.paramAppend(params,"id",cid);

					$.getJSON(link, params, function(json) {
						if(json.recordcount > 0) {
							var DoCommit   = json.data.docommit[0];
							var definition = json.data.definition[0];

							if(DoCommit == true) {
								$(messageDiv).html(definition);

								// Now to Refresh Comments
								setTimeout(function() {
									self.doRefresh();
								},2000);
							} else {
								alert(definition);
								$(loadDiv).hide();
								$(contentDiv).show();
							}
						} else {
							alert("The operation could not be completed. If this occurs frequently, please contact support.");
							$(loadDiv).hide();
							$(contentDiv).show();
						}
					});
				}
			},

			// Approve Comment
			doApprove: function(cid) {
				var link       = "http://" + CGI["http_host"] + "/templates/blog/_remote/comment.cfm/mode/approve";
				var params     = "json=1";
				var loadDiv    = $("div[name='loading']",container);
				var contentDiv = $("div[name='content']",container);
				var messageDiv = $("div[name='loadmessage']",loadDiv);
				var doprocess  = confirm("Are you sure you want to approve this comment? It cannot be reversed.");

				if(doprocess == true) {
					$(messageDiv).html("Please wait. Performing Operation...");
					$(loadDiv).show();
					$(contentDiv).hide();

					// Required Params
					params = self.paramAppend(params,"id",cid);

					$.getJSON(link, params, function(json) {
						if(json.recordcount > 0) {
							var DoCommit   = json.data.docommit[0];
							var definition = json.data.definition[0];

							if(DoCommit == true) {
								$(messageDiv).html(definition);

								// Now to Refresh Comments
								setTimeout(function() {
									self.doRefresh();
								},2000);
							} else {
								alert(definition);
								$(loadDiv).hide();
								$(contentDiv).show();
							}
						} else {
							alert("The operation could not be completed. If this occurs frequently, please contact support.");
							$(loadDiv).hide();
							$(contentDiv).show();
						}
					});
				}
			},

			// Helper Functions
			paramAppend: function(str,pname,pval) {
				str   = $.trim(str);
				pname = $.trim(pname);

				if(typeof pval == "string") {
					pval = $.trim(pval);
				}

				if(str == "") {
					str = "?" + pname + "=" + pval;
				} else {
					str = str + "&" + pname + "=" + pval;
				}

				return str;
			},

			getFieldValue: function(fid,formtag) {
				var f = $("[name='" + fid + "']", formtag);
				var v = "";

				if(f.length > 0) {
					if(f.length > 1) {
						f.each(function() {
							if(v == "") {
								v = $(this).val();
							} else {
								v = v + "," + $(this).val();
							}
						});
					} else {
						v = f.val();
					}
				} else {
					v = "";
				}

				return v;
			}
		});

		// Initialize Form
		var init = function() {
			var formtag = $("form[id^='" + self.getId() + "']",container);

			$("#emailAddress",formtag).val("Email Address");
			$("#password",formtag).val("Password");
			$("#remember",formtag).attr("checked","checked");
			$("textarea#body",formtag).val("");
			$("input#submit_btn",formtag).removeAttr("disabled");
			$("input#cancel_btn",formtag).removeAttr("disabled");
			$("input#include_quote",formtag).removeAttr("checked");
		}

		init();
	}

	// $ plugin implementation
	$.fn.manager_blog_comment = function(conf) {
		// already constructed --> return API
		var el = this.eq(typeof conf == 'number' ? conf : 0).data("manager_blog_comment");
		if(el) { return el; }

		var opts = {
			remote: 0,
			postid: 0,
			accountid: 0,
			scriptid: "",
			callerdomain: ""
		};

		$.extend(opts, conf);

		if(opts.postid == 0) {
			alert("There was an error. Please refresh the page.")
		}

		this.each(function() {
			el = new MANAGER_BLOG_COMMENT($(this), opts);
			$(this).data("manager_blog_comment", el);
		});

		return opts.api ? el: this;
	};
})(jQuery);