Chirrox / RAP+ Mentor Advanced

// ==UserScript==
// @name        RAP+ Mentor Advanced
// @author      Michal "ceem" Kovac
// @namespace   com.heroesofnewerth.rap
// @description Updates to RAP portal for Mentors
// @match     *://rap.heroesofnewerth.com/gm*
// @match     *://s3.amazonaws.com/*
// @match     *://www.heroesofnewerth.com/playerstats/ranked/
// @version 1.4.16
// @require  https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @require  https://code.jquery.com/ui/1.12.1/jquery-ui.js
// @require  https://rap.heroesofnewerth.com/js/moment.js
// @updateURL https://openuserjs.org/meta/Chirrox/RAP+_Mentor_Advanced.meta.js
// @downloadURL https://openuserjs.org/install/Chirrox/RAP+_Mentor_Advanced.user.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant GM_openInTab
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @icon https://i.imgur.com/uWfCTD0.png
// @license 0BSD
// ==/UserScript==


// ========= Global variables ================================================================
var $activeView;                                               // Active view
var $mentorName;
var $spotcheckedGmName;
var activeSite;
var spotcheckFormReady;
GM_setValue("formReady",false);
var spotcheck = {
    ready: false,
    mentor: "",
    gm: "",
    ots: "",
};

// Links, forms and IDs of form fields
var $loadingImage = "https://resources.patchworkklub.sk/rapp/loading.gif";
var $copyToCliboardImage = "https://resources.patchworkklub.sk/rapp/clipboard_plus.png";
var $expandImage = "https://resources.patchworkklub.sk/rapp/horz-lines.png";

// ===========================================================================================

// ========= Decide which view we have active ================================================

if ($('.ss-q-title:contains("Select the form you wish to submit")').length) {
    activeSite = "form";
    //processSpotcheckForm();
} else {
    activeSite = "rap";
    initScript();
}

// ===========================================================================================

// ========= CSS =============================================================================
if (activeSite == "rap") {
    $('head').append("<link rel='stylesheet' href='https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css'>"+
                     "<style type='text/css'>" +
                     "#rappm-spotcheck {padding: 0 !important;}" +
                     "#rappm-spotcheckForm{display:none}" +
                     "#rappm-showDetailsBtn{float:right;}" +
                     ".rappm-reasonTd {font-size:10px}"+
                     ".rappm-highlight {background: #f8ffb2}" + 
                     "table#rappm-sch {font-size:10px;border-collapse: collapse;width: 98%;}" +
                     "table#rappm-sch th, table#rappm-sch td {text-align: left;padding: 8px;}" +
                     "table#rappm-sch tr:nth-child(even){background-color: #f9f9f9}" +
                     "table#rappm-sch tr:nth-child(odd).markedOk {background:#deffc6;}" +
                     "table#rappm-sch tr:nth-child(odd).markedOt {background:#ffd9c6;}" +
                     "table#rappm-sch tr:nth-child(odd).marked {background:#fcfdc7;}" +
                     "table#rappm-sch tr:nth-child(even).markedOk {background:#ccffa8;}" +
                     "table#rappm-sch tr:nth-child(even).markedOt {background:#ffccb2;}" +
                     "table#rappm-sch tr:nth-child(even).marked {background:#feffa8;}" + 
                     ".rappm-sch-btn {padding: 3px;background: #d9e8fb;border: 1px solid silver;margin-left:5px; display:block;width:100px;font-size:10px;}"+
                     "#rappm-sch-tab-decisions, #rappm-sch-tab-docs, #rappm-sch-tab-form {margin:10px; margin-left: 250px;}"+
                     "ul#rappm-sch-nav {margin: 0;color: black;font-weight: bold;margin-left: 80px;float: left;display: block;margin-top: 1px;text-align: center;padding: 5px;position: relative;top: 8px;}"+
                     "ul#rappm-sch-nav li {padding: 8px;font-weight: normal;margin: 0;display: block;height: 27px;margin-left: 3px;width: 160px;background: #5f5f5f;floaT: left;color: #d0d0d0;height: 36px;border: 1px solid #222222;}"+
                     "ul#rappm-sch-nav li.rappm-sch-nav-active {background: white;color: #000;font-weight: bold;border: 1px solid #ffffff;text-shadow: #f1f1f1 0px 0px 5px;}" + 
                     "table#rappm-sch tr.rappm-overturn-tr {background:#ff7777; border-left:2px solid #ff7777; border-right:2px solid #ff7777;}" +
                     "table#rappm-sch tr.rappm-sch-m-tr {border-left:2px solid #ff7777; border-right:2px solid #ff7777;}" +
                     "table#rappm-sch tr.markedOt {border-left:2px solid #ff7777; border-right:2px solid #ff7777; border-top:2px solid #ff7777;}" + 
                     ".hidden {display:none}" + 
                     ".hidden-category {display:none}" + 
                     ".hidden-verdict {display:none}" +
                     ".hidden-throwaway {display:none}" +
                     "#rappm-filter {padding: 10px 20px;background: #e2f6ff;border: 1px solid #7ea5b7;overflow:auto;font-size:11px;}" +
                     "#rappm-filter span {font-size: 13px;color: #166a90;}" +
                     "#rappm-filter label {font-weight: normal;margin: 0px 10px 5px 3px;font-size: 12px;position: relative;bottom: 2px;}" +
                     ".rappm-filter-title {clear: both;font-size: 12px;margin-top: 5px;border-bottom: 1px solid #b9dae8;margin-bottom: 2px;font-weight: bold;color: #165875;}" +
                     ".rappm-filter-pair {float:left}" +
                     ".rappm-filter-control {clear:both}" +
                     ".maximized {margin:10px !important;}" + 
                     ".rappm-navToggle {display: block;width: 45px;height: 35px;background: url("+$expandImage+") 0px 0px no-repeat #2b3643;padding: 10px;float: left;margin: 8px 2px;}" +
                     "a#rappm-sch-form-fetch {    background: linear-gradient(to bottom, rgba(255, 255, 255, 0.65) 0%,rgba(0, 0, 0, 0.1) 100%); border:1px solid #9a9a9a;border-radius:3px !important;padding:2px 4px;}"+
                     ".rappm-sch-m-div table {font-size:10px}"+
                     "#floatingCounter {position:absolute;padding-left:10px;right:0px;top:50px;width:100px;height:60px;}" +
                     "#floatingCounter .countSel {background:#fcfdc7}" +
                     "#floatingCounter .countOK {background:#deffc6}" +
                     "#floatingCounter .countOT {background:#ffd9c6}" +
                     "#floatingCounter .countTotal {background:white}" +
                     "#floatingCounter div {padding: 1 5px;font-size: 12px;}"+
                     "#floatingCounter .copyMarked {background: #d9e8fb;padding: 4 4px;border: 1px solid #7ea5b7;font-size: 11px;margin-top: 0px;text-align: center;font-weight: bold;}"+
                     "#floatingCounter span {float: right;}"   +
                     "</style>");
} else {

    $('head').append("<style type='text/css'>" +
                     "#form-n{float:left}" +
                     "#form-b{float:left}" +
                     "#form-i{display:none;clear:both;}" +
                     "#form-m{display:none}" +                     
                     "h2 {margin:0}" +
                     "</style>");
}

// ===========================================================================================

// ======== Initialization functions =========================================================

function initScript() {

    // --------- Parse mentor name -----------------------------------------------------------
    var $logoffButtonText = $('span.username').text();
    $mentorName = $logoffButtonText.substring($logoffButtonText.indexOf("GM: ")+4).trim();    
    // ---------------------------------------------------------------------------------------

    // --------- Create mentor interface -----------------------------------------------------

    var $newMenuItemVersion = "<li class='rapp-menuItem' id='rappm-spotcheck'><a><i class='icon-book-open'></i><span class='title'>Spotcheck (v"+GM_info.script.version+")</span></a></li>";

    var $menu = $('ul.page-sidebar-menu');
    $menu.append($newMenuItemVersion);

    $("#rappm-spotcheck").click(function($event) {
        $event.preventDefault();
        $("#gmNameInput").select();
        showSpotcheckDialog();
    });

}

