function vote(e, dir, playerId, replayId) {
    var flag;
    var me = $(e);
    var sib = $(e).siblings('.vote');
    var nametag = $(e).siblings('.nametag');
    if (me.hasClass('active')) {
        flag = 'False';
        $.post('/api/reputation/vote' + dir + '?playerId=' + playerId + '&flag=' + flag + '&replayId=' + replayId,
            function (data) {
                console.log(data);
                me.removeClass('active');
                nametag.attr('title', 'Reputation: ' + data.TargetRep);
            })
            .fail(function (e) {
                console.log('vote error', e);
                alert(e.responseJSON.Message);
            });
    } else {
        flag = 'True';
        $.post('/api/reputation/vote' + dir + '?playerId=' + playerId + '&flag=' + flag + '&replayId=' + replayId,
            function (data) {
                console.log(data);
                me.addClass('active');
                sib.removeClass('active');
                nametag.attr('title', 'Reputation: ' + data.TargetRep);
            })
            .fail(function (e) {
                console.log('vote error', e);
                if (e.responseJSON.Message === 'Not enough reputation for downvoting') {
                    var repRep = e.responseJSON.NeededRep;
                    var selfRep = e.responseJSON.Rep;
                    $('#dialog-message .msg-text').text('You do not have enough reputation. You need at least ' + repRep + ' ' +
                        'reputation score to downvote someone but you only have ' + selfRep + '. ' +
                        'Play nice and get your team to upvote you to gain reputation.');
                    $('#dialog-message').dialog({
                        modal: true,
                        buttons: {
                            Ok: function () {
                                $(this).dialog('close');
                            }
                        }
                    });
                } else {
                    alert(e.responseJSON.Message);
                }
            });
    }
}

function voteUp(e, playerId, replayId) {
    vote(e, 'up', playerId, replayId);
}

function voteDown(e, playerId, replayId) {
    vote(e, 'down', playerId, replayId);
}

function updateUrl(base, routeParameters) {
    var q1 = r => r.get_selectedItem();
    var q2 = r => r.get_checkedIndices();
    var q3 = r => q2(r) && q2(r).map(z => encodeURIComponent(r.get_itemData()[z].value)).join(',');
    var q4 = r => $('#' + r + ' li.active a[data-toggle="tab"]')[0];

    var qa = r => r && q1(r) && encodeURIComponent(q1(r).get_value());
    var qb = r => r && q3(r);
    var qc = r => q4(r) && q4(r).getAttribute('href').substr(1);

    var allQ = routeParameters
        .map(r => Object.assign(r, { element: $find(r.id) }))
        .map(r => ({
            queryString: r.queryString,
            value: r.tab ? qc(r.id) : r.single ? qa(r.element) : qb(r.element),
            default: r.default,
        }))
        .filter(r => !!r.value && r.value !== r.default)
        .map(r => r.queryString + '=' + r.value)
        .join('&');

    var url = allQ.length ? base + '?' + allQ : base;
    window.history.replaceState({}, '', url);
}

function switchToTabBasedOnSearchQuery(queryKey) {
    var urlParams = new URLSearchParams(window.location.search);
    var myParam = urlParams.get(queryKey);

    if (myParam) {
        var query = 'a[href="#' + myParam + '"]';
        var activeTab = $(query)[0];
        setTimeout(() => activeTab.click(), 0);
    }
}

