+ $.getJSON("ajax/getLikes.ajax", { "type": "post", "post": postId }, function(data, textStatus) {
+ if ((data != null) && data.success) {
+ $("#sone .post#" + postId + " > .inner-part > .status-line .likes").toggleClass("hidden", data.likes == 0)
+ $("#sone .post#" + postId + " > .inner-part > .status-line .likes span.like-count").text(data.likes);
+ $("#sone .post#" + postId + " > .inner-part > .status-line .likes > span").attr("title", generateSoneList(data.sones));
+ }
+ }, function(xmlHttpRequest, textStatus, error) {
+ /* ignore error. */
+ });
+}
+
+function likeReply(replyId) {
+ $.getJSON("ajax/like.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ if ((data == null) || !data.success) {
+ return;
+ }
+ $("#sone .reply#" + replyId + " .status-line .like").addClass("hidden");
+ $("#sone .reply#" + replyId + " .status-line .unlike").removeClass("hidden");
+ updateReplyLikes(replyId);
+ }, function(xmlHttpRequest, textStatus, error) {
+ /* ignore error. */
+ });
+}
+
+function unlikeReply(replyId) {
+ $.getJSON("ajax/unlike.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ if ((data == null) || !data.success) {
+ return;
+ }
+ $("#sone .reply#" + replyId + " .status-line .unlike").addClass("hidden");
+ $("#sone .reply#" + replyId + " .status-line .like").removeClass("hidden");
+ updateReplyLikes(replyId);
+ }, function(xmlHttpRequest, textStatus, error) {
+ /* ignore error. */
+ });
+}
+
+function updateReplyLikes(replyId) {
+ $.getJSON("ajax/getLikes.ajax", { "type": "reply", "reply": replyId }, function(data, textStatus) {
+ if ((data != null) && data.success) {
+ $("#sone .reply#" + replyId + " .status-line .likes").toggleClass("hidden", data.likes == 0)
+ $("#sone .reply#" + replyId + " .status-line .likes span.like-count").text(data.likes);
+ $("#sone .reply#" + replyId + " .status-line .likes > span").attr("title", generateSoneList(data.sones));
+ }
+ }, function(xmlHttpRequest, textStatus, error) {
+ /* ignore error. */
+ });
+}
+
+/**
+ * Posts a reply and calls the given callback when the request finishes.
+ *
+ * @param postId
+ * The ID of the post the reply refers to
+ * @param text
+ * The text to post
+ * @param callbackFunction
+ * The callback function to call when the request finishes (takes 3
+ * parameters: success, error, replyId)
+ */
+function postReply(postId, text, callbackFunction) {
+ $.getJSON("ajax/createReply.ajax", { "formPassword" : getFormPassword(), "post" : postId, "text": text }, function(data, textStatus) {
+ if (data == null) {
+ /* TODO - show error */
+ return;
+ }