function showSpotcheckDialog() {

    var $spotcheckDialogContent="";
    $spotcheckDialogContent += "<form id=\"rappm-spotcheckForm\">";
    $spotcheckDialogContent += "<fieldset>";
    $spotcheckDialogContent += "  <label for=\"gmNameInput\">GM Name<\/label>  ";
    $spotcheckDialogContent += "  <input id=\"gmNameInput\" name=\"gmNameInput\" type=\"text\" placeholder=\"\" required=\"\"><br>";
    $spotcheckDialogContent += "  <label for=\"lastSpotcheckInput\">Last spotcheck<\/label>  ";
    $spotcheckDialogContent += "  <input id=\"lastSpotcheckInput\" name=\"lastSpotcheckInput\" type=\"text\" placeholder=\"mm\/dd\/yy\" required=\"\">";
    $spotcheckDialogContent += "<\/fieldset>";
    $spotcheckDialogContent += "<img style='margin-top:5px;visibility: hidden;' src="+$loadingImage+">";
    $spotcheckDialogContent += "<\/form>";


    $("body").append($spotcheckDialogContent);

    $("#rappm-spotcheckForm input").on('click', function () {
        this.select();
    });

    $("#gmNameInput").on('paste', function () {
        setTimeout(function () {
            var pastedText = $("#gmNameInput").val().split("\t");
            $("#gmNameInput").val(pastedText[0]);
            if (pastedText.length>1) {
                $("#lastSpotcheckInput").val(pastedText[1]);
            }
        } , 100);
    });

    var $spotcheckDialog = $("#rappm-spotcheckForm").dialog({
        autoOpen: true,
        height: 250,
        width: 250,
        modal: true,
        resizable: false,
        title: "RAP+ Mentor Spotcheck",
        buttons: {
            "Start spotcheck": function() {
                var gmName = $("#gmNameInput").val();
                $spotcheckedGmName = gmName;
                var lastSpotcheck = $("#lastSpotcheckInput").val();
                //var validationResult = validateInput(gmName,lastSpotcheck);
                //if (validationResult.success) {
                //    $( document ).ajaxComplete(function() {
                $("#rappm-spotcheckForm img").css("visibility","visible");
                initAll(gmName,lastSpotcheck);
                $( document ).ajaxComplete(function() {
                    $("#rappm-spotcheckForm img").css("visibility","hidden");
                    $spotcheckDialog.dialog( "close" );
                });
                //    });
            },
            "Cancel": function() {
                $spotcheckDialog.dialog( "close" );
            }
        }
    });

    //    $spotcheckDialog.dialog("open");

}

function checkPriors($currentDecisionTitle) {
    var $result = {
        chatAbuse:0,
        other:0
    };
    var $9monthsAgo = new Date((new Date()).setMonth((new Date()).getMonth()-9));
    var $priorDecisionsTitles = $currentDecisionTitle.nextAll("p");

    $priorDecisionsTitles.each(function (i) {

        var $priorDecision = {
            id:0,
            verdict:"Innocnet",
            ticket:0,
            judgedOn:0,
            category:"",
        };

        var $p = $(this);
        var ptxt = $p.text();

        $priorDecision.id = $p.find("a:eq(0)").text().trim();
        var $priorDetails = $p.closest('.page-wrapper').find("#decisionModal-"+$priorDecision.id+" .modal-body").text();
        $priorDecision.ticket = $priorDetails.substring($priorDetails.indexOf("Ticket id:")+10,$priorDetails.indexOf("Match id:")).trim();
        $priorDecision.verdict = ptxt.substring(ptxt.indexOf("|")+1,ptxt.lastIndexOf("(")).trim();
        var $priorTicketDetail = $p.nextUntil("p").filter("a:contains('"+$priorDecision.ticket+"')").first().text();
        $priorDecision.category = $priorTicketDetail.substring($priorTicketDetail.indexOf(" - ")+3).trim();
        $priorDecision.judgedOn =  new Date(ptxt.substring((ptxt.indexOf("judged on")+10),(ptxt.indexOf("|")-1)).trim());

        //Check if the prior is more recent than 9 months
        if (($priorDecision.judgedOn > $9monthsAgo) && ($priorDecision.verdict !== "Innocent") && ($priorDecision.verdict !== "Undone")) {
            if ($priorDecision.category == "Verbal abuse") {
                if ($result.chatAbuse === 0) {
                    $result.chatAbuse = $priorDecision.id;
                }
            }
            else {
                if ($result.other === 0) {
                    $result.other = $priorDecision.id;
                }

            }

        }
    });
    return $result;
}

