/**
 * Comment rating widget.
 * @author Alex Jilkin
 */
(function($)
{
	$.fn.commentrating = function(options)
	{
		function update(self, options)
		{
			var hint = options.labels.chart;

			hint = hint.replace("{rating}", (options.likes - options.dislike));
			hint = hint.replace("{l}", options.likes);
			hint = hint.replace("{d}", options.dislike);

			$(self).find(".chart *").each(function(){
				$(this).attr("title", hint);
				if($.fn.tipTip != undefined)
					$(this).tipTip({defaultPosition: 'top'});
			});

			if(options.likes > 0 || options.dislike > 0)
			{
				var total = parseInt(options.dislike) + parseInt(options.likes);
				$(self).find(".chart .likes span").css({width: Math.round((options.likes / total) * 50) + "px"});
				$(self).find(".chart .dislike span").css({width: Math.round((options.dislike / total) * 50) + "px"});
			}
		}

		options = $.extend({}, $.fn.commentrating.defaults, options);

		if(!$("body").data("social-preload"))
		{
			$("body").data("social-preload", true);
			$("body").append("<span class='comment-rating preload'><span class='loading'></span></span>");
		}

		return this.each(function(){
			$(this).html(
				"<ul class=\"comment-rating\">" +
					"<li class=\"like\"><a href=\"#\">" + options.labels.like + "</a></li>" +
					"<li class=\"chart\">" +
						"<div class=\"bar likes\"><span>&nbsp;</span></div>" +
						"<div class=\"bar dislike\"><span>&nbsp;</span></div>" +
					"</li>" +
					"<li class=\"dislike\"><a href=\"#\" class=\"tip\" title=\"" + options.labels.dislike + "\">" + options.labels.dislike + "</a></li>" +
				"</ul>"
			);

			if($.fn.tipTip != undefined)
				$('.tip', this).tipTip({defaultPosition: 'top'});

			var $this = $(this).find("ul.comment-rating");

			update($this, options);

			$this.data("options", options);
			$this.find("a").click(function (){
				var wrapper = $(this).closest("ul.comment-rating"), options = wrapper.data("options"), self = this;
				if(wrapper.data("loading"))
					return false;
				$.ajax({
					type: "post",
					data: {type: "comment", id: options.id, vote: ($(this).closest("li").hasClass("like") ? 1 : -1)},
					dataType: "json",
					beforeSend: function()
					{
						wrapper.data("loading", true);
						$(self).addClass('loading');
						return true;
					},
					complete: function()
					{
						wrapper.data("loading", false);
						$(self).removeClass('loading');
					},
					success: function(response)
					{
						if(response.success)
						{
							wrapper.data("options", $.extend(options, {
								likes: response.likes,
								dislike: response.dislike
							}));
							update(wrapper, options);
						}
						if(response.message)
						{
							if($("document").has("#dlg"))
								$("#dlg").html(response.message.replace("\n","<br />")).dialog("open");
							else if(!response.success)
								alert(response.message);
						}
					}
				});
				return false;
			});
		});
	};

	$.fn.commentrating.defaults = {
		id: 0,
		likes: 0,
		dislike: 0,
		labels: {
			"like": "I like!",
			"dislike":	"Dislike",
			"chart": "Rating: {rating} ( +{l} / -{d} )"
		}
	};

})(jQuery);
