VK top comments

Топовые комментарии VK!

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         VK top comments
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Топовые комментарии VK!
// @author       Me
// @match       *://vk.com/*
// @match       *://*.vk.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';


    function CommentSorter(box) {
        if (window.location.host == 'vk.com') {
            box.setAttribute("data-sorter-init", "true");
            this.rootNode = box;
            this.statNode = box.querySelector('.post_full_like');
            if (this.statNode === null && this.rootNode.id == "wl_post") {
                this.statNode = box.querySelector('#wl_post_actions_wrap');
                this.singlePost = true;
            }
            this.init();
        }
}

CommentSorter.getResource = function () {
    var scriptNode = document.querySelector("#VKCommentsSorterRootEx");
    return JSON.parse( scriptNode.getAttribute("data-resource") );
};

CommentSorter.hookComments = function () {
    var arCommentsBox = document.querySelectorAll(".post");
    var box = null;
    var commentBox = null;
    var i;
    for (i = 0; i < arCommentsBox.length; i++) {
        box = arCommentsBox[i];
        commentBox = null;
        if (
            !box.hasAttribute("data-sorter-init") && (commentBox = box.querySelector(".replies_wrap.clear")) && commentBox.style.display != "none"
        )
        {
            box.commentSorter = new CommentSorter(box);
        }
    }
    box = document.getElementById('wl_post');
    if ( box &&
        !box.hasAttribute("data-sorter-init") && (commentBox = box.querySelector(".wl_replies")) && commentBox.style.display != "none"
    )
    {
        //console.log("Init for post");
        box.commentSorter = new CommentSorter(box);
    }
    arCommentsBox = document.querySelectorAll(".wall_fixed");
    box = null;
    commentBox = null;
    for (i = 0; i < arCommentsBox.length; i++) {
        box = arCommentsBox[i];
        commentBox = null;
        if (
            !box.hasAttribute("data-sorter-init") && ((commentBox = box.querySelector(".replies_wrap.clear")) || (commentBox = box.querySelector('.wall_fixed_replies'))) && commentBox.style.display != "none"
        )
        {
            box.commentSorter = new CommentSorter(box);
        }
    }
};

CommentSorter.setSortAfterInit = function () {
    CommentSorter.sortAfterInit = true;
};

CommentSorter.getSortAfterInit = function () {
    if (CommentSorter.sortAfterInit) {
        CommentSorter.sortAfterInit = false;
        return true;
    } else {
        return false;
    }
};


CommentSorter.getTextOnBtn = function () {
    return 'Топ';//CommentSorter.getResource().lang.top;
};

CommentSorter.getButtonNodeForFullPost = function(self) {
    var btn = document.createElement("a");
    btn.className = "flat_button secondary button_light wl_action_link wl_post_share";
    btn.href = "#";
    btn.innerHTML = "<img style='margin-left:5px; float:right; margin-top:1px; width:17px' src='http://topcomments.burlaka.net/icon.svg'><span>"+CommentSorter.getTextOnBtn()+"</span>";
    btn.addEventListener("click", function (event) {
        event.preventDefault();
        self.onSortFullPostClick(event);
    });
    return btn;
};

CommentSorter.getButtonNode = function (self) {
    if (self.singlePost) {
        return CommentSorter.getButtonNodeForFullPost(self);
    }
    var btn = document.createElement("div");
    btn.className = "post_share fl_r";
    btn.innerHTML = "<img style='float:right; margin-top:0px;width:17px;opacity:0.5' src='http://topcomments.burlaka.net/icon.svg'>"+'<span style="display: block" class="post_share_link fl_l">'+CommentSorter.getTextOnBtn()+'</span>';
    btn.style.position = "absolute";
    btn.style.width = "40px";
    btn.style.left = "-48px";
    btn.addEventListener("click", function (event) {self.onSortClick(event);} );
    return btn;
};

CommentSorter.prototype.init = function () {
    var btn = CommentSorter.getButtonNode(this);
    if (this.singlePost) {
        this.btnText = btn.querySelector("span");
    } else {
        this.btnText = btn.querySelector('.post_share_link');
    }
    if (this.statNode) {
        this.statNode.appendChild( btn );
    } else {
        //console.log("Init without button");
    }
    if (CommentSorter.getSortAfterInit()) {
        btn.click();
    }
};

CommentSorter.prototype.onFinishLoadAllComment = function () {
    this.btnText.innerHTML = CommentSorter.getTextOnBtn();
    clearInterval(this.loaderTimer);
    this.sortingAnimation = false;
};