function initAll(gmName,lastSpotcheck) {

    var filters= '' +
        '<div id="rappm-filter">' +
        ' <span>Filter decisions [+]</span>' +
        ' <div id="rappm-filter-category">' +
        '  <div class="rappm-filter-title">Category</div>'+
        '  <div class="rappm-filter-control">' +
        '   <a href="#" class="rappm-filter-sal">Show All</a> | ' +
        '   <a href="#" class="rappm-filter-hal">Hide All</a>' +
        '  </div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-aia" checked><label for="rappm-filter-aia">Ability or item abuse</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-afk" checked><label for="rappm-filter-afk">Avoiding AFK detection</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-bad" checked><label for="rappm-filter-bad">Bad Nickname</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-fed" checked><label for="rappm-filter-fed">Feeding</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-stf" checked><label for="rappm-filter-stf">Staff impersonation</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-ver" checked><label for="rappm-filter-ver">Verbal abuse</label></div>' +
        ' </div>' +
        ' <div id="rappm-filter-verdict">' +
        '  <div class="rappm-filter-title">Verdict</div>'+
        '  <div class="rappm-filter-control">' +
        '   <a href="#" class="rappm-filter-sal">Show All</a> | ' +
        '   <a href="#" class="rappm-filter-hal">Hide All</a>' +
        '  </div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-g" checked><label for="rappm-filter-g">Guilty</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-w" checked><label for="rappm-filter-w">Warning</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-i" checked><label for="rappm-filter-i">Innocent</label></div>' +
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-u" checked><label for="rappm-filter-u">Undone</label></div>' +        
        ' </div>' +
        ' <div id="rappm-filter-throwaway">' +
        '  <div class="rappm-filter-title">Special</div>'+
        '  <div class="rappm-filter-pair"><input type="checkbox" id="rappm-filter-thr" checked><label for="rappm-filter-thr">Throwaway</label></div>' +
        ' </div>' +
        '</div>';

    var floatingCounter = '<div id="floatingCounter">'+
        '<div class="countSel">Selected<span>0</span></div>'+
        '<div class="countOK">OK<span>0</span></div>'+
        '<div class="countOT">OT<span>0</span></div>'+
        '<div class="countTotal">Total<span>0</span></div>'+
        '<div class="copyMarked"><a>Summary</a></div>'
    '</div>';



    var tableStr="";
    tableStr += "<table id='rappm-sch'>";
    tableStr += "<thead>";
    tableStr += "<tr>";
    tableStr += "<th class=\"rappm-sch-decision\">Decision<\/th>";
    tableStr += "<th class=\"rappm-sch-time\">Time<\/th>";
    tableStr += "<th class=\"rappm-sch-offender\">Offender<\/th>";
    tableStr += "<th class=\"rappm-sch-matchId\">Match ID<\/th>";
    tableStr += "<th class=\"rappm-sch-numMatches\"># of matches<\/th>";
    tableStr += "<th class=\"rappm-sch-ticketId\">Ticket ID<\/th>";
    tableStr += "<th class=\"rappm-sch-verdict\">Verdict<\/th>";
    tableStr += "<th class=\"rappm-sch-category\">Category<\/th>";
    tableStr += "<th class=\"rappm-sch-reason\">Reason given<\/th>";
    tableStr += "<th class=\"rappm-sch-priors\">Priors (relative)<\/th>";
    tableStr += "<th class=\"rappm-sch-status\">Action<\/th>";
    tableStr += "<\/tr>";
    tableStr += "<\/thead>";
    tableStr += "<tbody>";
    tableStr += "<\/tbody>";
    tableStr += "<\/table>";

    var spotcheckFormURL = 'https://docs.google.com/forms/d/e/1FAIpQLSckTqUqn290Keux55sZagoOlXrfAEhEdnWfgbwlC2pAqlFGSg/viewform?entry.1000000=Spot+Check';
    var spotcheckForm = // '<div id="form_div" style="float:right; width: 50%; margin-bottom: 5px; margin-top: 15px;"></div>' +
        '<div id="data_div" style="width: 90%; margin-bottom: 5px; margin-top: 15px; float:left">'+
        //'<strong>Your Name</strong><br><span id="rappm-form-yourname">'+$mentorName+'</span><br>'+
        //'<strong>Who is this Spot Check for?</strong><br><span id="rappm-form-gmname">'+$spotcheckedGmName+'</span><br><br>'+
        '<a href="" id="rappm-sch-form-fetch">Generate formatted feedback for Discord</a><div id="rappm-form-otInfo"></div><textarea id="rappm-form-feedback" style="width:100%;height:100%" class="hidden"></textarea><br>'+
        //'<a href="" id="rappm-sch-form-fill">Fill form \>\></a>'+
        '</div>';
    var mentorDocsURL = 'https://docs.google.com/spreadsheets/d/1QPmry2FhcJkguvk2pxL0CAOsxfCONXS_dfoFFRUSmXQ/edit?usp=drive_web';
    var mentorTable = '<div id="mentor_docs_div" style="width: 100%; margin-bottom: 5px; margin-top: 15px;"><iframe frameborder="0" width="100%" height="'+($(window).height()-90)+'px" src="'+mentorDocsURL+'"></iframe></div>';

    var decisions = [];
    moment().format();

    $('body').css('background-color','#fff');

    var spotcheckStart = moment(lastSpotcheck,'MM/DD/YY').add(1, 'day');
    if ($("#rappm-sch-tab-decisions").length) {
        $("#rappm-sch-tab-decisions").remove();
        $("#rappm-sch-tab-form").remove();
        $("#rappm-sch-tab-docs").remove();
    }
    $(".page-content-wrapper").html('<div id="rappm-sch-tab-decisions" class="rappm-sch-tab-active">'+filters+'<br>'+tableStr+'</div>');
    $(".page-footer").remove();
    $("#rappm-sch-tab-decisions").after('<div id="rappm-sch-tab-form" style="display:none">'+spotcheckForm+'</div>');
    $("#rappm-sch-tab-decisions").after('<div id="rappm-sch-tab-docs" style="display:none">'+mentorTable+'</div>');

    spotcheckFormReady = false;
    //processSpotcheckForm("#form_div iframe");

    $('#rappm-filter-category').slideUp();
    $('#rappm-filter-verdict').slideUp();
    $('#rappm-filter-throwaway').slideUp();    

    $('#rappm-filter span').click(function($event){
        $event.preventDefault();
        if ($(this).text().includes('+')) {
            $('#rappm-filter-category').slideDown();
            $('#rappm-filter-verdict').slideDown();
            $('#rappm-filter-throwaway').slideDown();    
            $(this).text($(this).text().replace('+','-'));
        } else {
            $('#rappm-filter-category').slideUp();
            $('#rappm-filter-verdict').slideUp();
            $('#rappm-filter-throwaway').slideUp();                
            $(this).text($(this).text().replace('-','+'));
        }
    });

    $('.rappm-filter-sal').click(function($event){
        $event.preventDefault();
        $(this).parent().parent().find("input").prop("checked",true);
        $(this).parent().parent().find("input").trigger("change");
    });

    $('.rappm-filter-hal').click(function($event){
        $event.preventDefault();
        $(this).parent().parent().find("input").prop("checked",false);
        $(this).parent().parent().find("input").trigger("change");
    });

    $('#rappm-filter input').change(function($event){
        var suffix = $(this).attr("id").substring($(this).attr("id").lastIndexOf("-")+1);
        if (suffix == 'thr') {
            var $checkbox = $(this);
            var filterType = 'throwaway';
            $('#rappm-sch tr[id^=rappm-sch-tr]').each(function(index){
                if ($(this).find('.rappm-sch-throwaway').length===0) {
                    if (!$checkbox.prop("checked")) {
                        $(this).addClass('hidden-'+filterType);
                        $(this).nextUntil('tr[id^=rappm-sch-tr]').addClass('hidden-'+filterType);
                    } else {
                        $(this).removeClass('hidden-'+filterType);
                        $(this).nextUntil('tr[id^=rappm-sch-tr]').removeClass('hidden-'+filterType);
                    }
                }
            });
        } else {
            var label = $(this).next("label").text();
            var filterType = $(this).parent().parent().attr("id").includes('category')?'category':'verdict';
            var $checkbox = $(this);

            $('#rappm-sch tr[id^=rappm-sch-tr]').each(function(index){
                if ($(this).find('.rappm-sch-'+filterType).text() == label) {
                    console.log($checkbox.prop("checked"));
                    if (!$checkbox.prop("checked")) {
                        $(this).addClass('hidden-'+filterType);
                        $(this).nextUntil('tr[id^=rappm-sch-tr]').addClass('hidden-'+filterType);
                    } else {
                        $(this).removeClass('hidden-'+filterType);
                        $(this).nextUntil('tr[id^=rappm-sch-tr]').removeClass('hidden-'+filterType);
                    }
                }
            });
        }
    });

    // Hide navigation & add a button to show it
    //$("#rappm-sch-tab-decisions").nextAll().remove();
    $("#rappm-sch-tab-decisions, #rappm-sch-tab-docs, #rappm-sch-tab-form").addClass("maximized");
    $(".page-sidebar-wrapper").addClass("hidden");
    $(".rappm-navToggle").remove();
    $(".page-logo").after("<a href='' class='rappm-navToggle'></a>");
    $(".rappm-navToggle").click(function($event) {
        $event.preventDefault();
        if ($(".page-sidebar-wrapper").hasClass("hidden")) {
            $("#rappm-sch-tab-decisions, #rappm-sch-tab-docs, #rappm-sch-tab-form").removeClass("maximized");
            $(".page-sidebar-wrapper").removeClass("hidden");
        } else {
            $("#rappm-sch-tab-decisions, #rappm-sch-tab-docs, #rappm-sch-tab-form").addClass("maximized");
            $(".page-sidebar-wrapper").addClass("hidden");
        }
    });

    if (!$("#rappm-sch-nav").length) {
        $(".top-menu").before('<ul id="rappm-sch-nav"><li id="rappm-sch-nav-docs">Mentor Doc</li>'+
                              '<li id="rappm-sch-nav-decisions" class="rappm-sch-nav-active">Decisions overview</li>'+
                              '<li id="rappm-sch-nav-form">Discord feedback</li>' + '</ul>' + floatingCounter);

        $('#floatingCounter .copyMarked').click(function($event){
            $event.preventDefault();
            var markedDecisions = $mentorName + ' ' + gmName + ' ';
            if ($('tbody tr[class^="marked"]').length) {
                $('tbody tr[class^="marked"]').each(function (i) {
                    markedDecisions += $(this).find('.rappm-sch-decision').text() + ' ';
                });
            }
            GM_openInTab('https://docs.google.com/forms/d/e/1FAIpQLSe5T16rmPh5xUaQVFmBZ3rwekNuca7EJXwkS92nPEw3SDmxvA/viewform?entry.958854914='+markedDecisions);
        });

        $("#rappm-sch-nav-decisions").click(function($event) {
            if (!$(this).hasClass('rappm-sch-nav-active')) {
                $('.rappm-sch-nav-active').removeClass('rappm-sch-nav-active');
                $(this).addClass('rappm-sch-nav-active');

                $('.rappm-sch-tab-active').css('display','none');
                $('.rappm-sch-tab-active').removeClass('rappm-sch-tab-active');

                $("#rappm-sch-tab-decisions").css('display','block');
                $("#rappm-sch-tab-decisions").addClass('rappm-sch-tab-active');
                $("#floatingCounter").removeClass('hidden');
            }
        });
        $("#rappm-sch-nav-form").click(function($event) {
            if (!$(this).hasClass('rappm-sch-nav-active')) {
                $('.rappm-sch-nav-active').removeClass('rappm-sch-nav-active');
                $(this).addClass('rappm-sch-nav-active');

                $('.rappm-sch-tab-active').css('display','none');
                $('.rappm-sch-tab-active').removeClass('rappm-sch-tab-active');

                $("#rappm-sch-tab-form").css('display','block');
                $("#rappm-sch-tab-form").addClass('rappm-sch-tab-active');
                $("#floatingCounter").addClass('hidden');
            }
        });
        $("#rappm-sch-nav-docs").click(function($event) {
            if (!$(this).hasClass('rappm-sch-nav-active')) {
                $('.rappm-sch-nav-active').removeClass('rappm-sch-nav-active');
                $(this).addClass('rappm-sch-nav-active');

                $('.rappm-sch-tab-active').css('display','none');
                $('.rappm-sch-tab-active').removeClass('rappm-sch-tab-active');

                $("#rappm-sch-tab-docs").css('display','block');
                $("#rappm-sch-tab-docs").addClass('rappm-sch-tab-active');
                $("#floatingCounter").addClass('hidden');
            }
        });
    } else {
        $("#rappm-sch-nav-decisions").trigger("click");
        $('#floatingCounter .copyMarked').off("click");
        $('#floatingCounter .copyMarked').click(function($event){
            $event.preventDefault();
            var markedDecisions = $mentorName + ' ' + gmName + ' ';
            if ($('tbody tr[class^="marked"]').length) {
                $('tbody tr[class^="marked"]').each(function (i) {
                    markedDecisions += $(this).find('.rappm-sch-decision').text() + ' ';
                });
            }
            GM_openInTab('https://docs.google.com/forms/d/e/1FAIpQLSe5T16rmPh5xUaQVFmBZ3rwekNuca7EJXwkS92nPEw3SDmxvA/viewform?entry.958854914='+markedDecisions);
        });
    }

    function composeUrl(searchFilters,searchValues,from,to,queryFilter,queryValue){
        var url = "https://rap.heroesofnewerth.com/gm/tickets/judged/data?";
        if (searchFilters.constructor !== Array) {
            searchFilters = ["id",searchFilters];
        } else {
            searchFilters.unshift("id");
        }
        if (searchValues.constructor !== Array) {
            searchValues = ["",searchValues];
        } else {
            searchValues.unshift("");
        }
        if (searchFilters.length >= searchValues.length) {
            for (var i = 0, len = searchFilters.length; i < len; i++) {
                var sv = searchValues[i]===undefined?"":searchValues[i];
                url += "columns["+i+"][data]="+searchFilters[i]+"&"+
                    "columns["+i+"][name]="+searchFilters[i]+"&"+
                    "columns["+i+"][searchable]="+((sv==="")?"false":"true")+"&"+
                    "columns["+i+"][orderable]="+((i===0)?"true":"false")+"&"+
                    "columns["+i+"][search][value]="+sv+"&"+
                    "columns["+i+"][search][regex]=false&";
            }
            url += "order[0][column]=0&"+
                "order[0][dir]=desc&"+
                "start="+from+"&"+
                "length="+to+"&"+
                "search[value]=&"+
                "search[regex]=false&"+
                "search_filter="+queryFilter+"&"+
                "search_query="+queryValue;
            return url;
        } else {
            throw "Error: Few search filters than values.";
        }
    }


    $.ajax({
        url: composeUrl(['id','time','status','ticket_id','offender','offenderAction'],[],0,200,"gm",gmName),
        success: function(data){
            var judged = data.data;
            for (i = 0; i < judged.length; i++) {
                var entry = judged[i];
                if ($(entry.offenderAction).find("a").length) {
                    var decisionTime = moment(entry.time,'YYYY-MM-DD HH:mm:ss');
                    if (decisionTime>spotcheckStart) {
                        console.log(entry.offenderAction);
                        var ticketUrl = $(entry.offenderAction).find("a").attr("href").trim();
                        var offender =  $(entry.offenderAction).find("a").text().trim();
                        var decision = {
                            id : entry.id,
                            time : entry.time,
                            verdict : entry.status,
                            ticketId : entry.ticket_id,
                            offender : offender,
                            throwaway : "",
                            link: ticketUrl,
                            chatlogLink : "",
                            downloadLink : "",
                            matchId: "",
                            matches : [],
                            category : "",
                            reason : "",
                            priors : {
                                chatAbuse: 0,
                                other: 0
                            }
                        };
                        decisions.push(decision);
                    }
                    else {
                        break;
                    }
                }
            }
            var loadingImage = "<img style='margin-top:5px;visibility: visible' src="+$loadingImage+">";
            decisions.forEach(function (decision) {
                $("#rappm-sch tbody").append("<tr id='rappm-sch-tr"+decision.id+"'></tr>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-decision\"><a href='"+decision.link+"'>"+decision.id+"</a><\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-time\">"+decision.time+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-offender\">"+decision.offender+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-matchId\">"+loadingImage+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-numMatches\">"+loadingImage+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-ticketId\">"+decision.ticketId+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-verdict\">"+decision.verdict+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-category\">"+loadingImage+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-reason\">"+loadingImage+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-priors\">"+loadingImage+"<\/td>");
                $("#rappm-sch tbody tr:last").append("<td class=\"rappm-sch-action\">"+
                                                     "<a class='rappm-sch-status rappm-sch-btn' href='#'>Select</a>"+
                                                     //"<a class='rappm-sch-details rappm-sch-btn' href='#'>Fetch other matches & tickets details</a>"+
                                                     "<a class='rappm-sch-replays rappm-sch-btn' href='#'>Request all replays</a>"+
                                                     "<a class='rappm-sch-downloadReplay rappm-sch-btn' href='#'>Download replay</a>"+
                                                     //"<a class='rappm-sch-copyLinks rappm-sch-btn' href='#'>Copy replay links</a>"+
                                                     //#1.4#
                                                     "<a class='rappm-sch-otText rappm-sch-btn' href='#'>OT Copy</a>"+
                                                     "<a class='rappm-sch-pmText rappm-sch-btn' href='#'>PM Copy</a>"+
                                                     "<\/td>");
            });

            // parseTicketPage

            var copyLinksStatus = [{decisionId:"",string:""}];

            // Add batch buttons
            // $("#rappm-sch").before("<a href=# id='rappm-reqAll'>Request All Visible</a> | <a href=# id='rappm-copyAll'>Copy all</a>");
            $("#rappm-sch").before("<a href=# id='rappm-reqAll'>Request All Visible</a> | <a href=# id='rappm-downloadSelected'>Download all selected replays</a> | <a href='#' id='rappm-copyAll'>Copy all decisions</a> "+
                                   '<input type="checkbox" id="rappm-chatScriptCompat"><label for="rappm-chatScriptCompat">Compatibility with <i>GM Chat Extended</i> script</label>');
            $('#rappm-copyAll').on('click', function() {
                var ids = gmName + ' ';
                if ($('.rappm-decisionList').length > 0) {
                    $('.rappm-decisionList').remove();
                }
                $('td.rappm-sch-decision').each(function(index, match) {
                    ids += $(match).find('a')[0].innerText + ' '
                });
                GM_setClipboard(ids);
            });

            $("#rappm-reqAll").click(function ($event) {
                $event.preventDefault();
                $("tr[id^='rappm-sch-tr']:not(tr[class*='hidden'])").find(".rappm-sch-replays").trigger("click");
                //$("tr[id^='rappm-sch-tr']:not(tr[class*='hidden'])").find(".rappm-sch-copyLinks").trigger("click");
            });
            $("#rappm-downloadSelected").click(function ($event) {
                $event.preventDefault();
                $("tr.marked .rappm-sch-downloadReplay").trigger("click");
            });
            $('#rappm-chatScriptCompat').change(function($event){
                if($(this).is(":checked")) {
                    $('.rappm-chlLink').each(function (i) {
                        var chlink = $(this).attr('href');
                        if (!chlink.includes('&items=on&apm=on')) {
                            chlink += "&items=on&apm=on";
                            $(this).attr('href',chlink);
                        }
                    });
                } else {
                    $('.rappm-chlLink').each(function (i) {
                        var chlink = $(this).attr('href');
                        if (chlink.includes('&items=on&apm=on')) {
                            chlink = chlink.split("&items=on&apm=on").join("");
                            $(this).attr('href',chlink);
                        }
                    });
                }
            });

            /*
            $("#rappm-copyAll").click(function ($event) {
                $event.preventDefault();
                var cpy = "";
                $("tr[id^='rappm-sch-tr']:not(tr[class*='hidden'])").find(".rappm-sch-copyLinks").each(function ($event) {
                    var decid = $(this).closest("tr[id^='rappm-sch-tr']").attr("id").substring(12);
                    copyLinksStatus.forEach(function(pair){
                        if (pair !== null) {
                            if (pair.decisionId == decid) {
                                cpy += pair.string;
                            }
                        }
                    });
                });
                GM_setClipboard (cpy);
            });
            */
            //

            var offenses = [
                "Ability or item abuse",
                "Avoiding AFK detection",
                "Bad Nickname",
                "Feeding",
                "Staff impersonation",
                "Verbal abuse"
            ];

            decisions.forEach(function(decision) {
                $.ajax({
                    url: decision.link,
                    success: function(html){
                        var decisionSummaryDivId = "#decisionModal-"+decision.id;
                        var decisionText = $(html).find(decisionSummaryDivId + " .modal-body").text();
                        var $decisionHtml = $(html).find(decisionSummaryDivId + " .modal-body").html();
                        decision.throwaway = $(html).find("#ticketContent tr:contains('Account type:') th:eq(2)").text().trim() == "Regular" &&
                            $(html).find("#ticketContent tr:contains('Standing:') th:eq(2)").text().trim() !== "Legacy" &&
                            decision.verdict == "Guilty" &&
                            $(html).find("#ticketContent").text().includes('Currently suspended');
                        decision.matchId = decisionText.substring(decisionText.indexOf("Match id: ")+10,decisionText.indexOf("Match id: ")+19).trim();
                        decision.reason = $decisionHtml.substring($decisionHtml.indexOf(decision.matchId,$decisionHtml.indexOf(decision.matchId)+1)+19,$decisionHtml.length).trim();
                        decision.chatlogLink = $(html).find("a[href*='chat.php']").attr("href");
                        decision.downloadLink = $(html).find("a[href$='.honreplay']").attr("href");
                        decision.suspension = "";
                        if (decisionText.indexOf("Suspension length: ")>-1) {
                            decision.suspension = decisionText.substring(decisionText.indexOf("Suspension length: ")+19,decisionText.lastIndexOf("Ticket id:")).trim();
                        }
                        var $decisionTitle = $(html).find(".portlet-title:contains('Decisions made') + .portlet-body p a[data-target='"+decisionSummaryDivId+"']").parent();

                        $decisionTitle.nextUntil("p").filter("strong:contains('Match ID')").each(function (i) {

                            var matchId = $(this).text().trim().substring(10,$(this).text().length);
                            var tickets = [];

                            var $decisionElements = $(this).nextUntil("p");
                            //console.log($decisionElements);
                            var nextMatchReached = 0;
                            var $ticketLinks = $decisionElements.filter(function(index){
                                if ($(this).is("strong")) {
                                    nextMatchReached = 1;
                                }
                                return ($(this).is("a[href*='/ticket/']") && !nextMatchReached);
                            });
                            //console.log($ticketLinks);
                            $ticketLinks.each(function(i) {
                                var ticketLinkText = $(this).text().split(" - ");
                                var ticket = {
                                    id : ticketLinkText[0].trim(),
                                    category : ticketLinkText[1].trim(),
                                    link : $(this).attr("href"),
                                    description : "",
                                    gameTime : "",
                                    matchId : matchId,
                                    chatlogLink : "",
                                    downloadLink : ""
                                };
                                tickets.push(ticket);
                            });

                            var match = {
                                id : matchId,
                                tickets : tickets
                            };

                            console.log(tickets.length);

                            decision.matches.push(match);

                        });

                        var $ticketLink = $(html).find("a[href$='/ticket/"+decision.ticketId+"']");
                        var ticketLinkText = $ticketLink.text();
                        decision.category=ticketLinkText.substring(ticketLinkText.indexOf(" - ")+3,ticketLinkText.length).trim();
                        decision.priors = checkPriors($ticketLink);

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-matchId").last().html(decision.matchId+" <a href='"+decision.chatlogLink+"' class='rappm-chlLink'>[CH.L.]</a>");

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-matchId a").last().click(function($event){
                            $event.preventDefault();
                            GM_openInTab(decision.chatlogLink);
                        });


                        // <skipping check>
                        var skippingNote = "";
                        if ((decision.category == "Bad Nickname" || decision.category == "Verbal abuse" || decision.category == "Staff mpersonation")&&
                            (decision.verdict == "Innocent")) {
                            var skipping = findSkipping($(html),decision.ticketId);
                            if (skipping !== false) {
                                skippingNote = "<div style='font-size:10px;display:inline-block;padding:2px;border:red;background:#ffe8e8;color:red;width:200px'>"+skipping+"</div>";
                            }
                        }
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-action").last().append(skippingNote);                    
                        // </skipping check>

                        var countMarked = $('.marked').length+$('.markedOt').length+$('.markedOk').length;
                        var countTotal = $('tr[id^="rappm-sch-tr"]').length;
                        $("#floatingCounter .countTotal span").html('<em style="color:'+((countMarked>9)?'green':'red')+'">' + countMarked + '</em> / ' +
                                                                    '<em style="color:'+((countTotal<10)?'red':'green')+'">' + countTotal + '</em>');
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-numMatches").last().html(decision.matches.length);
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-category").last().html(decision.category);
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-reason").last().html(decision.reason);
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-priors").last().html((decision.priors.chatAbuse > 0 || decision.priors.other > 0) ? "HAS PRIORS" : "");
                        console.log(decision.id+" - "+decision.priors.chatAbuse+" : " +decision.priors.other);
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-status").click(function($event){
                            var $row = $(this).parent().parent();
                            $event.preventDefault();
                            // if is OK, change to OT
                            if ($row.hasClass("markedOk")) {
                                $row.removeClass("markedOk");
                                $row.addClass("markedOt");
                                $(this).text("Unmark");
                                if ($("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr").length || $("#rappm-sch-tr"+decision.id).next(".rappm-sch-m-tr").next(".rappm-overturn-tr").length) {
                                    $("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr").removeClass("hidden");
                                    $("#rappm-sch-tr"+decision.id).next(".rappm-sch-m-tr").next(".rappm-overturn-tr").removeClass("hidden");
                                    $(this).siblings(".rappm-sch-loadMatches").removeClass("hidden");
                                } else {
                                    var matchOptions = "";
                                    decision.matches.forEach(function(match) {
                                        matchOptions += "<option value='"+match.id+"' "+ (match.id==decision.matchId?"selected=''":"") +">"+match.id+"</option>";
                                    });
                                    var categoryOptions = "";
                                    offenses.forEach(function(offense) {
                                        categoryOptions += "<option value='"+offense+"' "+ (offense==decision.category?"selected=''":"") +">"+offense+"</option>";
                                    });

                                    $("#rappm-sch-tr"+decision.id).after("<tr class='rappm-overturn-tr'>" +
                                                                         "<td class=\"rappm-sch-decision\"><\/td>" +
                                                                         "<td class=\"rappm-sch-time\"><strong>Overturn details<\/strong><\/td>" + 
                                                                         "<td class=\"rappm-sch-offender\"><\/td>" +
                                                                         "<td class=\"rappm-sch-matchId\">"+/*"<span class='rappm-new-matchId'><strong>New match:</strong><br><select>"+
                                                                         matchOptions +
                                                                         "</select></span>"+*/"<\/td>" +
                                                                         "<td class=\"rappm-sch-numMatches\"><\/td>" +
                                                                         "<td class=\"rappm-sch-ticketId\"><\/td>" +
                                                                         "<td class=\"rappm-sch-verdict\">"+/*"<span class='rappm-new-verdict'><strong>New verdict:</strong><br><select>"+
                                                                         "<option>Guilty</option>"+
                                                                         "<option>Warning</option>"+
                                                                         "<option>Innocent</option>"+
                                                                         "</select></span>"+*/"<\/td>" +
                                                                         "<td class=\"rappm-sch-category\">"+/*"<span class='rappm-new-category'><strong>New category:</strong><br><select>"+
                                                                         categoryOptions +
                                                                         "</select></span>"+*/"<\/td>" +
                                                                         "<td class=\"rappm-sch-reason\">"+"<span class='rappm-new-reason'><strong>Short OT description:</strong><br><textarea class='rappm-ta-reason' rows='4' cols='50'></textarea>"+
                                                                         "</span>"+"<\/td>" +
                                                                         "<td colspan=\"2\">"+"<strong>Explanation:</strong><br><textarea class='rappm-ta-explanation' rows='4' cols='30'></textarea>"+"<\/td>" +
                                                                         "<\/tr>");
                                    $("#rappm-sch-tr"+decision.id+" .rappm-sch-action").append("<a class='rappm-sch-loadMatches rappm-sch-btn' href='#'>Load all matches</a>");
                                    $("#rappm-sch-tr"+decision.id+" .rappm-sch-loadMatches").click(function($event){
                                        if (!$("#rappm-sch-tr"+decision.id).next(".rappm-sch-m-tr").length) {
                                            $event.preventDefault();
                                            var $row = $(this).parent().parent();
                                            $row.after("<tr class='rappm-sch-m-tr'><td colspan='11'><div class='rappm-sch-m-div'><table>"+
                                                       "<tr class='rappm-sch-tr-matchHeader'>"+
                                                       "<th>Match ID</th>"+
                                                       "<th>Summary of tickets</th>"+
                                                       "<th>Actions</th>"+
                                                       //http://rap.heroesofnewerth.com/chat.php?match_id=147432893&highlight[]=Infeell1:030&highlight[]=tonhito1510:300
                                                       "</tr>"+
                                                       "</table><div></td></tr>");
                                            var $div = $row.next(".rappm-sch-m-tr").find(".rappm-sch-m-div");
                                            $div.slideDown();
                                            decision.matches.forEach(function(match){
                                                $div.find("table").append("<tr id='rappm-sch-tr-m"+match.id+"'>"+
                                                                          "<td class='rappm-sch-m-id'>"+match.id+"</td>"+
                                                                          "<td class='rappm-sch-m-summary'>"+loadingImage+"</td>"+
                                                                          "<td class='rappm-sch-m-actions'>"+loadingImage+"</td>"+
                                                                          "</tr>");
                                                $div.css("background",$row.css("background"));
                                                var $matchRow = $("#rappm-sch-tr-m"+match.id);
                                                var matchSummary = "Reports:";
                                                var counter = 0;
                                                match.tickets.forEach(function(ticket){
                                                    $.ajax({
                                                        url: ticket.link,
                                                        dataType : 'html',
                                                        type: 'GET',
                                                        success: function(data){
                                                            ticket.gameTime = $(data).find('td:contains("Game time:")').next().next().text().trim();
                                                            ticket.description = $(data).find('td:contains("Description:")').next().next().text().trim();
                                                            ticket.chatlogLink = $(data).find("a[href*='chat.php']").attr("href");
                                                            console.log(ticket);

                                                            counter++;

                                                            matchSummary += "<br>"+ticket.category;
                                                            if (ticket.gameTime != "") {
                                                                matchSummary += " @["+ticket.gameTime+"]";
                                                            }
                                                            if (ticket.description != "") {
                                                                matchSummary += " ("+ticket.description+")";
                                                            }

                                                            if (counter==match.tickets.length) {
                                                                $matchRow.find(".rappm-sch-m-summary").html(matchSummary);
                                                                $matchRow.find(".rappm-sch-m-actions").html("<a id='rappm-sch-m-chl"+match.id+"' class='rappm-chlLink' href='#'>Chatlog</a> | "+
                                                                                                            "<a id='rappm-sch-m-anal"+match.id+"' href='#'>Analyser</a> | "+
                                                                                                            "<a id='rappm-sch-m-tl"+match.id+"' href='#'>Ticket link</a>"+
                                                                                                            /* "<a id='rappm-sch-m-use"+match.id+"' href='#'>Use match in OT</a>"*/ "");
                                                                $("#rappm-sch-m-chl"+match.id).click(function($event){
                                                                    $event.preventDefault();
                                                                    GM_openInTab(ticket.chatlogLink);
                                                                });
                                                                $("#rappm-sch-m-anal"+match.id).click(function($event){
                                                                    $event.preventDefault();
                                                                    GM_openInTab(getChatlogAnalyserLink(match.id,decision.offender));
                                                                });
                                                                $("#rappm-sch-m-tl"+match.id).click(function($event){
                                                                    $event.preventDefault();
                                                                    GM_openInTab(ticket.link);
                                                                });
                                                                $("#rappm-sch-m-use"+match.id).click(function($event){
                                                                    $event.preventDefault();
                                                                    $row.next().next(".rappm-overturn-tr").find(".rappm-new-matchId select").val(match.id);
                                                                });
                                                            }
                                                        }
                                                    });
                                                });

                                            });
                                        } else {
                                            var $otherMatchesTable = $("#rappm-sch-tr"+decision.id).next(".rappm-sch-m-tr");
                                            if ($otherMatchesTable.hasClass("hidden")) {
                                                $otherMatchesTable.removeClass("hidden");
                                                $(this).siblings(".rappm-sch-loadMatches").removeClass("hidden");
                                            }
                                        }

                                    });
                                }
                                // if is OT, change to nothing
                            } else if ($row.hasClass("markedOt")) {
                                $(this).siblings(".rappm-sch-loadMatches").addClass("hidden");
                                $row.removeClass("markedOt");
                                $("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr").addClass("hidden");
                                $("#rappm-sch-tr"+decision.id).next(".rappm-sch-m-tr").next(".rappm-overturn-tr").addClass("hidden");
                                $("#rappm-sch-tr"+decision.id).next(".rappm-sch-m-tr").addClass("hidden");
                                $(this).text("Select");
                                // if is marked, change to OK
                            } else if ($row.hasClass("marked")) { 
                                $row.removeClass("marked");
                                $row.addClass("markedOk");
                                $(this).text("Mark OT");
                                // if is nothing, change to marked
                            } else {
                                $row.addClass("marked");
                                $(this).text("Mark OK");
                            }

                            $("#floatingCounter .countSel span").html($('.marked').length);
                            $("#floatingCounter .countOK span").html($('.markedOk').length);
                            $("#floatingCounter .countOT span").html($('.markedOt').length);
                            var countMarked = $('.marked').length+$('.markedOt').length+$('.markedOk').length;
                            var countTotal = $('tr[id^="rappm-sch-tr"]').length;
                            $("#floatingCounter .countTotal span").html('<em style="color:'+((countMarked>9)?'green':'red')+'">' + countMarked + '</em> / ' +
                                                                        '<em style="color:'+((countTotal<10)?'red':'green')+'">' + countTotal + '</em>');

                        });

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-decision a").click(function($event){
                            $event.preventDefault();
                            GM_openInTab($(this).attr("href"));
                        });

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-replays").click(function($event){
                            $event.preventDefault();
                            var $button = $(this);
                            var counter = 0;
                            decision.matches.forEach(function(match){
                                var url = "https://rap.heroesofnewerth.com/api/rap/replays/request/match_id/"+match.id;
                                $.ajax({
                                    url:url,
                                    type:"GET",
                                    success: function(data){
                                        counter++;
                                        if (decision.matches.length == counter) {
                                            $button.text("All replays requested");
                                        }
                                    }
                                });
                            });
                        });

                        if (decision.throwaway) {
                            // --------- Add new menu item - Report Throwaway Account Link ---------------------------
                            var $throwawayURL = "https://docs.google.com/forms/d/e/1FAIpQLSfkxBuu5vMBynxXmBOlcywJTmz3xYaL2PnIMzXlRnnAeBPiWg/viewform";
                            var $throwawayFieldGM = "1074411029";
                            var $throwawayFieldReported = "1839907460";
                            var $throwawayFieldTicket = "1618775217";
                            var $throwawayFields = "?entry."+$throwawayFieldGM+"=" + $mentorName +"&entry."+$throwawayFieldReported+"=" + decision.offender;

                            $("#rappm-sch-tr"+decision.id+" .rappm-sch-action").append("<a class='rappm-sch-throwaway rappm-sch-btn' href='"+$throwawayURL+$throwawayFields+"'>Report throwaway</a>");

                            $("#rappm-sch-tr"+decision.id+" .rappm-sch-throwaway").click(function($event){
                                var $link = $(this).attr("href").concat("&entry."+$throwawayFieldTicket+"=" + decision.ticketId);
                                if($link.length > 0) {
                                    GM_openInTab($link);
                                }
                                $event.preventDefault();
                            });
                            // ---------------------------------------------------------------------------------------
                        }

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-otText").click(function($event){
                            $event.preventDefault();
                            if(decision.otText !== 'undefined') {
                                var date = new Date(Date.now()).toLocaleDateString("en-US");
                                var $otDetailsRow;
                                if (!$("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr").length) {
                                    $otDetailsRow = $("#rappm-sch-tr"+decision.id).next().next(".rappm-overturn-tr");
                                } else {
                                    $otDetailsRow = $("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr");
                                }
                                var newReason = '';
                                if ($otDetailsRow.find(".rappm-ta-reason").length) {
                                    newReason = $otDetailsRow.find(".rappm-ta-reason").val().split('\n').join(';');
                                } else {
                                    newReason = '~~~~~~~~~~ reason for OT ~~~~~~~~~~'
                                }
                                GM_setClipboard(decision.offender + '\t' + gmName + '\t' +  $mentorName + '\t' + date + '\t\t' + decision.id + '\t' + decision.verdict + '\t\t\t' + newReason);
                            }
                        });
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-pmText").click(function($event){
                            $event.preventDefault();
                            var $otDetailsRow;
                            if (!$("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr").length) {
                                $otDetailsRow = $("#rappm-sch-tr"+decision.id).next().next(".rappm-overturn-tr");
                            } else {
                                $otDetailsRow = $("#rappm-sch-tr"+decision.id).next(".rappm-overturn-tr");
                            }
                            var newExplanation = '';
                            if ($otDetailsRow.find(".rappm-ta-explanation").length) {
                                newExplanation =$otDetailsRow.find(".rappm-ta-explanation").val();
                            } else {
                                newExplanation = '~~~~~~~~~~ explanation of the mistake ~~~~~~~~~~';
                            }
                            var pmMessage = ""+
                                "Hello " + gmName + ",\n" +
                                "your [url=" + decision.link + "]decision #" + decision.id + "[/url] (details below) was incorrect.\n"+
                                "[spoiler]"+
                                "[table]Player | "+decision.offender+"\n"+
                                "Match ID | [m]"+decision.matchId+"[/m]\n"+
                                "Verdict | "+(decision.verdict=="Guilty"?"[color=red]Guilty[/color]":(decision.verdict=="Warning"?"[color=orange]Warning[/color]":"[color=green]Innocent[/color]"))+"\n"+
                                "Category | "+decision.category+
                                ((decision.suspension.length<1)?"[/table]\n":("\nSuspension | "+decision.suspension+"[/table]\n"))+
                                (((decision.verfict=="Innocent")&&(decision.reason.trim()===""))?"\n":
                                 ("[b][color=white]Your description[/color][/b]\n[hr][/hr][indent]"+$('<div>').html(uncensorText(decision.reason)).text()+"[/indent]"))+
                                "[hr][/hr]\nSubmitted "+decision.time+"[/spoiler]\n"+
                                uncensorText(newExplanation)+
                                "\n\n"+
                                "Please read the [url=https://forums.heroesofnewerth.com/showthread.php?546907-Overturns-and-how-to-avoid-them-RAP-Q-amp-A-(Trials-please-read)]Overturns and how to avoid them[/url]"+
                                " forum post or contact me or other mentors for instructions in how to avoid more overturns in the future.\n" +
                                "Should you disagree with the overturn, then it can be [url=https://rap.heroesofnewerth.com/gm/tasks/create]appealed in the GM Portal[/url] for an SGM to review." +
                                "\n\n"+
                                "Regards,\n"+
                                $mentorName;
                            GM_setClipboard(pmMessage);
                        });

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-downloadReplay").click(function($event){
                            $event.preventDefault();
                            if(decision.downloadLink !== 'undefined') {
                                GM_openInTab(decision.downloadLink);
                            }
                        });

                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-copyLinks").click(function($event){
                            $event.preventDefault();
                            var copyLinksString = "";
                            copyLinksStatus.forEach(function(pair){
                                if (pair !== null) {
                                    if (pair.decisionId == decision.id) {
                                        copyLinksString = pair.string;
                                    }
                                }
                            });
                            if (copyLinksString === "") {
                                var $button = $(this);
                                $button.text($button.text()+"[0/"+decision.matches.length+"]");
                                $event.preventDefault();
                                var output = decision.offender + ";";
                                decision.matches.forEach(function(match){
                                    $.ajax({
                                        url:match.tickets[0].link,
                                        success: function(data){
                                            output = output + $(data).find("a[href*='.amazo']").attr("href").trim().replace(".honreplay",".zip") + ";";
                                            var btnSplit = $button.text().split("[");
                                            var btnTextEnd = btnSplit[1].substring(btnSplit[1].indexOf("/"));
                                            var numberOfLoaded = parseInt(btnSplit[1].substring(0,btnSplit[1].indexOf("/")))+1;
                                            if (numberOfLoaded == decision.matches.length) {
                                                $button.text(btnSplit[0]);
                                                GM_setClipboard (output);
                                                var entry = {
                                                    decisionId : decision.id,
                                                    string : output
                                                };
                                                copyLinksStatus.push(entry);
                                            } else {
                                                $button.text(btnSplit[0] +"["+numberOfLoaded+ btnTextEnd);
                                            }
                                        }
                                    });
                                });
                            } 
                            else GM_setClipboard (copyLinksString);
                        });


                        /*$('#rappm-sch-form-fill').unbind("click");
                        $('#rappm-sch-form-fill').click(function($event) {
                            $event.preventDefault();
                            collectSpotcheckData(decisions);
                            GM_setValue("dataChanged",true);
                            //updateSpotcheckForm();
                        });*/
                        $('#rappm-sch-form-fetch').unbind("click");
                        $('#rappm-sch-form-fetch').click(function ($event) {
                            $event.preventDefault();

                            $('#hdrfb').remove();
                            $("#rappm-form-feedback").remove(); //remove feedback text area and create a new one, to reset the feedback text if it changed
                            
                            $("#data_div").append('<textarea id="rappm-form-feedback" style="width:100%;height:100%" class=""></textarea>')
                            $('#rappm-form-feedback').before("<div id='hdrfb'><br><strong>Discord feedback</strong><div>");
                            $('.markedOt').each(function () {
                                var OTtext = "";
                                var feedbackText = "";
                                var decId = $(this).find('.rappm-sch-decision').text().trim();
                                decisions.forEach(function (dec) {
                                    if (dec.id == decId) {
                                        var $otDetailsRow;
                                        if (!$("#rappm-sch-tr" + decId).next(".rappm-overturn-tr").length) {
                                            $otDetailsRow = $("#rappm-sch-tr" + decId).next().next(".rappm-overturn-tr");
                                        } else {
                                            $otDetailsRow = $("#rappm-sch-tr" + decId).next(".rappm-overturn-tr");
                                        }
                                        //var newVerdict = $otDetailsRow.find(".rappm-new-verdict select option:selected").text();
                                        //var newMatch = $otDetailsRow.find(".rappm-new-matchId select option:selected").text();
                                        //var newTicket = getTicketForMatch(newMatch, dec);
                                        //var newCategory = $otDetailsRow.find(".rappm-new-category select option:selected").text();
                                        var reg = new RegExp('(`|_|\\*|~)', 'gi');
                                        var reg2 = new RegExp('(`{3,})', 'gi');
                                        var newOffender = dec.offender.replaceAll(reg, '\\$1');
                                        var newReason = $otDetailsRow.find(".rappm-ta-reason").val().split('\n').join('<br>').replace('<br><br><br>', '<br>').replace('<br><br>', '<br>').replace('<br><br>', '<br>').replaceAll(reg, '\\$1');
                                        var newExplanationRaw = $otDetailsRow.find(".rappm-ta-explanation").val().replaceAll(reg, '\\$1');
                                        var newExplanation = newExplanationRaw.split('\n').filter(word => word.length > 0).join('_<br>_').split('__').join('');
                                        var reason = dec.reason.split('\n').join('<br>').split('<br><br><br>').join('<br>').split('<br><br>').join('<br>');
                                        if (reason.match(reg2)) {
                                            reason = reason.replaceAll('`', 'ยด');
                                        }
                                        //var tab = "&#09;";
                                        // var tabCount = Math.ceil(6-(dec.offender.length/2));
                                        OTtext = "Decision " + dec.id + " - " + dec.verdict + " - " + newReason.trim();
                                        feedbackText = ":bust_in_silhouette: Player: " + newOffender + " &nbsp;| &nbsp;:movie_camera: Match: " + dec.matchId + " &nbsp;| &nbsp;:writing_hand: Your decision: _" + dec.verdict + (" (" + dec.category + ")") + "_<br>**Your description:**" +
                                            ((dec.reason === "") ? " N/A<br>" : "<br>```<br>" + reason + "<br>```<br>") +
                                            "**My comments:**<br>_" + newExplanation + "_<br>" +
                                            "<br>";
                                        feedbackText = feedbackText.split('<br>').join('\n').split('\n\n').join('\n');
                                    }

                                });
                                //$('#rappm-form-otInfo').append(OTtext+"<br>");
                                $('#rappm-form-feedback').append(feedbackText + "\n\n");
                            });
                        });


                        //console.log($(".rappm-sch-tr"+decision.id+" .rappm-sch-decision a"));
                        //console.log($(".rappm-sch-tr"+decision.id+" .rappm-sch-copyLinks"));
                        //console.log($(".rappm-sch-tr"+decision.id+" .rappm-sch-status"));
                        //console.log($(".rappm-sch-tr"+decision.id+" .rappm-sch-replays"));
                        // do later
                        $("#rappm-sch-tr"+decision.id+" .rappm-sch-details").click(function($event){
                            $event.preventDefault();
                            var $row = $(this).parent().parent();
                            $row.after("<tr class='rappm-sch-tr-matchHeader'>"+
                                       "<th class='rappm-sch-nullTd'></th>" +
                                       "<th>Match ID</th>"+
                                       "<th>Summary of tickets</th>"+
                                       "<th>Actions</th>"+
                                       //http://rap.heroesofnewerth.com/chat.php?match_id=147432893&highlight[]=Infeell1:030&highlight[]=tonhito1510:300
                                       "</tr>");
                            decision.matches.forEach(function(match){
                                $row.next().after("<tr id='rappm-sch-tr-m"+match.id+"><td class='rappm-sch-nullTd'></td></tr>");
                                var $matchRow = $("#rappm-sch-tr-m"+match.id);
                                $matchRow.append("<td>"+match.id+"</td>");
                                $.ajax({
                                });
                            });
                        });


                    }
                });
            });


        }
    });
}

