Create new scopes to not lose the element we’re unmarking.
[Sone.git] / src / main / resources / static / javascript / sone.js
index 8a64118..e7d19e6 100644 (file)
@@ -69,6 +69,7 @@ function addCommentLink(postId, element) {
        }
        commentElement = (function(postId) {
                var commentElement = $("<div><span>Comment</span></div>").addClass("show-reply-form").click(function() {
+                       markPostAsKnown(getPostElement(this));
                        replyElement = $("#sone .post#" + postId + " .create-reply");
                        replyElement.removeClass("hidden");
                        replyElement.removeClass("light");
@@ -299,7 +300,7 @@ function getPostId(element) {
 }
 
 function getPostTime(element) {
-       return getPostElement(element).find(".storage-time").text();
+       return getPostElement(element).find(".post-time").text();
 }
 
 function getReplyElement(element) {
@@ -311,7 +312,7 @@ function getReplyId(element) {
 }
 
 function getReplyTime(element) {
-       return getReplyElement(element).find(".storage-time").text();
+       return getReplyElement(element).find(".reply-time").text();
 }
 
 function likePost(postId) {
@@ -454,6 +455,7 @@ function ajaxifyPost(postElement) {
                postReply(postId, text, function(success, error, replyId) {
                        if (success) {
                                loadNewReply(replyId);
+                               markPostAsKnown(getPostElement(inputField));
                                $("#sone .post#" + postId + " .create-reply").addClass("hidden");
                        } else {
                                alert(error);
@@ -473,10 +475,12 @@ function ajaxifyPost(postElement) {
        /* convert all “like” buttons to javascript functions. */
        $(postElement).find(".like-post").submit(function() {
                likePost(getPostId(this));
+               markPostAsKnown(getPostElement(this));
                return false;
        });
        $(postElement).find(".unlike-post").submit(function() {
                unlikePost(getPostId(this));
+               markPostAsKnown(getPostElement(this));
                return false;
        });
 
@@ -509,10 +513,12 @@ function ajaxifyPost(postElement) {
 function ajaxifyReply(replyElement) {
        $(replyElement).find(".like-reply").submit(function() {
                likeReply(getReplyId(this));
+               markPostAsKnown(getPostElement(this));
                return false;
        });
        $(replyElement).find(".unlike-reply").submit(function() {
                unlikeReply(getReplyId(this));
+               markPostAsKnown(getPostElement(this));
                return false;
        });
        (function(replyElement) {
@@ -598,7 +604,7 @@ function loadNewPost(postId) {
        $.getJSON("ajax/getPost.ajax", { "post" : postId }, function(data, textStatus) {
                if ((data != null) && data.success) {
                        var firstOlderPost = null;
-                       $("#sone #posts .post").each(function() {
+                       $("#sone .post").each(function() {
                                if (getPostTime(this) < data.post.time) {
                                        firstOlderPost = $(this);
                                        return false;
@@ -608,7 +614,7 @@ function loadNewPost(postId) {
                        if (firstOlderPost != null) {
                                newPost.insertBefore(firstOlderPost);
                        } else {
-                               $("#sone #posts .post:last").after(newPost);
+                               $("#sone #posts").append(newPost);
                        }
                        ajaxifyPost(newPost);
                        newPost.slideDown();
@@ -623,22 +629,56 @@ function loadNewReply(replyId) {
        loadedReplies[replyId] = true;
        $.getJSON("ajax/getReply.ajax", { "reply": replyId }, function(data, textStatus) {
                /* find post. */
-               $("#sone #posts .post#" + data.reply.postId).each(function() {
-                       var firstNewerReply = null;
-                       $(this).find(".replies .reply").each(function() {
-                               if (getReplyTime(this) > data.reply.time) {
-                                       firstNewerReply = $(this);
-                                       return false;
+               if ((data != null) && data.success) {
+                       $("#sone .post#" + data.reply.postId).each(function() {
+                               var firstNewerReply = null;
+                               $(this).find(".replies .reply").each(function() {
+                                       if (getReplyTime(this) > data.reply.time) {
+                                               firstNewerReply = $(this);
+                                               return false;
+                                       }
+                               });
+                               newReply = $(data.reply.html).addClass("hidden");
+                               if (firstNewerReply != null) {
+                                       newReply.insertBefore(firstNewerReply);
+                               } else {
+                                       if ($(this).find(".replies .create-reply")) {
+                                               $(this).find(".replies .create-reply").before(newReply);
+                                       } else {
+                                               $(this).find(".replies").append(newReply);
+                                       }
                                }
+                               ajaxifyReply(newReply);
+                               newReply.slideDown();
                        });
-                       newReply = $(data.reply.html);
-                       if (firstNewerReply != null) {
-                               newReply.insertAfter(firstNewerReply);
-                       } else {
-                               $(this).find(".replies .reply:last").after(newReply);
-                       }
-                       ajaxifyReply(newReply);
-               });
+               }
+       });
+}
+
+function markPostAsKnown(postElements) {
+       $(postElements).each(function() {
+               postElement = this;
+               if ($(postElement).hasClass("new")) {
+                       (function(postElement) {
+                               $.getJSON("ajax/markPostAsKnown.ajax", {"formPassword": getFormPassword(), "post": getPostId(postElement)}, function(data, textStatus) {
+                                       $(postElement).removeClass("new");
+                               });
+                       })(postElement);
+               }
+       });
+       markReplyAsKnown($(postElements).find(".reply"));
+}
+
+function markReplyAsKnown(replyElements) {
+       $(replyElements).each(function() {
+               replyElement = this;
+               if ($(replyElement).hasClass("new")) {
+                       (function(replyElement) {
+                               $.getJSON("ajax/markReplyAsKnown.ajax", {"formPassword": getFormPassword(), "reply": getReplyId(replyElement)}, function(data, textStatus) {
+                                       $(replyElement).removeClass("new");
+                               });
+                       })(replyElement);
+               }
        });
 }