X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fresources%2Fstatic%2Fjavascript%2Fsone.js;h=acb1d466368e6d72e51f06f71366e7701bd439f3;hb=2c5d39efa620a564f9fe12f754d3f5bb3adf37fe;hp=e29c136f9df8f252555f17729158ee11ff1a047a;hpb=1c8961bd6350e6be218bfc59e3cf9ebce2e7399f;p=Sone.git diff --git a/src/main/resources/static/javascript/sone.js b/src/main/resources/static/javascript/sone.js index e29c136..acb1d46 100644 --- a/src/main/resources/static/javascript/sone.js +++ b/src/main/resources/static/javascript/sone.js @@ -23,8 +23,8 @@ function isOnline() { return $("#sone").hasClass("online"); } -function registerInputTextareaSwap(inputSelector, defaultText, inputFieldName, optional, dontUseTextarea) { - $(inputSelector).each(function() { +function registerInputTextareaSwap(inputElement, defaultText, inputFieldName, optional, dontUseTextarea) { + $(inputElement).each(function() { textarea = $(dontUseTextarea ? "" : "").blur(function() { if ($(this).val() == "") { $(this).hide(); @@ -55,17 +55,6 @@ function registerInputTextareaSwap(inputSelector, defaultText, inputFieldName, o }); } -/* hide all the âcreate replyâ forms until a link is clicked. */ -function addCommentLinks() { - if (!isOnline()) { - return; - } - $("#sone .post").each(function() { - postId = $(this).attr("id"); - addCommentLink(postId, $(this)); - }); -} - /** * Adds a âcommentâ link to all status lines contained in the given element. * @@ -74,9 +63,13 @@ function addCommentLinks() { * @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; + } commentElement = (function(postId) { var commentElement = $("
true
if the Sone is local, false
- * otherwise
- */
-function getSoneStatus(soneId, local) {
- $.getJSON("ajax/getSoneStatus.ajax", {"sone": soneId}, function(data, textStatus) {
- if ((data != null) && data.success) {
- updateSoneStatus(soneId, data.name, data.status, data.modified, data.locked, data.lastUpdated);
- }
- /* seconds! */
- updateInterval = 60;
- if (local || (data!= null) && (data.modified || (data.status == "downloading") || (data.status == "inserting"))) {
- updateInterval = 5;
- }
- setTimeout(function() {
- getSoneStatus(soneId, local);
- }, updateInterval * 1000);
- }, function(xmlHttpRequest, textStatus, error) {
- /* ignore error. */
- });
-}
-
-/**
* Filters the given Sone ID, replacing all â~â characters by an underscore.
*
* @param soneId
@@ -184,41 +154,17 @@ function updateSoneStatus(soneId, name, status, modified, locked, lastUpdated) {
$("#sone .sone." + filterSoneId(soneId) + " .profile-link a").text(name);
}
-var watchedSones = {};
-
-/**
- * Watches this Sone for updates to its status.
- *
- * @param soneId
- * The ID of the Sone to watch
- * @param local
- * true
if the Sone is local, false
- * otherwise
- */
-function watchSone(soneId, local) {
- if (watchedSones[soneId]) {
- return;
- }
- watchedSones[soneId] = true;
- (function(soneId) {
- setTimeout(function() {
- getSoneStatus(soneId, local);
- }, 5000);
- })(soneId);
-}
-
/**
* Enhances a âdeleteâ button so that the confirmation is done on the same page.
*
- * @param buttonId
- * The selector of the button
+ * @param button
+ * The button element
* @param text
* The text to show on the button
* @param deleteCallback
* The callback that actually deletes something
*/
-function enhanceDeleteButton(buttonId, text, deleteCallback) {
- button = $(buttonId);
+function enhanceDeleteButton(button, text, deleteCallback) {
(function(button) {
newButton = $("").addClass("confirm").hide().text(text).click(function() {
$(this).fadeOut("slow");
@@ -240,22 +186,22 @@ function enhanceDeleteButton(buttonId, text, deleteCallback) {
return false;
});
})(button, newButton);
- })(button);
+ })($(button));
}
/**
* Enhances a postâs âdeleteâ button.
*
- * @param buttonId
- * The selector of the button
+ * @param button
+ * The button element
* @param postId
* The ID of the post to delete
* @param text
* The text to replace the button with
*/
-function enhanceDeletePostButton(buttonId, postId, text) {
- enhanceDeleteButton(buttonId, text, function() {
- $.getJSON("ajax/deletePost.ajax", { "post": postId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
+function enhanceDeletePostButton(button, postId, text) {
+ enhanceDeleteButton(button, text, function() {
+ $.getJSON("deletePost.ajax", { "post": postId, "formPassword": getFormPassword() }, function(data, textStatus) {
if (data == null) {
return;
}
@@ -277,16 +223,16 @@ function enhanceDeletePostButton(buttonId, postId, text) {
/**
* Enhances a replyâs âdeleteâ button.
*
- * @param buttonId
- * The selector of the button
+ * @param button
+ * The button element
* @param replyId
* The ID of the reply to delete
* @param text
* The text to replace the button with
*/
-function enhanceDeleteReplyButton(buttonId, replyId, text) {
- enhanceDeleteButton(buttonId, text, function() {
- $.getJSON("ajax/deleteReply.ajax", { "reply": replyId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
+function enhanceDeleteReplyButton(button, replyId, text) {
+ enhanceDeleteButton(button, text, function() {
+ $.getJSON("deleteReply.ajax", { "reply": replyId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
if (data == null) {
return;
}
@@ -310,7 +256,7 @@ function getFormPassword() {
}
function getSoneElement(element) {
- return $(element).parents(".sone");
+ return $(element).closest(".sone");
}
/**
@@ -325,7 +271,7 @@ function generateSoneList(sones) {
var soneList = "";
$.each(sones, function() {
if (soneList != "") {
- soneList += "\n";
+ soneList += ", ";
}
soneList += this.name;
});
@@ -344,23 +290,31 @@ function getSoneId(element) {
}
function getPostElement(element) {
- return $(element).parents(".post");
+ return $(element).closest(".post");
}
function getPostId(element) {
return getPostElement(element).attr("id");
}
+function getPostTime(element) {
+ return getPostElement(element).find(".post-time").text();
+}
+
function getReplyElement(element) {
- return $(element).parents(".reply");
+ return $(element).closest(".reply");
}
function getReplyId(element) {
return getReplyElement(element).attr("id");
}
+function getReplyTime(element) {
+ return getReplyElement(element).find(".reply-time").text();
+}
+
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;
}
@@ -373,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;
}
@@ -386,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);
@@ -398,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;
}
@@ -411,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;
}
@@ -424,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);
@@ -447,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;
@@ -472,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);
}
@@ -482,6 +436,111 @@ function getReply(replyId, callbackFunction) {
}
/**
+ * Ajaxifies the given post by enhancing all eligible elements with AJAX.
+ *
+ * @param postElement
+ * The post element to ajaxify
+ */
+function ajaxifyPost(postElement) {
+ $(postElement).find("form").submit(function() {
+ return false;
+ });
+ $(postElement).find(".create-reply button:submit").click(function() {
+ inputField = $(this.form).find(":input:enabled").get(0);
+ postId = getPostId(this);
+ text = $(inputField).val();
+ (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;
+ });
+
+ /* replace all âdeleteâ buttons with javascript. */
+ (function(postElement) {
+ getTranslation("WebInterface.Confirmation.DeletePostButton", function(deletePostText) {
+ postId = getPostId(postElement);
+ enhanceDeletePostButton($(postElement).find(".delete-post button"), postId, deletePostText);
+ });
+ })(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;
+ });
+
+ /* add âcommentâ link. */
+ addCommentLink(getPostId(postElement), postElement, $(postElement).find(".post-status-line .time"));
+
+ /* process all replies. */
+ $(postElement).find(".reply").each(function() {
+ ajaxifyReply(this);
+ });
+
+ /* process reply input fields. */
+ getTranslation("WebInterface.DefaultText.Reply", function(text) {
+ $(postElement).find("input.reply-input").each(function() {
+ registerInputTextareaSwap(this, text, "text", false, false);
+ });
+ });
+
+ /* mark everything as known on click. */
+ $(postElement).click(function() {
+ markPostAsKnown(this);
+ });
+
+ /* hide reply input field. */
+ $(postElement).find(".create-reply").addClass("hidden");
+}
+
+/**
+ * Ajaxifies the given reply element.
+ *
+ * @param replyElement
+ * The reply element to ajaxify
+ */
+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) {
+ getTranslation("WebInterface.Confirmation.DeleteReplyButton", function(deleteReplyText) {
+ $(replyElement).find(".delete-reply button").each(function() {
+ enhanceDeleteReplyButton(this, getReplyId(replyElement), deleteReplyText);
+ });
+ });
+ })(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(this));
+ });
+}
+
+/**
* Ajaxifies the given notification by replacing the form with AJAX.
*
* @param notification
@@ -492,7 +551,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) {
@@ -502,12 +561,14 @@ function ajaxifyNotification(notification) {
return notification;
}
-/**
- * Retrieves all changed notifications.
- */
-function getNotifications() {
- $.getJSON("ajax/getNotifications.ajax", {}, function(data, textStatus) {
+function getStatus() {
+ $.getJSON("getStatus.ajax", {"loadAllSones": isKnownSonesPage()}, function(data, textStatus) {
if ((data != null) && data.success) {
+ /* process Sone information. */
+ $.each(data.sones, function(index, value) {
+ updateSoneStatus(value.id, value.name, value.status, value.modified, value.locked, value.lastUpdated);
+ });
+ /* process notifications. */
$.each(data.notifications, function(index, value) {
oldNotification = $("#sone #notification-area .notification#" + value.id);
notification = ajaxifyNotification(createNotification(value.id, value.text, value.dismissable)).hide();
@@ -517,19 +578,217 @@ function getNotifications() {
$("#sone #notification-area").append(notification);
notification.slideDown();
}
+ setActivity();
});
$.each(data.removedNotifications, function(index, value) {
$("#sone #notification-area .notification#" + value.id).slideUp();
});
- setTimeout(getNotifications, 5000);
+ /* process new posts. */
+ $.each(data.newPosts, function(index, value) {
+ loadNewPost(value);
+ });
+ /* process new replies. */
+ $.each(data.newReplies, function(index, value) {
+ loadNewReply(value);
+ });
+ /* do it again in 5 seconds. */
+ setTimeout(getStatus, 5000);
} else {
- setTimeout(getNotifications, 30000);
+ /* data.success was false, wait 30 seconds. */
+ setTimeout(getStatus, 30000);
}
}, function(xmlHttpRequest, textStatus, error) {
- /* ignore error. */
+ /* something really bad happend, wait a minute. */
+ setTimeout(getStatus, 60000);
+ })
+}
+
+/**
+ * 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 getShownSoneId() {
+ 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 getShownPostId() {
+ return $("#sone .post-id").text();
+}
+
+/**
+ * Returns whether the current page is the âknown Sonesâ page.
+ *
+ * @returns {Boolean} true
if the current page is the âknown
+ * Sonesâ page, false
otherwise
+ */
+function isKnownSonesPage() {
+ return getPageId() == "known-sones";
+}
+
+var loadedPosts = {};
+var loadedReplies = {};
+
+function loadNewPost(postId) {
+ if (postId in loadedPosts) {
+ return;
+ }
+ $.getJSON("getPost.ajax", { "post" : postId }, function(data, textStatus) {
+ if ((data != null) && data.success) {
+ if (data.post.id in loadedPosts) {
+ return;
+ }
+ loadedPosts[data.post.id] = true;
+ if (!isIndexPage() && !(isViewSonePage() && ((getShownSoneId() == data.post.sone) || (getShownSoneId() == data.post.recipient)))) {
+ return;
+ }
+ var firstOlderPost = null;
+ $("#sone .post").each(function() {
+ if (getPostTime(this) < data.post.time) {
+ firstOlderPost = $(this);
+ return false;
+ }
+ });
+ newPost = $(data.post.html).addClass("hidden");
+ if (firstOlderPost != null) {
+ newPost.insertBefore(firstOlderPost);
+ } else {
+ $("#sone #posts").append(newPost);
+ }
+ ajaxifyPost(newPost);
+ newPost.slideDown();
+ setActivity();
+ }
});
}
+function loadNewReply(replyId) {
+ if (replyId in loadedReplies) {
+ return;
+ }
+ $.getJSON("getReply.ajax", { "reply": replyId }, function(data, textStatus) {
+ /* find post. */
+ if ((data != null) && data.success) {
+ if (data.reply.id in loadedReplies) {
+ return;
+ }
+ loadedReplies[data.reply.id] = true;
+ $("#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();
+ setActivity();
+ return false;
+ });
+ }
+ });
+}
+
+function markPostAsKnown(postElements) {
+ $(postElements).each(function() {
+ postElement = this;
+ if ($(postElement).hasClass("new")) {
+ (function(postElement) {
+ $.getJSON("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("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.
*
@@ -556,105 +815,79 @@ 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. */
- getTranslation("WebInterface.DefaultText.StatusUpdate", function(text) {
- registerInputTextareaSwap("#sone #update-status .status-input", text, "text", false, false);
- })
-
- /* these functions are necessary for updating Sone statuses. */
- $("#sone .sone").each(function() {
- watchSone($(this).find(".id").text(), $(this).hasClass("local"));
+ getTranslation("WebInterface.DefaultText.StatusUpdate", function(defaultText) {
+ registerInputTextareaSwap("#sone #update-status .status-input", defaultText, "text", false, false);
+ $("#sone #update-status").submit(function() {
+ text = $(this).find(":input:enabled").val();
+ $.getJSON("createPost.ajax", { "formPassword": getFormPassword(), "text": text }, function(data, textStatus) {
+ if ((data != null) && data.success) {
+ loadNewPost(data.postId);
+ }
+ });
+ $(this).find(":input:enabled").val("").blur();
+ return false;
+ });
});
- /* this initializes all reply input fields. */
- getTranslation("WebInterface.DefaultText.Reply", function(text) {
- registerInputTextareaSwap("#sone input.reply-input", text, "text", false, false);
- addCommentLinks();
- })
-
- /* replaces all âpost reply!â forms with AJAX. */
- $("#sone .create-reply button:submit").click(function() {
- $(this.form).submit(function() {
+ /* 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);
+ }
+ });
+ $(this).find(":input:enabled").val("").blur();
return false;
});
- inputField = $(this.form).find(":input:enabled").get(0);
- postId = getPostId($(inputField));
- text = $(inputField).val();
- $(inputField).val("");
- postReply(postId, text, function(success, error, replyId) {
- if (success) {
- getReply(replyId, function(soneId, soneName, replyTime, replyDisplayTime, text, html) {
- newReply = $(html).insertBefore("#sone .post#" + postId + " .create-reply");
- $("#sone .post#" + postId + " .create-reply").addClass("hidden");
- getTranslation("WebInterface.Confirmation.DeleteReplyButton", function(deleteReplyText) {
- enhanceDeleteReplyButton("#sone .post#" + postId + " .reply#" + replyId + " .delete button", replyId, deleteReplyText);
- });
- newReply.find(".status-line .like").submit(function() {
- likeReply(getReplyId(this));
- return false;
- });
- newReply.find(".status-line .unlike").submit(function() {
- unlikeReply(getReplyId(this));
- return false;
- });
- addCommentLink(postId, newReply);
- });
- } else {
- alert(error);
- }
- });
- return false;
});
- /* replace all âdeleteâ buttons with javascript. */
+ /* Ajaxifies all posts. */
+ /* calling getTranslation here will cache the necessary values. */
getTranslation("WebInterface.Confirmation.DeletePostButton", function(text) {
- deletePostText = text;
getTranslation("WebInterface.Confirmation.DeleteReplyButton", function(text) {
- deleteReplyText = text;
- $("#sone .post").each(function() {
- postId = $(this).attr("id");
- enhanceDeletePostButton("#sone .post#" + postId + " > .inner-part > .status-line .delete button", postId, deletePostText);
- (function(postId) {
- $("#sone .post#" + postId + " .reply").each(function() {
- replyId = $(this).attr("id");
- (function(postId, reply, replyId) {
- reply.find(".delete button").each(function() {
- enhanceDeleteReplyButton("#sone .post#" + postId + " .reply#" + replyId + " .delete button", replyId, deleteReplyText);
- })
- })(postId, $(this), replyId);
- });
- })(postId);
+ getTranslation("WebInterface.DefaultText.Reply", function(text) {
+ $("#sone .post").each(function() {
+ ajaxifyPost(this);
+ });
});
});
});
/* 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 = $("").addClass("click-to-show");
- if (newHidden) {
- clickToShowElement.addClass("new");
+ if (!isViewPostPage()) {
+ 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 = $("").addClass("click-to-show");
+ if (newHidden) {
+ clickToShowElement.addClass("new");
+ }
+ (function(clickToShowElement, allReplies, text) {
+ clickToShowElement.text(text);
+ clickToShowElement.click(function() {
+ allReplies.removeClass("hidden");
+ clickToShowElement.addClass("hidden");
+ });
+ })(clickToShowElement, allReplies, text);
+ $(allReplies[0]).before(clickToShowElement);
}
- (function(clickToShowElement, allReplies, text) {
- clickToShowElement.text(text);
- clickToShowElement.click(function() {
- allReplies.removeClass("hidden");
- clickToShowElement.addClass("hidden");
- });
- })(clickToShowElement, allReplies, text);
- $(allReplies[0]).before(clickToShowElement);
- }
+ });
});
- });
+ }
/*
* convert all âfollowâ, âunfollowâ, âlockâ, and âunlockâ links to something
@@ -662,7 +895,7 @@ $(document).ready(function() {
*/
$("#sone .follow").submit(function() {
var followElement = this;
- $.getJSON("ajax/followSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
+ $.getJSON("followSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
$(followElement).addClass("hidden");
$(followElement).parent().find(".unfollow").removeClass("hidden");
});
@@ -670,7 +903,7 @@ $(document).ready(function() {
});
$("#sone .unfollow").submit(function() {
var unfollowElement = this;
- $.getJSON("ajax/unfollowSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
+ $.getJSON("unfollowSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
$(unfollowElement).addClass("hidden");
$(unfollowElement).parent().find(".follow").removeClass("hidden");
});
@@ -678,7 +911,7 @@ $(document).ready(function() {
});
$("#sone .lock").submit(function() {
var lockElement = this;
- $.getJSON("ajax/lockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
+ $.getJSON("lockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
$(lockElement).addClass("hidden");
$(lockElement).parent().find(".unlock").removeClass("hidden");
});
@@ -686,36 +919,27 @@ $(document).ready(function() {
});
$("#sone .unlock").submit(function() {
var unlockElement = this;
- $.getJSON("ajax/unlockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
+ $.getJSON("unlockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
$(unlockElement).addClass("hidden");
$(unlockElement).parent().find(".lock").removeClass("hidden");
});
return false;
});
- /* convert all âlikeâ buttons to javascript functions. */
- $("#sone .post > .inner-part > .status-line .like").submit(function() {
- likePost(getPostId(this));
- return false;
- });
- $("#sone .post > .inner-part > .status-line .unlike").submit(function() {
- unlikePost(getPostId(this));
- return false;
- });
- $("#sone .post .reply .status-line .like").submit(function() {
- likeReply(getReplyId(this));
- return false;
- });
- $("#sone .post .reply .status-line .unlike").submit(function() {
- unlikeReply(getReplyId(this));
- return false;
- });
-
/* process all existing notifications, ajaxify dismiss buttons. */
$("#sone #notification-area .notification").each(function() {
ajaxifyNotification($(this));
});
- /* activate notification polling. */
- setTimeout(getNotifications, 5000);
+ /* activate status polling. */
+ setTimeout(getStatus, 5000);
+
+ /* reset activity counter when the page has focus. */
+ $(window).focus(function() {
+ focus = true;
+ resetActivity();
+ }).blur(function() {
+ focus = false;
+ })
+
});