function getChatlogAnalyserLink(matchId,player) {
    return 'https://rap.heroesofnewerth.com/gm/ajax/chat/parse/match_id/'+matchId+'/player_name/'+player;
}

function getTicketForMatch(newMatch,decision) {
    var result;
    decision.matches.forEach(function(match){
        if (match.id==newMatch) {
            result = match.tickets[0].id;
        }
    });
    return result;
}

function collectSpotcheckData(decisions) {
    GM_setValue("sch-gm",$spotcheckedGmName);
    GM_setValue("sch-mentor",$mentorName);

    var ots = "";
    $('.markedOt').each(function(){
        var OTtext = "";
        var decId = $(this).find('.rappm-sch-decision').text().trim();
        decisions.forEach(function (dec) {
            if (dec.id == decId) {
                var $otDetailsRow;
                if (!$("#rappm-sch-tr"+decId).next(".rappm-overturn-tr").length) {
                    $otDetailsRow = $("#rappm-sch-tr"+decId).next().next(".rappm-overturn-tr");
                } else {
                    $otDetailsRow = $("#rappm-sch-tr"+decId).next(".rappm-overturn-tr");
                }
                var newVerdict = $otDetailsRow.find(".rappm-new-verdict select option:selected").text();
                var newMatch =   $otDetailsRow.find(".rappm-new-matchId select option:selected").text();
                var newTicket =   getTicketForMatch(newMatch,dec);
                var newCategory = $otDetailsRow.find(".rappm-new-category select option:selected").text();
                var newReason = $otDetailsRow.find(".rappm-ta-reason").val();
                var newExplanation =$otDetailsRow.find(".rappm-ta-explanation").val();
                OTtext = "Decision "+dec.id+" | Match "+newMatch+" | Ticket "+newTicket+"\n"+
                    dec.verdict + (dec.verdict=="Innocent"?"":(" ("+dec.category+")")) + " -> " +
                    newVerdict + (newVerdict=="Innocent"?"":(" (" + newCategory + ")")) +"\n\n"+
                    (newReason.trim()==""?"":(newReason + "\n\n"))+
                    (newExplanation.trim()==""?"":("(" + newExplanation +")" +"\n\n"))+
                    "----------------------------------------------------------"+ "\n";
            }

        });
        ots += "\n"+OTtext;
    });
    GM_setValue("sch-ots",ots);
}


