X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fresources%2Fstatic%2Fjavascript%2Fsone.js;h=b7f323e95e9ab1405c3f9e385ebffaf4cd35be82;hb=8454806e48890675178c1b4b6cbe4bb9c42b68a3;hp=32ad68320bdbded8a597147233f2bedd886d7a4b;hpb=2beccb575d2baf1d0e9e41acc77fe742b8517ecd;p=Sone.git
diff --git a/src/main/resources/static/javascript/sone.js b/src/main/resources/static/javascript/sone.js
index 32ad683..b7f323e 100644
--- a/src/main/resources/static/javascript/sone.js
+++ b/src/main/resources/static/javascript/sone.js
@@ -63,7 +63,7 @@ function registerInputTextareaSwap(inputElement, defaultText, inputFieldName, op
* @param element
* The element to add a âcommentâ link to
*/
-function addCommentLink(postId, element) {
+function addCommentLink(postId, element, insertAfterThisElement) {
if ($(element).find(".show-reply-form").length > 0) {
return;
}
@@ -86,9 +86,7 @@ function addCommentLink(postId, element) {
});
return commentElement;
})(postId);
- $(element).find(".status-line .time").each(function() {
- $(this).after(commentElement.clone(true));
- });
+ $(insertAfterThisElement).after(commentElement.clone(true));
}
var translations = {};
@@ -107,7 +105,7 @@ function getTranslation(key, callback) {
callback(translations[key]);
return;
}
- $.getJSON("ajax/getTranslation.ajax", {"key": key}, function(data, textStatus) {
+ $.getJSON("getTranslation.ajax", {"key": key}, function(data, textStatus) {
if ((data != null) && data.success) {
translations[key] = data.value;
callback(data.value);
@@ -203,7 +201,7 @@ function enhanceDeleteButton(button, text, deleteCallback) {
*/
function enhanceDeletePostButton(button, postId, text) {
enhanceDeleteButton(button, text, function() {
- $.getJSON("ajax/deletePost.ajax", { "post": postId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ $.getJSON("deletePost.ajax", { "post": postId, "formPassword": getFormPassword() }, function(data, textStatus) {
if (data == null) {
return;
}
@@ -234,7 +232,7 @@ function enhanceDeletePostButton(button, postId, text) {
*/
function enhanceDeleteReplyButton(button, replyId, text) {
enhanceDeleteButton(button, text, function() {
- $.getJSON("ajax/deleteReply.ajax", { "reply": replyId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
+ $.getJSON("deleteReply.ajax", { "reply": replyId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
if (data == null) {
return;
}
@@ -316,7 +314,7 @@ function getReplyTime(element) {
}
function likePost(postId) {
- $.getJSON("ajax/like.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ $.getJSON("like.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
if ((data == null) || !data.success) {
return;
}
@@ -329,7 +327,7 @@ function likePost(postId) {
}
function unlikePost(postId) {
- $.getJSON("ajax/unlike.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ $.getJSON("unlike.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
if ((data == null) || !data.success) {
return;
}
@@ -342,7 +340,7 @@ function unlikePost(postId) {
}
function updatePostLikes(postId) {
- $.getJSON("ajax/getLikes.ajax", { "type": "post", "post": postId }, function(data, textStatus) {
+ $.getJSON("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);
@@ -354,7 +352,7 @@ function updatePostLikes(postId) {
}
function likeReply(replyId) {
- $.getJSON("ajax/like.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ $.getJSON("like.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
if ((data == null) || !data.success) {
return;
}
@@ -367,7 +365,7 @@ function likeReply(replyId) {
}
function unlikeReply(replyId) {
- $.getJSON("ajax/unlike.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
+ $.getJSON("unlike.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
if ((data == null) || !data.success) {
return;
}
@@ -380,7 +378,7 @@ function unlikeReply(replyId) {
}
function updateReplyLikes(replyId) {
- $.getJSON("ajax/getLikes.ajax", { "type": "reply", "reply": replyId }, function(data, textStatus) {
+ $.getJSON("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);
@@ -403,7 +401,7 @@ function updateReplyLikes(replyId) {
* parameters: success, error, replyId)
*/
function postReply(postId, text, callbackFunction) {
- $.getJSON("ajax/createReply.ajax", { "formPassword" : getFormPassword(), "post" : postId, "text": text }, function(data, textStatus) {
+ $.getJSON("createReply.ajax", { "formPassword" : getFormPassword(), "post" : postId, "text": text }, function(data, textStatus) {
if (data == null) {
/* TODO - show error */
return;
@@ -428,7 +426,7 @@ function postReply(postId, text, callbackFunction) {
* replyDisplayTime, text, html)
*/
function getReply(replyId, callbackFunction) {
- $.getJSON("ajax/getReply.ajax", { "reply" : replyId }, function(data, textStatus) {
+ $.getJSON("getReply.ajax", { "reply" : replyId }, function(data, textStatus) {
if ((data != null) && data.success) {
callbackFunction(data.soneId, data.soneName, data.time, data.displayTime, data.text, data.html);
}
@@ -484,6 +482,9 @@ function ajaxifyPost(postElement) {
return false;
});
+ /* add âcommentâ link. */
+ addCommentLink(getPostId(postElement), postElement, $(postElement).find(".post-status-line .time"));
+
/* process all replies. */
$(postElement).find(".reply").each(function() {
ajaxifyReply(this);
@@ -493,12 +494,13 @@ function ajaxifyPost(postElement) {
getTranslation("WebInterface.DefaultText.Reply", function(text) {
$(postElement).find("input.reply-input").each(function() {
registerInputTextareaSwap(this, text, "text", false, false);
- addCommentLink(getPostId(postElement), postElement);
});
});
- /* add âcommentâ link. */
- addCommentLink(getPostId(postElement), postElement);
+ /* mark everything as known on click. */
+ $(postElement).click(function() {
+ markPostAsKnown(this);
+ });
/* hide reply input field. */
$(postElement).find(".create-reply").addClass("hidden");
@@ -528,7 +530,12 @@ function ajaxifyReply(replyElement) {
});
});
})(replyElement);
- addCommentLink(getPostId(replyElement), replyElement);
+ addCommentLink(getPostId(replyElement), replyElement, $(replyElement).find(".reply-status-line .time"));
+
+ /* mark post and all replies as known on click. */
+ $(replyElement).click(function() {
+ markPostAsKnown(getPostElement(replyElement));
+ });
}
/**
@@ -542,7 +549,7 @@ function ajaxifyNotification(notification) {
return false;
});
notification.find("form.dismiss button").click(function() {
- $.getJSON("ajax/dismissNotification.ajax", { "formPassword" : getFormPassword(), "notification" : notification.attr("id") }, function(data, textStatus) {
+ $.getJSON("dismissNotification.ajax", { "formPassword" : getFormPassword(), "notification" : notification.attr("id") }, function(data, textStatus) {
/* dismiss in case of error, too. */
notification.slideUp();
}, function(xmlHttpRequest, textStatus, error) {
@@ -553,7 +560,7 @@ function ajaxifyNotification(notification) {
}
function getStatus() {
- $.getJSON("ajax/getStatus.ajax", {}, function(data, textStatus) {
+ $.getJSON("getStatus.ajax", {}, function(data, textStatus) {
if ((data != null) && data.success) {
/* process Sone information. */
$.each(data.sones, function(index, value) {
@@ -569,6 +576,7 @@ function getStatus() {
$("#sone #notification-area").append(notification);
notification.slideDown();
}
+ setActivity();
});
$.each(data.removedNotifications, function(index, value) {
$("#sone #notification-area .notification#" + value.id).slideUp();
@@ -593,6 +601,65 @@ function getStatus() {
})
}
+/**
+ * Returns the content of the page-id attribute.
+ *
+ * @returns The page ID
+ */
+function getPageId() {
+ return $("#sone .page-id").text();
+}
+
+/**
+ * Returns whether the current page is the index page.
+ *
+ * @returns {Boolean} true
if the current page is the index page,
+ * false
otherwise
+ */
+function isIndexPage() {
+ return getPageId() == "index";
+}
+
+/**
+ * Returns whether the current page is a âview Soneâ page.
+ *
+ * @returns {Boolean} true
if the current page is a âview Soneâ
+ * page, false
otherwise
+ */
+function isViewSonePage() {
+ return getPageId() == "view-sone";
+}
+
+/**
+ * Returns the ID of the currently shown Sone. This will only return a sensible
+ * value if isViewSonePage() returns true
.
+ *
+ * @returns The ID of the currently shown Sone
+ */
+function getSoneId() {
+ return $("#sone .sone-id").text();
+}
+
+/**
+ * Returns whether the current page is a âview postâ page.
+ *
+ * @returns {Boolean} true
if the current page is a âview postâ
+ * page, false
otherwise
+ */
+function isViewPostPage() {
+ return getPageId() == "view-post";
+}
+
+/**
+ * Returns the ID of the currently shown post. This will only return a sensible
+ * value if isViewPostPage() returns true
.
+ *
+ * @returns The ID of the currently shown post
+ */
+function getPostId() {
+ return $("#sone .post-id").text();
+}
+
var loadedPosts = {};
var loadedReplies = {};
@@ -601,8 +668,11 @@ function loadNewPost(postId) {
return;
}
loadedPosts[postId] = true;
- $.getJSON("ajax/getPost.ajax", { "post" : postId }, function(data, textStatus) {
+ $.getJSON("getPost.ajax", { "post" : postId }, function(data, textStatus) {
if ((data != null) && data.success) {
+ if (!isIndexPage() && !(isViewSonePage() && (getSoneId() == data.post.sone))) {
+ return;
+ }
var firstOlderPost = null;
$("#sone .post").each(function() {
if (getPostTime(this) < data.post.time) {
@@ -614,10 +684,11 @@ function loadNewPost(postId) {
if (firstOlderPost != null) {
newPost.insertBefore(firstOlderPost);
} else {
- $("#sone #posts").append(newPost);
+ $("#sone .post:last").append(newPost);
}
ajaxifyPost(newPost);
newPost.slideDown();
+ setActivity();
}
});
}
@@ -627,7 +698,7 @@ function loadNewReply(replyId) {
return;
}
loadedReplies[replyId] = true;
- $.getJSON("ajax/getReply.ajax", { "reply": replyId }, function(data, textStatus) {
+ $.getJSON("getReply.ajax", { "reply": replyId }, function(data, textStatus) {
/* find post. */
if ((data != null) && data.success) {
$("#sone .post#" + data.reply.postId).each(function() {
@@ -650,6 +721,7 @@ function loadNewReply(replyId) {
}
ajaxifyReply(newReply);
newReply.slideDown();
+ setActivity();
});
}
});
@@ -659,9 +731,11 @@ function markPostAsKnown(postElements) {
$(postElements).each(function() {
postElement = this;
if ($(postElement).hasClass("new")) {
- $.getJSON("ajax/markPostAsKnown.ajax", {"formPassword": getFormPassword(), "post": getPostId(postElement)}, function(data, textStatus) {
- $(postElement).removeClass("new");
- });
+ (function(postElement) {
+ $.getJSON("markPostAsKnown.ajax", {"formPassword": getFormPassword(), "post": getPostId(postElement)}, function(data, textStatus) {
+ $(postElement).removeClass("new");
+ });
+ })(postElement);
}
});
markReplyAsKnown($(postElements).find(".reply"));
@@ -671,13 +745,31 @@ function markReplyAsKnown(replyElements) {
$(replyElements).each(function() {
replyElement = this;
if ($(replyElement).hasClass("new")) {
- $.getJSON("ajax/markReplyAsKnown.ajax", {"formPassword": getFormPassword(), "reply": getReplyId(replyElement)}, function(data, textStatus) {
- $(replyElement).removeClass("new");
- });
+ (function(replyElement) {
+ $.getJSON("markReplyAsKnown.ajax", {"formPassword": getFormPassword(), "reply": getReplyId(replyElement)}, function(data, textStatus) {
+ $(replyElement).removeClass("new");
+ });
+ })(replyElement);
}
});
}
+function resetActivity() {
+ title = document.title;
+ if (title.indexOf('(') == 0) {
+ document.title = title.substr(title.indexOf(' ') + 1);
+ }
+}
+
+function setActivity() {
+ if (!focus) {
+ title = document.title;
+ if (title.indexOf('(') != 0) {
+ document.title = "(!) " + title;
+ }
+ }
+}
+
/**
* Creates a new notification.
*
@@ -704,6 +796,8 @@ function createNotification(id, text, dismissable) {
// EVERYTHING BELOW HERE IS EXECUTED AFTER LOADING THE PAGE
//
+var focus = true;
+
$(document).ready(function() {
/* this initializes the status update input field. */
@@ -711,7 +805,7 @@ $(document).ready(function() {
registerInputTextareaSwap("#sone #update-status .status-input", defaultText, "text", false, false);
$("#sone #update-status").submit(function() {
text = $(this).find(":input:enabled").val();
- $.getJSON("ajax/createPost.ajax", { "formPassword": getFormPassword(), "text": text }, function(data, textStatus) {
+ $.getJSON("createPost.ajax", { "formPassword": getFormPassword(), "text": text }, function(data, textStatus) {
if ((data != null) && data.success) {
loadNewPost(data.postId);
}
@@ -734,30 +828,32 @@ $(document).ready(function() {
});
/* hides all replies but the latest two. */
- getTranslation("WebInterface.ClickToShow.Replies", function(text) {
- $("#sone .post .replies").each(function() {
- allReplies = $(this).find(".reply");
- if (allReplies.length > 2) {
- newHidden = false;
- for (replyIndex = 0; replyIndex < (allReplies.length - 2); ++replyIndex) {
- $(allReplies[replyIndex]).addClass("hidden");
- newHidden |= $(allReplies[replyIndex]).hasClass("new");
- }
- clickToShowElement = $("