CommentSorter.prototype.onStartLoadAllComment = function() {
    if (this.sortingAnimation) return false;
    this.sortingAnimation = true;
    this.btnTextPonts = ".";
    this.btnText.innerHTML = CommentSorter.getTextOnBtn()+this.btnTextPonts;
    var self = this;
    this.loaderTimer = setInterval( function () { self.onLoadProgress(); }, 400 );
    return true;
};

CommentSorter.prototype.onLoadProgress = function () {
  if (this.btnTextPonts.length >= 3) {
      this.btnTextPonts = ".";
  } else {
      this.btnTextPonts += '.';
  }
    this.btnText.innerHTML = CommentSorter.getTextOnBtn()+this.btnTextPonts;
};

CommentSorter.prototype.onSortClick = function (event) {
    CommentSorter.setSortAfterInit();
    //console.log(event);
    var obj;
    if (obj == this.rootNode.querySelector(".wall_post_text")) {
        obj.click();
    }
    if (obj == this.rootNode.querySelector(".published_comment") ) obj.click();
    if (obj == this.rootNode.querySelector(".reply_link_wrap") ) obj.click();
    if (obj == this.rootNode.querySelector(".post_media") ) obj.click();
    if (obj == this.rootNode.querySelector(".event_share") ) obj.click();
    if (obj == this.rootNode.querySelector(".public_share") ) obj.click();
    if (obj == this.rootNode.querySelector(".group_share") ) obj.click();
    this.rootNode.click();
    //return;
    /*this.onStartLoadAllComment();
    var commentLoader = this.rootNode.querySelector('.wr_header');
    var self = this;
    if (commentLoader) {
        var progressBar = commentLoader.querySelector('.progress');
        if (progressBar && progressBar.style.display == "block") {
            setTimeout( function () {self.onSortClick(null);}, 100 );
            //console.log("Load wait");
        } else {
            if (!commentLoader.classList.contains('wrh_all')) {
                commentLoader.click();
                setTimeout( function () {self.onSortClick(null);}, 100 );
                //console.log("open all");
            }
            if (event === null) {
                setTimeout(function () {
                    self.resortComments();
                }, 400);
                //console.log("resort all after load");
                this.onFinishLoadAllComment();
            }
        }
    }
    this.resortComments();*/
};

CommentSorter.prototype.onSortFullPostClick = function (event) {
    var self = this;
    if (this.onStartLoadAllComment()) {
        this.resortComments();
    }
    if (wkcur)
        wkcur.limit = 100;
    var loaderState = this.rootNode.querySelector('#wl_replies_more_link');
    if (loaderState && loaderState.style.display != 'none' ) {
        var progressBar = this.rootNode.querySelector('#wl_replies_more_progress');
        if (progressBar && progressBar.style.display != 'block') {
            loaderState.click();
            //console.log("Click on load more");
            this.resortComments();
        } else {
            //console.log("Progress bar is hidden");
        }
        //console.log("Wait for loader");
        setTimeout( function () {self.onSortFullPostClick(0);}, 100 );
    } else {
        //console.log("Loader is hidden");
        if (event !== -1 && event !== -2) {
            setTimeout( function () {self.onSortFullPostClick(-1);}, 400 );
            //console.log("Waiting for loader this");
        } else {
            //console.log("Waiting twice");
            if (event !== -2) {
                setTimeout( function () {self.onSortFullPostClick(-2);}, 1200 );
            } else {
                //console.log("Loading too long, return");
                this.resortComments();
                this.onFinishLoadAllComment();
            }
        }
    }
};

CommentSorter.prototype.resortComments = function () {
    var arComments = this.rootNode.querySelectorAll(".reply.reply_dived");
    var arSort = [];
    console.log("Start sort "+arComments.length);
    for (var i = 0; i < arComments.length; i++) {
        var node = arComments[i];
        var sortObject = {"node":node, "rating":0};
        var likeNode = node.querySelector(".like_count");
        if (likeNode && likeNode.innerHTML.length) {
            sortObject.rating = parseInt( likeNode.innerHTML );
        }
        arSort.push(sortObject);
    }

    arSort.sort( function compare(b, a) {
        if (a.rating < b.rating) {
            return -1;
        }
        if (a.rating > b.rating) {
            return 1;
        }
        return 0;
    } );

    for (var j = 0; j < arSort.length; j++) {
        var prent = arSort[j].node.parentNode;
        prent.removeChild(arSort[j].node);
        prent.appendChild(arSort[j].node);
    }
};

CommentSorter.hookComments();
setInterval(function () {CommentSorter.hookComments();}, 500);
})();