function processSpotcheckForm() {
    $('#group_1000000_1').prop('checked',true);
    var url = $('form').attr('action').trim();
    $("#ss-submit").trigger("click");
    var interval1 = setInterval(function () {
        if ($(".ss-q-title:contains('Did you manage to contact the GM you spotchecked?')").length) {
            GM_setValue("formReady",true);
            console.log("Form ready");
        }
    }, 1000);

    var reformated = false;
    var interval2 = setInterval(function () {
        if (GM_getValue("formReady")) { /*
            if (!reformated) {
                $("link[rel='stylesheet']:eq(1)").remove();
                $("form ol").children("div:eq(0)").before("<div id='form-n'>");
                $("form ol").children("div:eq(3)").after("</div>");
                $("form ol").children("div:eq(4)").before("<div id='form-b'>");
                $("form ol").children("div:eq(6)").after("</div>");
                $("form ol").children("div:eq(7)").before("<div id='form-o'>");
                $("form ol").children("div:eq(8)").after("</div>");
                $("form ol").children("div:eq(9)").before("<div id='form-m'>");
                $("form ol").children("div:eq(10)").after("</div>");
                reformated = true;
            }*/
            clearInterval(interval1);
            if (GM_getValue("dataChanged")) {
                updateSpotcheckForm();
                GM_setValue("dataChanged",false);
            }
        }
    }, 1000);

}

