🔀 Merge bugfix/too-long-urls
[Sone.git] / src / main / resources / static / javascript / sone.js
index 8798aae..d9f3bf1 100644 (file)
@@ -495,74 +495,6 @@ function unlikeReply(replyId) {
 }
 
 /**
- * Trusts the Sone with the given ID.
- *
- * @param soneId
- *            The ID of the Sone to trust
- */
-function trustSone(soneId) {
-       ajaxGet("trustSone.ajax", { "formPassword" : getFormPassword(), "sone" : soneId }, function(data) {
-               if ((data != null) && data.success) {
-                       updateTrustControls(soneId, data.trustValue);
-               }
-       });
-}
-
-/**
- * Distrusts the Sone with the given ID, i.e. assigns a negative trust value.
- *
- * @param soneId
- *            The ID of the Sone to distrust
- */
-function distrustSone(soneId) {
-       ajaxGet("distrustSone.ajax", { "formPassword" : getFormPassword(), "sone" : soneId }, function(data) {
-               if ((data != null) && data.success) {
-                       updateTrustControls(soneId, data.trustValue);
-               }
-       });
-}
-
-/**
- * Untrusts the Sone with the given ID, i.e. removes any trust assignment.
- *
- * @param soneId
- *            The ID of the Sone to untrust
- */
-function untrustSone(soneId) {
-       ajaxGet("untrustSone.ajax", { "formPassword" : getFormPassword(), "sone" : soneId }, function(data) {
-               if ((data != null) && data.success) {
-                       updateTrustControls(soneId, data.trustValue);
-               }
-       });
-}
-
-/**
- * Updates the trust controls for all posts and replies of the given Sone,
- * according to the given trust value.
- *
- * @param soneId
- *            The ID of the Sone to update all trust controls for
- * @param trustValue
- *            The trust value for the Sone
- */
-function updateTrustControls(soneId, trustValue) {
-       sone.find(".post").each(function() {
-               if (getPostAuthor(this) === soneId) {
-                       getPostElement(this).find(".post-trust").toggleClass("hidden", trustValue != null);
-                       getPostElement(this).find(".post-distrust").toggleClass("hidden", trustValue != null);
-                       getPostElement(this).find(".post-untrust").toggleClass("hidden", trustValue == null);
-               }
-       });
-       sone.find(".reply").each(function() {
-               if (getReplyAuthor(this) === soneId) {
-                       getReplyElement(this).find(".reply-trust").toggleClass("hidden", trustValue != null);
-                       getReplyElement(this).find(".reply-distrust").toggleClass("hidden", trustValue != null);
-                       getReplyElement(this).find(".reply-untrust").toggleClass("hidden", trustValue == null);
-               }
-       });
-}
-
-/**
  * Bookmarks the post with the given ID.
  *
  * @param postId
@@ -773,20 +705,6 @@ function ajaxifyPost(postElement) {
                return false;
        });
 
-       /* convert trust control buttons to javascript functions. */
-       $(postElement).find(".post-trust").submit(function() {
-               trustSone(getPostAuthor(this));
-               return false;
-       });
-       $(postElement).find(".post-distrust").submit(function() {
-               distrustSone(getPostAuthor(this));
-               return false;
-       });
-       $(postElement).find(".post-untrust").submit(function() {
-               untrustSone(getPostAuthor(this));
-               return false;
-       });
-
        /* convert bookmark/unbookmark buttons to javascript functions. */
        $(postElement).find(".bookmark").submit(function() {
                bookmarkPost(getPostId(this));
@@ -972,20 +890,6 @@ function ajaxifyReply(replyElement) {
        $(replyElement).find(".expand-reply-text").each(toggleShowMore);
        $(replyElement).find(".shrink-reply-text").each(toggleShowMore);
 
-       /* convert trust control buttons to javascript functions. */
-       $(replyElement).find(".reply-trust").submit(function() {
-               trustSone(getReplyAuthor(this));
-               return false;
-       });
-       $(replyElement).find(".reply-distrust").submit(function() {
-               distrustSone(getReplyAuthor(this));
-               return false;
-       });
-       $(replyElement).find(".reply-untrust").submit(function() {
-               untrustSone(getReplyAuthor(this));
-               return false;
-       });
-
        /* show Sone menu when hovering over the avatar. */
        $(replyElement).find(".reply-avatar").mouseover(function() {
                if (typeof currentSoneMenuTimeoutHandler !== undefined) {
@@ -1154,12 +1058,47 @@ function checkForRemovedReplies(oldNotification, newNotification) {
        });
 }
 
+/**
+ * The URLs of not-loaded elements are part of the GET request’s URL. As
+ * both browsers and HTTP servers do have differing limits on URL length
+ * (the HTTP 1.1 RFC states 8000 bytes but most browsers only support up
+ * to 2000 bytes) we will return a random selection of not-loaded URLs we
+ * want to refresh the status from up until we are at approximately 1000
+ * bytes (as the rest of the URL also needs some space).
+ *
+ * @return An array of not-loaded element URLs that will have a total length
+ * of 1000 bytes or fewer
+ */
+function getRandomSelectionOfElementsToUpdate() {
+       const notLoadedElementUrls = $(".linked-element.not-loaded").map(function(_, element) {
+               return $(element).prop("title");
+       }).toArray();
+       shuffleArray(notLoadedElementUrls);
+       const selectedElementUrls = Array();
+       let currentCombinedStringLength = 0;
+       $(notLoadedElementUrls).each(function(_, elementUrl) {
+               if ((currentCombinedStringLength + elementUrl.length) <= 1000) {
+                       selectedElementUrls.push(elementUrl);
+                       currentCombinedStringLength += elementUrl.length;
+               }
+       });
+       return selectedElementUrls;
+}
+
+// shamelessly stolen from https://stackoverflow.com/a/12646864/43582
+function shuffleArray(array) {
+       for (let i = array.length - 1; i > 0; i--) {
+               const j = Math.floor(Math.random() * (i + 1));
+               const temp = array[i];
+               array[i] = array[j];
+               array[j] = temp;
+       }
+}
+
 function getStatus() {
        const parameters = isViewSonePage() ? {"soneIds": getShownSoneId()} : isKnownSonesPage() ? {"soneIds": getShownSoneIds()} : {};
        $.extend(parameters, {
-               "elements": JSON.stringify($(".linked-element.not-loaded").map(function () {
-                       return $(this).prop("title");
-               }).toArray())
+               "elements": JSON.stringify(getRandomSelectionOfElementsToUpdate())
        });
        ajaxGet("getStatus.ajax", parameters, function(data) {
                if ((data != null) && data.success) {