}
function getSoneElement(element) {
- return $(element).parents(".sone");
+ return $(element).closest(".sone");
}
/**
inputField = $(this.form).find(":input:enabled").get(0);
postId = getPostId(this);
text = $(inputField).val();
- $(inputField).val("");
- postReply(postId, text, function(success, error, replyId) {
- if (success) {
- loadNewReply(replyId);
- markPostAsKnown(getPostElement(inputField));
- $("#sone .post#" + postId + " .create-reply").addClass("hidden");
- } else {
- alert(error);
- }
- });
+ (function(postId, text, inputField) {
+ postReply(postId, text, function(success, error, replyId) {
+ if (success) {
+ $(inputField).val("");
+ loadNewReply(replyId);
+ markPostAsKnown(getPostElement(inputField));
+ $("#sone .post#" + postId + " .create-reply").addClass("hidden");
+ } else {
+ alert(error);
+ }
+ });
+ })(postId, text, inputField);
return false;
});
/* mark post and all replies as known on click. */
$(replyElement).click(function() {
- markPostAsKnown(getPostElement(replyElement));
+ markPostAsKnown(getPostElement(this));
});
}
});
/* process new posts. */
$.each(data.newPosts, function(index, value) {
- loadNewPost(value);
+ loadNewPost(value.id, value.sone, value.recipient);
});
/* process new replies. */
$.each(data.newReplies, function(index, value) {
}
/**
+ * Returns the ID of the currently logged in Sone.
+ *
+ * @return The ID of the current Sone, or an empty string if no Sone is logged
+ * in
+ */
+function getCurrentSoneId() {
+ return $("#currentSoneId").text();
+}
+
+/**
* Returns the content of the page-id attribute.
*
* @returns The page ID
return getPageId() == "known-sones";
}
-var loadedPosts = {};
-var loadedReplies = {};
+/**
+ * Returns whether a post with the given ID exists on the current page.
+ *
+ * @param postId
+ * The post ID to check for
+ * @returns {Boolean} <code>true</code> if a post with the given ID already
+ * exists on the page, <code>false</code> otherwise
+ */
+function hasPost(postId) {
+ return $(".post#" + postId).length > 0;
+}
+
+/**
+ * Returns whether a reply with the given ID exists on the current page.
+ *
+ * @param replyId
+ * The reply ID to check for
+ * @returns {Boolean} <code>true</code> if a reply with the given ID already
+ * exists on the page, <code>false</code> otherwise
+ */
+function hasReply(replyId) {
+ return $("#sone .reply#" + replyId).length > 0;
+}
-function loadNewPost(postId) {
- if (postId in loadedPosts) {
+function loadNewPost(postId, soneId, recipientId) {
+ if (hasPost(postId)) {
+ return;
+ }
+ if (!isIndexPage() && (!isViewPostPage() || (getShownPostId() != postId))) {
return;
}
- loadedPosts[postId] = true;
$.getJSON("getPost.ajax", { "post" : postId }, function(data, textStatus) {
if ((data != null) && data.success) {
- if (!isIndexPage() && !(isViewSonePage() && (getShownSoneId() == data.post.sone))) {
+ if (hasPost(data.post.id)) {
+ return;
+ }
+ if (!isIndexPage() && !(isViewSonePage() && ((getShownSoneId() == data.post.sone) || (getShownSoneId() == data.post.recipient)))) {
return;
}
var firstOlderPost = null;
if (firstOlderPost != null) {
newPost.insertBefore(firstOlderPost);
} else {
- $("#sone .post:last").append(newPost);
+ $("#sone #posts").append(newPost);
}
ajaxifyPost(newPost);
newPost.slideDown();
}
function loadNewReply(replyId) {
- if (replyId in loadedReplies) {
+ if (hasReply(replyId)) {
return;
}
- loadedReplies[replyId] = true;
$.getJSON("getReply.ajax", { "reply": replyId }, function(data, textStatus) {
/* find post. */
if ((data != null) && data.success) {
+ if (hasReply(data.reply.id)) {
+ return;
+ }
$("#sone .post#" + data.reply.postId).each(function() {
var firstNewerReply = null;
$(this).find(".replies .reply").each(function() {
ajaxifyReply(newReply);
newReply.slideDown();
setActivity();
+ return false;
});
}
});
return notification;
}
+/**
+ * Shows the details of the notification with the given ID.
+ *
+ * @param notificationId
+ * The ID of the notification
+ */
+function showNotificationDetails(notificationId) {
+ $("#sone .notification#" + notificationId + " .text").show();
+ $("#sone .notification#" + notificationId + " .short-text").hide();
+}
+
//
// EVERYTHING BELOW HERE IS EXECUTED AFTER LOADING THE PAGE
//
getTranslation("WebInterface.DefaultText.StatusUpdate", function(defaultText) {
registerInputTextareaSwap("#sone #update-status .status-input", defaultText, "text", false, false);
$("#sone #update-status").submit(function() {
+ if ($(this).find(":input.default:enabled").length > 0) {
+ return false;
+ }
text = $(this).find(":input:enabled").val();
$.getJSON("createPost.ajax", { "formPassword": getFormPassword(), "text": text }, function(data, textStatus) {
if ((data != null) && data.success) {
- loadNewPost(data.postId);
+ loadNewPost(data.postId, getCurrentSoneId());
+ }
+ });
+ $(this).find(":input:enabled").val("").blur();
+ return false;
+ });
+ });
+
+ /* ajaxify input field on “view Sone” page. */
+ getTranslation("WebInterface.DefaultText.Message", function(defaultText) {
+ registerInputTextareaSwap("#sone #post-message input[name=text]", defaultText, "text", false, false);
+ $("#sone #post-message").submit(function() {
+ text = $(this).find(":input:enabled").val();
+ $.getJSON("createPost.ajax", { "formPassword": getFormPassword(), "recipient": getShownSoneId(), "text": text }, function(data, textStatus) {
+ if ((data != null) && data.success) {
+ loadNewPost(data.postId, getCurrentSoneId());
}
});
$(this).find(":input:enabled").val("").blur();