Furaffinity nested messages

Groups the message center by message source

  1. // ==UserScript==
  2. // @name Furaffinity nested messages
  3. // @description Groups the message center by message source
  4. // @namespace binarte.com.famessages
  5. // @include http*://*furaffinity.net/msg/others*
  6. // @version 1
  7. // @grant none
  8. // ==/UserScript==
  9. try {
  10. //console.log(journals);
  11. function compactItems(journals, linkidx) {
  12. journals = journals.getElementsByClassName('message-stream') [0];
  13. var newjournals = document.createElement('div');
  14. journals.parentNode.insertBefore(newjournals, journals);
  15. var journalDivs = {
  16. };
  17. var cur = journals.firstChild;
  18. while (cur) {
  19. console.log(cur);
  20. var next = cur.nextSibling;
  21. if (cur.nodeName === 'LI') {
  22. if (cur.className === 'section-controls') {
  23. cur = next;
  24. continue;
  25. }
  26. var user
  27. if (linkidx) {
  28. //console.log(cur.getElementsByTagName('a'));
  29. user = cur.getElementsByTagName('a') [linkidx].href;
  30. } else {
  31. user = cur.getElementsByTagName('a');
  32. user = user[0].href;
  33. }
  34. var jdiv = journalDivs[user];
  35. if (typeof jdiv == 'undefined') {
  36. jdiv = journalDivs[user] = document.createElement('ul');
  37. jdiv.style.overflow = 'hidden';
  38. jdiv.style.marginTop = '0';
  39. jdiv.style.marginBottom = '0';
  40. jdiv.className = 'message-stream';
  41. newjournals.appendChild(jdiv);
  42. } else if (!jdiv.ExpandButton) {
  43. var btn = document.createElement('span');
  44. jdiv.Counter = document.createElement('span');
  45. jdiv.Counter.textContent = '(2)';
  46. jdiv.Count = 2;
  47. var ref = jdiv.firstChild.getElementsByClassName('popup_date') [0];
  48. ref.parentNode.appendChild(jdiv.Counter);
  49. jdiv.ExpandButton = btn;
  50. btn.innerHTML = '⨁';
  51. btn.title = 'Expand';
  52. btn.style.display = 'block';
  53. btn.style.position = 'absolute';
  54. btn.style.zIndex = '10';
  55. btn.style.cursor = 'pointer';
  56. btn.style.marginLeft = '-1em';
  57. btn.Div = jdiv;
  58. btn.Collapsed = true;
  59. btn.CollapsedHeight = '' + cur.offsetHeight + 'px';
  60. btn.onclick = function () {
  61. if (this.Collapsed) {
  62. this.Div.style.maxHeight = '';
  63. if (this.Div.Counter) {
  64. this.Div.Counter.style.display = 'none';
  65. }
  66. this.Collapsed = false;
  67. this.innerHTML = '⨀';
  68. this.title = 'Collapse';
  69. } else {
  70. this.Div.style.maxHeight = this.CollapsedHeight;
  71. if (this.Div.Counter) {
  72. this.Div.Counter.style.display = '';
  73. }
  74. this.Collapsed = true;
  75. this.innerHTML = '⨁';
  76. this.title = 'Expand';
  77. }
  78. }
  79. var checkbox = jdiv.getElementsByTagName('input') [0];
  80. console.log(checkbox);
  81. checkbox.ExpandButton = btn;
  82. checkbox.Div = jdiv;
  83. checkbox.onchange = function () {
  84. if (this.ExpandButton.Collapsed) {
  85. var inputs = this.Div.getElementsByTagName('input');
  86. for (var i = 1; i < inputs.length; i++) {
  87. var cur = inputs[i];
  88. cur.checked = this.checked;
  89. cur = cur.nextSibling;
  90. }
  91. }
  92. }
  93. jdiv.style.maxHeight = btn.CollapsedHeight;
  94. jdiv.insertBefore(btn, jdiv.firstChild);
  95. jdiv.HR = document.createElement('HR');
  96. jdiv.appendChild(jdiv.HR);
  97. } else {
  98. jdiv.Counter.textContent = ' (' + (++jdiv.Count) + ')';
  99. }
  100. console.log(jdiv.HR);
  101. jdiv.appendChild(cur);
  102. if (jdiv.HR){
  103. jdiv.appendChild(jdiv.HR);
  104. }
  105. }
  106. cur = next;
  107. }
  108. newjournals.id = journals.id;
  109. journals.parentNode.appendChild(journals);
  110. }
  111. var journals = document.getElementById('messages-journals');
  112. if (journals) {
  113. compactItems(journals, 1);
  114. }
  115. var types = [
  116. 'shouts',
  117. 'submission_comments',
  118. 'user_favorites',
  119. 'character_comments',
  120. 'journal_comments'
  121. ];
  122. for (var i = 0; i < types.length; i++) {
  123. var type = types[i];
  124. var shouts = document.getElementById(type);
  125. if (shouts) {
  126. compactItems(shouts, false);
  127. }
  128. }
  129. } catch (ex) {
  130. console.log(ex);
  131. }