ASTROBAKER

JS-NoNopeNoColor

Feb 15th, 2019
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. * q.js v2018.3-6.1
  3. * http://anonsw.github.io/8chjs/
  4. */
  5.  
  6. /* Display a replies counter overlay in the top right corner */
  7. $(function(){
  8. $('head').append('<style>#thread_stats_posts_ovl { '+
  9. 'position:fixed;top:35px;right:35px;'+
  10. 'font:38px sans-serif;opacity:0.5;color:#f60;}</style>');
  11. $('body').append('<div id="thread_stats_posts_ovl"/>');
  12. function copyStats() { $('#thread_stats_posts_ovl').
  13. text($('#thread_stats_posts').text());}
  14. $(document).on('new_post',copyStats); copyStats();});
  15.  
  16. // User Settings
  17. var anonsw = {
  18. qflair: '', // Examples: REAL, &rarr;
  19. scrollcolor: 'rgba(153, 153, 153, 0.6)',
  20. scrollbackcolor: '#333',
  21. scrolltime: 400, // ms
  22. updateDelay: 200, // ms
  23. sidenavWidth: 30, // px
  24.  
  25. floodEnabled: false,
  26. floodThreshold: 15, // min # posts before beginning fade
  27. floodVanish: 25, // max # posts before completed fade/hide
  28. floodBehavior: 'fade', // hide, fade
  29. fadenametripregex: /^(Anon(ymous)?-.*|.*-!!Hs1Jq13jV6)$/i,
  30. fadenametripfloodvalue: -1, // Effective post count for fading, or -1 for auto of floodThreshold+post count
  31. strikeThroughNameFags: true,
  32.  
  33. rateHistoryLen: 50, // Data points on chart
  34. rateAvgLen: 10 // Number of data points to average for instantaneous rate
  35.  
  36. // Suggestions from 589388.html#590283
  37. // ...shill detection features, such as
  38. // easily knowing the proportion of posts from a user that don't link.
  39. // I'd want to know any ID that was posting > 1/3 posts targetting noone.
  40.  
  41. // TODO: Behavior for post hover should be to show original post visual before all q.js mods
  42. // TODO: Add flags to turn on/off features
  43. // TODO: Custom-regex -> post color/fade (auto-filter by selecting text and choosing new menu item?)
  44. // Examples: daily reminder, guys, check this out, shill, get out, filtered, tell us more, archive everything
  45. // TODO: Manual shade
  46. // TODO: remove Q trip codes from post content?
  47. // TODO: remove Q from end of post content if not a Q post?
  48. // TODO: recognize all of known Q trip codes? (make to sure to exclude known comps)
  49. // TODO: Links to reset on current Q/(you) post
  50. // TODO: Link to go to latest post (end key doesn't always work, but try capturing that as well?)
  51. // TODO: Keyboard shortcuts for navigation
  52. // TODO: Current/Total overall post navigation
  53. // TODO: Remap end key to always go to end of page
  54. // TODO: Check box for each post to mark as "read", "spam", ?
  55. // TODO: Autocorrect all-caps posts (50% threshold)?
  56. // TODO: Correct broken links but remove referral when clicked?
  57. // TODO: Make flood post fading non-linear to give leniency to posters just passing flood threshold
  58. // TODO: Penalize reposts in flood detection (if id's different, merge?) ?
  59. // TODO: Scorecard of posters ordered by post count (post rate, reply count, ...)?
  60. // TODO: Color/shade posts where there are no references and no question marks
  61. // TODO: If Q or trip used in name field, strike them out or replace with Anonymous?
  62. // TODO: embedded posts in Q posts don't have background-color and inherit Q color, fix?
  63. };
  64.  
  65. (function( anonsw_main, $, undefined ) {
  66. // House keeping variables
  67. var qposts = [];
  68. var allqposts = [];
  69. var currq = -1;
  70. var youposts = [];
  71. var curryou = -1;
  72. var qnavposts = [];
  73. var younavposts = [];
  74. var ctx;
  75. var borderSz;
  76. var scrollWd;
  77. var minheight;
  78. var ratehistory = [];
  79.  
  80. // On scroll stop. SO #9144560
  81. (function ($) {
  82. var on = $.fn.on, timer;
  83. $.fn.on = function () {
  84. var args = Array.apply(null, arguments);
  85. var last = args[args.length - 1];
  86.  
  87. if (isNaN(last) || (last === 1 && args.pop())) return on.apply(this, args);
  88.  
  89. var delay = args.pop();
  90. var fn = args.pop();
  91.  
  92. args.push(function () {
  93. var self = this, params = arguments;
  94. clearTimeout(timer);
  95. timer = setTimeout(function () {
  96. fn.apply(self, params);
  97. }, delay);
  98. });
  99.  
  100. return on.apply(this, args);
  101. };
  102. }(this.jQuery || this.Zepto));
  103.  
  104. // Case insensitive contains selector for finding yous. SO #8746882
  105. $.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {
  106. return function (elem) {
  107. return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
  108. };
  109. });
  110.  
  111. // Get non-child text. SO #3442394
  112. function immediateText(el) {
  113. return el.contents().not(el.children()).text();
  114. }
  115.  
  116. // Scroll to element
  117. function myScrollTo(el) {
  118. $('html, body').animate({
  119. scrollTop: $(el).offset().top - $('div.boardlist').height()
  120. }, anonsw.scrolltime);
  121. }
  122.  
  123. // Highlight (you) posts/references
  124. function highlightYous() {
  125. $(youposts).each(function() {
  126. $(this).css('background-color', anonsw.youcolor);
  127. });
  128. return $.Deferred().resolve();
  129. }
  130.  
  131. // Remove invalid (you)'s
  132. function removeInvalidYous() {
  133. $('div.body:icontains("(You)")').each(function() {
  134. $(this).find(':not(small)').contents().filter(function() { return this.nodeType == 3 }).each(function() {
  135. this.textContent = this.textContent.replace(/\(+ *You *\)+/ig, "you");
  136. });
  137. });
  138. return $.Deferred().resolve();
  139. }
  140.  
  141. // Highlight Q posts
  142. function highlightQ() {
  143. $(allqposts).each(function(idx,val) {
  144. if($(val).css('background-color') !== anonsw.qcolor) {
  145. if(anonsw.qflair !== "") {
  146. $(val).find('p.intro > label > span.trip').first().prepend(anonsw.qflair + " ");
  147. }
  148. $(val).css('background-color', anonsw.qcolor);
  149. }
  150. });
  151. return $.Deferred().resolve();
  152. }
  153.  
  154. // Scroll to next Q
  155. anonsw_main.nextq = function() {
  156. if(qposts.length > 0) {
  157. if(currq < qposts.length-1) {
  158. currq++;
  159. }
  160. myScrollTo($(qposts).get(currq));
  161. }
  162. };
  163.  
  164. // Scroll to last Q
  165. anonsw_main.lastq = function() {
  166. if(qposts.length > 0) {
  167. currq = qposts.length - 1;
  168. myScrollTo($(qposts).get(currq));
  169. }
  170. };
  171.  
  172. // Scroll to previous Q
  173. anonsw_main.prevq = function() {
  174. if(qposts.length > 0) {
  175. if(currq > 0) {
  176. currq--;
  177. }
  178. myScrollTo($(qposts).get(currq));
  179. }
  180. };
  181.  
  182. // Scroll to first Q
  183. anonsw_main.firstq = function() {
  184. if(qposts.length > 0) {
  185. currq = 0;
  186. myScrollTo($(qposts).get(currq));
  187. }
  188. };
  189.  
  190. // Scroll to next (You)
  191. anonsw_main.nextyou = function() {
  192. if(youposts.length > 0) {
  193. if(curryou < youposts.length-1) {
  194. curryou++;
  195. }
  196. myScrollTo($(youposts).get(curryou));
  197. }
  198. };
  199.  
  200. // Scroll to last (You)
  201. anonsw_main.lastyou = function() {
  202. if(youposts.length > 0) {
  203. curryou = youposts.length - 1;
  204. myScrollTo($(youposts).get(curryou));
  205. }
  206. };
  207.  
  208. // Scroll to previous (You)
  209. anonsw_main.prevyou = function() {
  210. if(youposts.length > 0) {
  211. if(curryou > 0) {
  212. curryou--;
  213. }
  214. myScrollTo($(youposts).get(curryou));
  215. }
  216. };
  217.  
  218. // Scroll to first (You)
  219. anonsw_main.firstyou = function() {
  220. if(youposts.length > 0) {
  221. curryou = 0;
  222. myScrollTo($(youposts).get(curryou));
  223. }
  224. };
  225.  
  226. // Inserts Q navigation links
  227. function qnav() {
  228. $('div.boardlist').append('<span>[ <a href="javascript:anonsw_main.firstq();"><i class="fa fa-step-backward"></i></a> <a href="javascript:anonsw_main.prevq();"><i class="fa fa-backward"></i></a> <span style="filter:brightness(70%);">Q</span> <span class="qcount">(?:?)</span> <a href="javascript:anonsw_main.nextq();"><i class="fa fa-forward"></i></a> <a href="javascript:anonsw_main.lastq();"><i class="fa fa-step-forward"></i></a> ]</span>');
  229. }
  230.  
  231. // Inserts (You) navigation links
  232. function younav() {
  233. $('div.boardlist').append('<span>[ <a href="javascript:anonsw_main.firstyou();"><i class="fa fa-step-backward"></i></a> <a href="javascript:anonsw_main.prevyou();"><i class="fa fa-backward"></i></a> <span style="filter:brightness(70%);">(You)</span> <span class="youcount">(?:?)</span> </span><a href="javascript:anonsw_main.nextyou();"><i class="fa fa-forward"></i></a> <a href="javascript:anonsw_main.lastyou();"><i class="fa fa-step-forward"></i></a> ]</span>');
  234. }
  235.  
  236. // Inserts feature toggle links
  237. function togglenav() {
  238. $('div.boardlist').append('<span>[ <a href="javascript:anonsw_main.toggleFlood();">Turn Post Fading <span class="toggleFloodState">Off</span></a> ]</span>')
  239. }
  240.  
  241. // Inserts post rate count/chart
  242. function postratenav() {
  243. var height = $('div.boardlist').height() - 1;
  244. $('div.boardlist').append('<span>[ Post Rate: <span class="postRate">0</span> posts/min <canvas class="postRateChart"></canvas>]</span>')
  245. $('.postRate').css('color', $('div.boardlist a').css('color'));
  246. var charts = $('.postRateChart');
  247. $(charts).each(function() {
  248. $(this).css('width', '100px');
  249. $(this).css('height', height);
  250. $(this).css('vertical-align', 'middle');
  251. //$(this).css('border', '1px solid');
  252. //$(this).css('border-color', $('div.boardlist').css('color'));
  253. var gctx = $(this).get(0).getContext('2d');
  254. gctx.canvas.height = 20;
  255. gctx.canvas.width = 100;
  256. });
  257. }
  258.  
  259. // Inserts side navigation (bird's eye)
  260. function sidenav() {
  261. $('body').append('<canvas id="sidenav"></canvas>');
  262. var nav = $('#sidenav');
  263. $(nav).css('position', 'fixed');
  264. $(nav).css('top', $('div.boardlist').height());
  265. $(nav).css('right', 0);
  266. $(nav).css('width', anonsw.sidenavWidth);
  267. $(nav).css('height', $(window).height() - $('div.boardlist').height());
  268. $(nav).css('background-color', anonsw.scrollbackcolor);
  269. $('body').css('margin-right', anonsw.sidenavWidth);
  270. ctx = $('#sidenav').get(0).getContext('2d');
  271. //ctx.canvas.height = $(document).height() - $('div.boardlist').height();
  272. ctx.canvas.height = 2048;
  273. ctx.canvas.width = anonsw.sidenavWidth;
  274. borderSz = 1;
  275. scrollWd = ctx.canvas.width / 2;
  276. }
  277.  
  278. // Update navigation counts
  279. function updateNavCounts() {
  280. var fontSize = -1;
  281. var lineHeight;
  282.  
  283. if(currq > qposts.length) { currq = qposts.length; }
  284. if(curryou > youposts.length) { curryou = youposts.length; }
  285.  
  286. for(i=0; i<qposts.length; i++) {
  287. var el = $(qposts).get(i);
  288. if(fontSize == -1) {
  289. fontSize = $(el).css('font-size');
  290. lineHeight = Math.floor(parseInt(fontSize.replace('px', '')) * 1.5);
  291. }
  292. if(($(el).offset().top + $(el).height() - 2.25*lineHeight) > $(window).scrollTop()) {
  293. currq = i;
  294. break;
  295. }
  296. }
  297.  
  298. for(i=0; i<youposts.length; i++) {
  299. var el = $(youposts).get(i);
  300. if(fontSize == -1) {
  301. fontSize = $(el).css('font-size');
  302. lineHeight = Math.floor(parseInt(fontSize.replace('px', '')) * 1.5);
  303. }
  304. if(($(el).offset().top + $(el).height() - 2.25*lineHeight) > $(window).scrollTop()) {
  305. curryou = i;
  306. break;
  307. }
  308. }
  309.  
  310. // TODO: check for duplicates and remove from counts
  311. $('.qcount').text("(" + (currq+1) + ":" + qposts.length + ")");
  312. $('.youcount').text("(" + (curryou+1) + ":" + youposts.length + ")");
  313. }
  314.  
  315. // Update navigation graphics
  316. function updateNavGraphics() {
  317. var sidenav = $('#sidenav');
  318. if(sidenav.length) {
  319. $(sidenav).css('height', $(window).height() - $('div.boardlist').height());
  320. minheight = ctx.canvas.height / ($(window).height() - $('div.boardlist').height()); // 1px
  321. ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
  322.  
  323. // Draw nav q posts
  324. qnavposts = [];
  325. ctx.fillStyle = anonsw.qcolor;
  326. for (i = 0; i < qposts.length; i++) {
  327. // TODO: check if we have already added post, don't draw it again
  328. var el = $(qposts).get(i);
  329. var height = $(el).height() / $(document).height() * ctx.canvas.height;
  330. if(height < minheight) height = minheight;
  331. qnavposts[i] = {
  332. x : borderSz,
  333. y : $(el).offset().top / $(document).height() * ctx.canvas.height,
  334. width : ctx.canvas.width - borderSz*2,
  335. height : height
  336. };
  337. ctx.fillRect(qnavposts[i].x, qnavposts[i].y, qnavposts[i].width, qnavposts[i].height);
  338. }
  339.  
  340. // Draw nav you posts
  341. younavposts = [];
  342. ctx.fillStyle = anonsw.youcolor;
  343. for (i = 0; i < youposts.length; i++) {
  344. // TODO: check if we have already added post, don't add it again
  345. var el = $(youposts).get(i);
  346. var height = $(el).height() / $(document).height() * ctx.canvas.height;
  347. if(height < minheight) height = minheight;
  348. younavposts[i] = {
  349. x : borderSz,
  350. y : $(el).offset().top / $(document).height() * ctx.canvas.height,
  351. width : ctx.canvas.width - borderSz*2,
  352. height : height
  353. };
  354. ctx.fillRect(younavposts[i].x, younavposts[i].y, younavposts[i].width, younavposts[i].height);
  355. }
  356.  
  357. // Update nav window
  358. ctx.fillStyle = anonsw.scrollcolor;
  359. ctx.fillRect(
  360. scrollWd / 2,
  361. $(window).scrollTop() / $(document).height() * ctx.canvas.height,
  362. scrollWd,
  363. $(window).height() / $(document).height() * ctx.canvas.height
  364. );
  365.  
  366. // Add red marker at bottom of >750 posts
  367. if($('#thread_stats_posts').text() > 750) {
  368. var barHeight = (4 * 2048) / ($(window).height() - $('div.boardlist').height());
  369. ctx.fillStyle = '#f66';
  370. ctx.fillRect(
  371. 0,
  372. ctx.canvas.height - barHeight,
  373. ctx.canvas.width,
  374. barHeight
  375. );
  376. }
  377. }
  378. }
  379.  
  380. // Updates post rate count/chart
  381. function updateNavPostRate() {
  382. var posts = $('div.post').not('.post-hover');
  383. var startPost = posts.length - (anonsw.rateHistoryLen + anonsw.rateAvgLen) + 1;
  384. if(startPost < 1) startPost = 1;
  385. var start = $($($(posts).get(0)).find('.intro time').get(0)).attr('unixtime'); //$('div.post:first .intro time').attr('unixtime');
  386. ratehistory = [];
  387. timehistory = [];
  388. for(var i=startPost; i<posts.length; i++) {
  389. // TODO: check if we have already added post, don't add it again
  390. var step = $($($(posts).get(i)).find('.intro time').get(0)).attr('unixtime'); //$($('div.post .intro time').get(i)).attr('unixtime');
  391. timehistory[timehistory.length] = step;
  392. if(timehistory.length - anonsw.rateAvgLen - 1 >= 0) {
  393. var avgend = timehistory[timehistory.length - 1];
  394. var avgstart = timehistory[timehistory.length - anonsw.rateAvgLen - 1];
  395. ratehistory[ratehistory.length] = anonsw.rateAvgLen / ((avgend - avgstart) / 60);
  396. } else {
  397. ratehistory[ratehistory.length] = 0;
  398. }
  399. }
  400. //console.log(ratehistory);
  401.  
  402. $('.postRate').text(ratehistory[ratehistory.length-1].toFixed(1));
  403.  
  404. if(ratehistory.length > anonsw.rateAvgLen) {
  405. var maxRate = Math.max.apply(null, ratehistory);
  406. var minRate = Math.min.apply(null, ratehistory);
  407. //console.log("Max: " + maxRate);
  408. //console.log("Min: " + minRate);
  409. if(minRate > (maxRate - 0.5)) {
  410. minRate = maxRate - 0.5;
  411. maxRate = maxRate + 0.5;
  412. }
  413. if(minRate < 0) {
  414. minRate = 0;
  415. }
  416. var maxTime = timehistory[timehistory.length-1];
  417. var minTime = timehistory[anonsw.rateAvgLen];
  418. $('.postRateChart').each(function() {
  419. var gctx = $(this).get(0).getContext('2d');
  420. gctx.clearRect(0, 0, gctx.canvas.width, gctx.canvas.height);
  421. gctx.strokeStyle = $('div.boardlist a').css('color');
  422. gctx.beginPath();
  423. var x = 0;
  424. var y = gctx.canvas.height - (ratehistory[anonsw.rateAvgLen] - minRate)/(maxRate - minRate) * gctx.canvas.height;
  425. gctx.moveTo(x, y);
  426. for(var i=anonsw.rateAvgLen+1; i<ratehistory.length; i++) {
  427. x = (timehistory[i] - minTime)/(maxTime - minTime) * gctx.canvas.width;
  428. y = gctx.canvas.height - (ratehistory[i] - minRate)/(maxRate - minRate) * gctx.canvas.height;
  429. gctx.lineTo(x, y);
  430. }
  431. gctx.stroke();
  432. gctx.closePath();
  433. });
  434. }
  435. }
  436.  
  437. // Update navigation
  438. function updateNav() {
  439. updateNavCounts();
  440. updateNavGraphics();
  441. updateNavPostRate();
  442. }
  443.  
  444. // Update nav when scrolling stops
  445. $(window).on('scroll', function(e) {
  446. updateNavCounts();
  447. updateNavGraphics();
  448. }, anonsw.updateDelay);
  449.  
  450. // Update nav when resize stops
  451. $(window).on('resize', function(e) {
  452. updateNav();
  453. }, anonsw.updateDelay);
  454.  
  455. // Set which posts are Q posts
  456. function setQPosts() {
  457. qposts = $.map($('div.post:not(.post-hover) > p.intro > label > span.trip:contains("!!Hs1Jq13jV6")'), function(el) {
  458. return $(el).closest('div.post');
  459. });
  460. allqposts = $.map($('div.post:not(.post-hover) > p.intro > label > span.trip:contains("!!Hs1Jq13jV6")'), function(el) {
  461. return $(el).closest('div.post');
  462. });
  463. return $.Deferred().resolve();
  464. }
  465.  
  466. // Set which posts are (you) posts
  467. function setYouPosts() {
  468. youposts = $.map($('div.post:not(.post-hover) > p.intro > label span.name > span.own_post, div.post:not(.post-hover) > div.body > p.body-line > small:icontains("(You)")'), function(el) {
  469. return $(el).closest('div.post');
  470. });
  471. return $.Deferred().resolve();
  472. }
  473.  
  474. // Set flood posts
  475. function setFloodPosts() {
  476. if(anonsw.floodEnabled) {
  477. var stats = {};
  478. var firstId = null;
  479. //console.log("==[ Name Fags ]=================================================");
  480. var posts = $('div.post:not(.post-hover)').not('.you');
  481. $(posts).each(function () {
  482. var id = $(this).find('p > span.poster_id').first().text();
  483. if(firstId != null) {
  484. if (!(id in stats)) {
  485. stats[id] = {count: 0, namefag: false, floodcount: 0};
  486. }
  487. stats[id].count++;
  488. if(!stats[id].namefag) {
  489. var name = immediateText($(this).find('p > label span.name').first());
  490. var trip = $(this).find('p > label > span.trip').first().text();
  491. stats[id].namefag = !anonsw.fadenametripregex.test(name+'-'+trip);
  492. //if(stats[id].namefag) {
  493. // console.log(id + '=' + stats[id].namefag + ', ' + name + ', ' + trip);
  494. //}
  495. }
  496. if(stats[id].namefag) {
  497. if(anonsw.fadenametripfloodvalue < 0) {
  498. stats[id].floodcount = anonsw.floodThreshold + stats[id].count;
  499. } else {
  500. stats[id].floodcount = anonsw.fadenametripfloodvalue;
  501. }
  502. } else {
  503. stats[id].floodcount = stats[id].count;
  504. }
  505. }
  506. if (firstId == null) {
  507. firstId = id;
  508. }
  509. });
  510. $.each(stats, function (key, value) {
  511. if (key !== firstId) {
  512. var ids = $('span.poster_id:contains("' + key + '")');
  513. if (value.floodcount > anonsw.floodThreshold || value.namefag) {
  514. if(anonsw.strikeThroughNameFags && value.namefag) {
  515. $(ids).each(function() {
  516. $(this).closest('div.post').find('p > label span.name').first().css('text-decoration','line-through');
  517. });
  518. }
  519. if (anonsw.floodBehavior === 'fade') {
  520. var intensity = value.floodcount;
  521. if (intensity > anonsw.floodVanish) {
  522. intensity = anonsw.floodVanish;
  523. }
  524. intensity = ((anonsw.floodVanish - anonsw.floodThreshold) - (intensity - anonsw.floodThreshold)) / (anonsw.floodVanish - anonsw.floodThreshold);
  525. if (intensity < 0.1) {
  526. intensity = 0.1;
  527. }
  528. $(ids).each(function () {
  529. $(this).closest('div.post').css('opacity', intensity);
  530. $(this).closest('div.post').hover(function () {
  531. $(this).animate({opacity: 1.0}, anonsw.updateDelay);
  532. }, function () {
  533. $(this).animate({opacity: intensity}, anonsw.updateDelay);
  534. });
  535. });
  536. } else if (anonsw.floodBehavior === 'hide') {
  537. if (value.count >= anonsw.floodVanish) {
  538. $(ids).each(function () {
  539. $(this).closest('div.post').hide();
  540. });
  541. }
  542. }
  543. } else {
  544. $(ids).each(function () {
  545. $(this).closest('div.post').css('opacity', 1.0);
  546. });
  547. }
  548. }
  549. });
  550. }
  551. return $.Deferred().resolve();
  552. }
  553.  
  554. // Toggle post flooding
  555. anonsw_main.toggleFlood = function() {
  556. if(anonsw.floodEnabled) {
  557. anonsw.floodEnabled = false;
  558. $('.toggleFloodState').text('On');
  559. if(anonsw.floodBehavior === 'fade') {
  560. $('span.poster_id').each(function () {
  561. $(this).closest('div.post').css('opacity', 1);
  562. $(this).closest('div.post').off('mouseenter mouseleave');
  563. });
  564. } else if(anonsw.floodBehavior === 'hide') {
  565. $(this).closest('div.post').show();
  566. }
  567. } else {
  568. anonsw.floodEnabled = true;
  569. $('.toggleFloodState').text('Off');
  570. runq()
  571. }
  572. };
  573.  
  574. // Helper to run snippets in the right order
  575. function runq() {
  576. setQPosts()
  577. .done(highlightQ)
  578. .done(removeInvalidYous)
  579. .done(setYouPosts)
  580. .done(highlightYous)
  581. .done(setFloodPosts)
  582. .done(updateNav);
  583. }
  584.  
  585. anonsw_main.Q = function() {
  586. qnav();
  587. younav();
  588. togglenav();
  589. postratenav();
  590. sidenav();
  591. runq();
  592.  
  593. // Select the node that will be observed for mutations
  594. var targetNode = $('div.thread')[0];
  595.  
  596. // Options for the observer (which mutations to observe)
  597. var config = { childList: true };
  598.  
  599. // Callback function to execute when mutations are observed
  600. var callback = function(mutationsList) {
  601. for(var mutation in mutationsList) {
  602. if (mutationsList[mutation].type == 'childList') {
  603. runq();
  604. break;
  605. }
  606. }
  607. };
  608.  
  609. // Create an observer instance linked to the callback function
  610. var observer = new MutationObserver(callback);
  611.  
  612. // Start observing the target node for configured mutations
  613. observer.observe(targetNode, config);
  614. };
  615. }( window.anonsw_main = window.anonsw_main || {}, jQuery ));
  616.  
  617. // Attach snippets to ready/change events
  618. $(document).ready(anonsw_main.Q);
Add Comment
Please, Sign In to add comment