function updateSpotcheckForm() {
    if (GM_getValue("formReady")) {
        $("#entry_1000001").val(GM_getValue("sch-mentor"));
        $("#entry_1000001").addClass("valid");
        $("#entry_1000003").val(GM_getValue("sch-gm"));
        $("#entry_1000003").addClass("valid");
        $("#entry_1000011").val(GM_getValue("sch-ots"));
        $("#entry_1000011").addClass("valid");}
    else {console.log("Not ready")};
}

function checkForSkipping(decisionUrl) {
    $.ajax({
        url: decisionUrl,
        success: function(data){
            var $html = $(data);
            var ticketId = decisionUrl.substring(decisionUrl.lastIndexOf('/')+1);
            findSkipping($html,ticketId);
        }
    });
}

function uncensorText(string) {
    return string.split('fuck').join('fu ck')
        .split('cunt').join('cu nt')
        .split('cock').join('co ck')
        .split('ass').join('as s')
        .split('nigger').join('ni gger')
        .split('clit').join('cl it')
        .split('shit').join('sh it')
        .split('bitch').join('bi tch')
        .split('faggot').join('fa ggot');
}

function findSkipping($html,ticketId) {
    var $decisionsMade = $html.find('.portlet-title:contains("Decisions made")').next('div');
    var matchId = $decisionsMade.find('a:contains("'+ticketId+'")').prevUntil('strong').last().prev('strong').text();
    matchId = matchId.substring(matchId.lastIndexOf(':')+1).trim();
    var gmName = $decisionsMade.find('a:contains("'+ticketId+'")').prevUntil('p').last().prev('p').text();
    gmName = gmName.substring(gmName.lastIndexOf('(')+1,gmName.lastIndexOf(')')).trim();
    var $newDecisions = $decisionsMade.children().slice(0,$decisionsMade.find('a:contains("'+ticketId+'")').prevUntil('hr').last().index()).filter('p,strong,a:contains(" - ")');

    $newDecisions.each(function(i){
        if ($(this).is('p')) {
            $(this).nextUntil('p').addBack().wrapAll('<div class="decisionDiv">');
        }
    });
    var skipped = false;
    var skippingEvidence = "";
    $html.find('.decisionDiv').each(function (i) {
        var judge = $(this).find('p').text();
        var decisionId = judge.substring(judge.lastIndexOf('Decision')+8,judge.lastIndexOf('judged on')).trim();        
        judge = judge.substring(judge.lastIndexOf('(')+1,judge.lastIndexOf(')')).trim();


        if (judge!=gmName) {
            var match;
            $(this).find('strong:contains("Match ID")').each(function (i) {
                //$(this).find('strong:contains("Match ID"),a:contains(" - ")').each(function (i) {
                if ($(this).is("strong")) {
                    match = $(this).text();
                    match = match.substring(match.lastIndexOf(':')+1).trim();
                    if (match==matchId) {
                        skippingEvidence += (skippingEvidence===""?"":", ") + "match "+match+" afterwards decided via "+decisionId+" by "+judge;
                        skipped = true;
                    }
                } else {
                    var report = $(this).text();
                    report = report.substring(0,report.indexOf(' - ')).trim();
                    if (report<=ticketId) {
                        if (!skippingEvidence.includes("match "+match)) {
                            console.log(match);
                            console.log(skippingEvidence);
                            skippingEvidence += (skippingEvidence===""?"":", ") + "report "+report+" afterwards decided via "+decisionId+" by "+judge;                    
                        }
                        skipped = true;
                    }
                }
            });
        }
    });
    var $openTickets = $html.find('.portlet-title:contains("Open tickets")').next('div');
    var $unjudgedTickets = $openTickets.children().filter('strong,a:contains(" - ")');
    var match;
    $unjudgedTickets.each(function(i){
        if ($(this).is("strong")) {
            match = $(this).text();
            match = match.substring(match.lastIndexOf(':')+1).trim();
            if (match<=matchId) {
                skippingEvidence += (skippingEvidence===""?"":", ") + "unjudged match "+match;
                skipped = true;
            }
        } else {
            var report = $(this).text();
            report = report.substring(0,report.indexOf(' - ')).trim();
            if (report<=ticketId) {
                if (!skippingEvidence.includes("match "+match)) {
                    console.log(match);
                    console.log(skippingEvidence);
                    skippingEvidence += (skippingEvidence===""?"":", ") + "unjudged report "+report;                    
                }
                skipped = true;
            }
        }
    });
    return skipped?(gmName+" innocents VA/BN/SI and leaves other reports unjudged.. This is supported by "+skippingEvidence+"."):skipped;
}


// ===========================================================================================