Chaturbate sort

sorts camwhores descending by viewers

As of 2017-06-25. See the latest version.

// ==UserScript==
// @name        Chaturbate sort
// @namespace   Lurk4
// @author  itsmewantscaps
// @description sorts camwhores descending by viewers 
// @include     https://chaturbate.com/*
// @include     https://www.chaturbate.com/*
// @version     1
// @grant       GM_addStyle
// @run-at     document-end
// ==/UserScript==
function sortCamwhores() {
    var i    
    var elems
    var camsinfo
    var res = null    
    var mainList = null
    var contentHolder = document.getElementsByClassName("list");
    if (contentHolder !== null && contentHolder.length > 0) {
        for (i = 0; i < contentHolder.length; i++) {
            res = [];
            mainList =  contentHolder[i];
            elems = mainList.getElementsByClassName("cams");
            for (j = elems.length-1; j >= 0 ; j--) {
                
                camsinfo = elems[j].innerText.match(/(\d+) min.*, (\d+) viewer.*\b/);         
                res.push({
                    "element": elems[j].parentElement.parentElement.parentElement,
                    "viewers": camsinfo !== null && camsinfo.length > 2 ? camsinfo[2] : 0
                });                
                mainList.removeChild(elems[j].parentElement.parentElement.parentElement);

            }
            res.sort(function(a, b) { return  b.viewers - a.viewers;  });
            for (j = 0; j < res.length; j++) {             
                mainList.appendChild(res[j].element);
            }
        }
    }  
}

sortCamwhores() ;  

//https://stackoverflow.com/questions/3219758/detect-changes-in-the-dom  
var observeDOM = (function(){
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
        eventListenerSupported = window.addEventListener;

    return function(obj, callback){
        if( MutationObserver ){
            // define a new observer
            var obs = new MutationObserver(function(mutations, observer){
                if( mutations[0].addedNodes.length || mutations[0].removedNodes.length )
                    {
                       callback( observer);
                    }
            });
            // have the observer observe foo for changes in children
            obs.observe( obj, { childList:true, subtree:true });
        }
        else if( eventListenerSupported ){
            obj.addEventListener('DOMNodeInserted', callback, false);
            obj.addEventListener('DOMNodeRemoved', callback, false);
        }
    };
})();

observeDOM( document.getElementById('main') ,function( observer){       
    observer.disconnect();    
    sortCamwhores() ;    
    observer.observe( document.getElementById('main') , { childList:true, subtree:true });   
});