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 ? "<input type=\"text\" name=\"" + inputFieldName + "\">" : "<textarea name=\"" + inputFieldName + "\"></textarea>").blur(function() {
if ($(this).val() == "") {
$(this).hide();
});
}
-/* 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.
*
* @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 = $("<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");
});
return commentElement;
})(postId);
- element.find(".create-reply").addClass("hidden");
- element.find(".status-line .time").each(function() {
- $(this).after(commentElement.clone(true));
- });
+ $(insertAfterThisElement).after(commentElement.clone(true));
}
var translations = {};
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);
/**
* 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 = $("<button></button>").addClass("confirm").hide().text(text).click(function() {
$(this).fadeOut("slow");
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;
}
/**
* 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;
}
}
function getSoneElement(element) {
- return $(element).parents(".sone");
+ return $(element).closest(".sone");
}
/**
var soneList = "";
$.each(sones, function() {
if (soneList != "") {
- soneList += "\n";
+ soneList += ", ";
}
soneList += this.name;
});
}
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;
}
}
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;
}
}
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);
}
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;
}
}
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;
}
}
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);
* 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;
* 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);
}
}
/**
+ * 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
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) {
}
function getStatus() {
- $.getJSON("ajax/getStatus.ajax", {}, function(data, textStatus) {
+ $.getJSON("getStatus.ajax", {"loadAllSones": isKnownSonesPage()}, function(data, textStatus) {
if ((data != null) && data.success) {
/* process Sone information. */
$.each(data.sones, function(index, value) {
$("#sone #notification-area").append(notification);
notification.slideDown();
}
+ setActivity();
});
$.each(data.removedNotifications, function(index, value) {
$("#sone #notification-area .notification#" + value.id).slideUp();
});
+ /* 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 {
}
/**
+ * 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} <code>true</code> if the current page is the index page,
+ * <code>false</code> otherwise
+ */
+function isIndexPage() {
+ return getPageId() == "index";
+}
+
+/**
+ * Returns whether the current page is a “view Sone” page.
+ *
+ * @returns {Boolean} <code>true</code> if the current page is a “view Sone”
+ * page, <code>false</code> 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 <code>true</code>.
+ *
+ * @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} <code>true</code> if the current page is a “view post”
+ * page, <code>false</code> 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 <code>true</code>.
+ *
+ * @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} <code>true</code> if the current page is the “known
+ * Sones” page, <code>false</code> otherwise
+ */
+function isKnownSonesPage() {
+ return getPageId() == "known-sones";
+}
+
+/**
+ * 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 (hasPost(postId)) {
+ return;
+ }
+ $.getJSON("getPost.ajax", { "post" : postId }, function(data, textStatus) {
+ if ((data != null) && data.success) {
+ if (hasPost(data.post.id)) {
+ return;
+ }
+ 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 (hasReply(replyId)) {
+ return;
+ }
+ $.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() {
+ 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.
*
* @param id
// 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);
- })
-
- /* 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() {
+ 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").hasAttr("disabled")) {
+ 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);
+ }
+ });
+ $(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);
- }
+ });
+
+ /* 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;
});
- 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 = $("<div></div>").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 = $("<div></div>").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
*/
$("#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");
});
});
$("#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");
});
});
$("#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");
});
});
$("#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 status polling. */
setTimeout(getStatus, 5000);
+
+ /* reset activity counter when the page has focus. */
+ $(window).focus(function() {
+ focus = true;
+ resetActivity();
+ }).blur(function() {
+ focus = false;
+ })
+
});