//<![CDATA[

function contains(arr, element) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == element) {
            return true;
        }
    }
    return false;
}


/*Array.prototype.contains = function (element) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == element) {
            return true;
        }
    }
    return false;
};*/

var ArenaFormatter = function() {
    EJSC.Formatter.__extendTo(this);
    this.format = function(value, precision) {
        return getXLabel(value, true);
    }
}
function getXLabel(xVal, condense) {
    var matchNum = xVal % 10 + 1;
    var weekNum = Math.floor(xVal / 10) + 1;
    if (!condense || matchNum == 1) {
        return "Week " + weekNum + " match " + matchNum;
    } else {
        return matchNum;
    }
}

var wholeData = null;
var classes = ['Druid', 'Hunter', 'Mage', 'Warrior', 'Warlock', 'Shaman', 'Paladin', 'Priest', 'Rogue'];
var classData = {};
var playerData = {};
var arenaData = {};
var strategyData = {};
var seasonData = {};
var ourCurRating = 0;
var criteriaData = [];
var curCriteria = [];
var allSeasons = [];
var chart = null;
var series = null;

function addCriteria() {
    var vals = [$('#criteria1').val(), $('#criteria2').val(), $('#criteria3').val(), $('#criteria4').val()];
    curCriteria.push(vals);
    updateCriteria();
    $('#criteria1').each(function(j) {
        this.selectedIndex = -1;
    });
    for (var i = 2; i <= 4; ++i) {
        $('#criteria' + i).empty();
    }
    setCriteriaButtonEnabled(false);
}

function clearCriteria() {
    curCriteria = [];
    updateCriteria();
    $('#criteria1').each(function(j) {
        this.selectedIndex = -1;
    });
    for (var i = 2; i <= 4; ++i) {
        $('#criteria' + i).empty();
    }
}

function removeCriteria(idx) {
    curCriteria.splice(idx, 1);
    updateCriteria();
}

function updateCriteria() {
    // Update the state of the clear criteria button.
    // (only enabled if there's a criterion)
    $('#clearcriteria').each(function(i) {
        this.disabled = (curCriteria.length == 0);
    });
    var matchingData = wholeData.slice(0);
    $('#criteriaIndicator').empty();
    $('#criteriaIndicator').append('<span class="count">(' + matchingData.length + ")</span> ");
    for (var i = 0; i < curCriteria.length; ++i) {
        var type = curCriteria[i][0];
        matchingData = jQuery.grep(matchingData, function(n, unused) {
            return criteriaData[type]['filter'](curCriteria[i], n);
        });
        $('#criteriaIndicator').append(criteriaData[type]['toString'](curCriteria[i]) + '<span class="count">(' + matchingData.length + ')</span><a href="javascript:removeCriteria(' + i + ');">x</a> ');
        if (i < curCriteria.length - 1) {
            $('#criteriaIndicator').append(' AND ');
        }
    }
    $('#criteriaOutput').empty().append(getDataString(matchingData, 'Matches that fit criteria', ourCurRating));
}

function setupCriteria() {
    for (var i = 1; i <= 4; ++i) {
        $('#criteria' + i).empty();
    }
    for (var i = 0; i < criteriaData.length; ++i) {
        $('#criteria1').append('<option value="' + i + '">' + criteriaData[i]['Name'] + "</option>");
    }
    $('#criteria1').change(function() {
        var idx = parseInt($('#criteria1').val());
        if ('onchange1' in criteriaData[idx]) {
            criteriaData[idx]['onchange1']();
        }
        // does empty clear criteria2 of change handlers?
        $('#criteria2').change(function() {
            var idx = parseInt($('#criteria1').val());
            if ('onchange2' in criteriaData[idx]) {
                criteriaData[idx]['onchange2'](); 
            }
            $('#criteria3').change(function() {
                var idx = parseInt($('#criteria1').val());
                if ('onchange3' in criteriaData[idx]) {
                    criteriaData[idx]['onchange3'](); 
                }
                $('#criteria4').change(function() {
                    var idx = parseInt($('#criteria1').val());
                    if ('onchange4' in criteriaData[idx]) {
                        criteriaData[idx]['onchange4'](); 
                    }
                });
            });
        });
    });
    $('#criteria1').each(function(i) {
        this.selectedIndex = -1;
    });
    setCriteriaButtonEnabled(false);
    updateCriteria();
}

function setCriteriaButtonEnabled(enabled) {
    $('#addcriteria').each(function(i) {
        this.disabled = !enabled;
    });
}

function addClassCriteria(classData) {
    var toAdd = {};
    toAdd['Name'] = 'Opponents Class';
    toAdd['onchange1'] = function () {
        $('#criteria2').empty();
        $('#criteria3').empty();
        $('#criteria4').empty();
        for (var cl = 0; cl < classes.length; ++cl) {
            $('#criteria2').append('<option>' + classes[cl] + '</option>');
        }
        $('#criteria2').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    };
    toAdd['onchange2'] = function() {
        $('#criteria3').empty();
        $('#criteria4').empty();
        $('#criteria3').append('<option value="equal">=</option>');
        $('#criteria3').append('<option value="notequal">&ne;</option>');
        $('#criteria3').append('<option value="lessthan">&lt;</option>');
        $('#criteria3').append('<option value="lessthanequal">&le;</option>');
        $('#criteria3').append('<option value="greaterthan">&gt;</option>');
        $('#criteria3').append('<option value="greaterthanequal">&ge;</option>');
        $('#criteria3').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    }
    toAdd['onchange3'] = function() {
        $('#criteria4').empty();
        for (var i = 0; i <= 5; ++i) {
            $('#criteria4').append('<option>' + i + '</option>')
        }
        $('#criteria4').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    }
    toAdd['onchange4'] = function() {
        setCriteriaButtonEnabled(true);
    }
    toAdd['toString'] = function(selectedVals) {
        toReturn = "Opponents: number of " + selectedVals[1] + " ";
        switch(selectedVals[2]) {
            case 'equal':
                toReturn += "=";
                break;
            case 'notequal':
                toReturn += "&ne;";
                break;
            case 'lessthan':
                toReturn += "&lt;";
                break;
            case 'lessthanequal':
                toReturn += "&le;";
                break;
            case 'greaterthan':
                toReturn += "&gt;";
                break;
            case 'greaterthanequal':
                toReturn += "&ge;";
                break;
            default:
                toReturn += "???";
                break;
        }
        toReturn += " " + selectedVals[3];
        return toReturn;
    }
    toAdd['filter'] = function(selectedVals, curData) {
        var numOfClass = 0;
        var cl = selectedVals[1];
        if ('OpponentsClasses' in curData) {
            for (i in curData['OpponentsClasses']) {
                if (curData['OpponentsClasses'][i] == cl) {
                    numOfClass++;
                }
            }
        }
        var op = selectedVals[2];
        var num = parseInt(selectedVals[3]);
        switch (op) {
            case 'equal':
                return numOfClass == num;
            case 'notequal':
                return !(numOfClass == num);
            case 'lessthan':
                return numOfClass < num;
            case 'lessthanequal':
                return numOfClass <= num;
            case 'greaterthan':
                return numOfClass > num;
            case 'greaterthanequal':
                return numOfClass >= num;
            default:
                alert('TODO - error!');
                return false;
        }
    }
    criteriaData.push(toAdd);
}

function addPlayerCriteria(playerData) {
    var toAdd = {};
    toAdd['Name'] = 'Our players';
    toAdd['onchange1'] = function () {
        $('#criteria2').empty();
        $('#criteria3').empty();
        $('#criteria4').empty();
        for (player in playerData) {
            $('#criteria2').append('<option>' + player + '</option>');
        }
        $('#criteria2').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    };
    toAdd['onchange2'] = function() {
        $('#criteria3').empty();
        $('#criteria4').empty();
        $('#criteria3').append('<option value="yes">is playing</option>');
        $('#criteria3').append('<option value="no">is not playing</option>');
        $('#criteria3').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    }
    toAdd['onchange3'] = function() {
        $('#criteria4').empty();
        setCriteriaButtonEnabled(true);
    }
    toAdd['toString'] = function(selectedVals) {
        toReturn = selectedVals[1] + " ";
        switch(selectedVals[2]) {
            case 'yes':
                toReturn += "is playing";
                break;
            case 'no':
                toReturn += "is not playing";
                break;
            default:
                toReturn += "???";
                break;
        }
        return toReturn;
    }
    toAdd['filter'] = function(selectedVals, curData) {
        var isInMatch = false;
        var player = selectedVals[1];
        if ('OpponentsClasses' in curData) {
            for (i in curData['Players']) {
                if (curData['Players'][i] == player) {
                    isInMatch = true;
                }
            }
        }
        var op = selectedVals[2];
        switch (op) {
            case 'yes':
                return isInMatch;
            case 'no':
                return !isInMatch;
            default:
                alert('TODO - error!');
                return false;
        }
    }
    criteriaData.push(toAdd);
}

function addArenaCriteria(arenaData) {
    var toAdd = {};
    toAdd['Name'] = 'Arena location';
    toAdd['onchange1'] = function () {
        $('#criteria2').empty();
        $('#criteria3').empty();
        $('#criteria4').empty();
        for (arena in arenaData) {
            $('#criteria2').append('<option>' + arena + '</option>');
        }
        $('#criteria2').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    };
    toAdd['onchange2'] = function() {
        $('#criteria3').empty();
        $('#criteria4').empty();
        $('#criteria3').append('<option value="yes">played here</option>');
        $('#criteria3').append('<option value="no">not played here</option>');
        $('#criteria3').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    }
    toAdd['onchange3'] = function() {
        $('#criteria4').empty();
        setCriteriaButtonEnabled(true);
    }
    toAdd['toString'] = function(selectedVals) {
        toReturn = "Match ";
        switch(selectedVals[2]) {
            case 'yes':
                toReturn += "is";
                break;
            case 'no':
                toReturn += "is not";
                break;
            default:
                toReturn += "???";
                break;
        }
        toReturn += " played at " + selectedVals[1];
        return toReturn;
    }
    toAdd['filter'] = function(selectedVals, curData) {
        var isPlayedHere = false;
        if ('Arena' in curData) {
            isPlayedHere = (selectedVals[1] == curData['Arena']);
        }
        var op = selectedVals[2];
        switch (op) {
            case 'yes':
                return isPlayedHere;
            case 'no':
                return !isPlayedHere;
            default:
                alert('TODO - error!');
                return false;
        }
    }
    criteriaData.push(toAdd);
}

function addStrategyCriteria(strategyData) {
    var toAdd = {};
    toAdd['Name'] = 'Strategy';
    toAdd['onchange1'] = function () {
        $('#criteria2').empty();
        $('#criteria3').empty();
        $('#criteria4').empty();
        $('#criteria2').append('<option value="yes">is</option>');
        $('#criteria2').append('<option value="no">is not</option>');
        $('#criteria2').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    };
    toAdd['onchange2'] = function() {
        $('#criteria3').empty();
        $('#criteria4').empty();
        for (strategy in strategyData) {
            $('#criteria3').append('<option>' + strategy+ '</option>');
        }
        $('#criteria3').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    }
    toAdd['onchange3'] = function() {
        $('#criteria4').empty();
        setCriteriaButtonEnabled(true);
    }
    toAdd['toString'] = function(selectedVals) {
        toReturn = "Strategy ";
        switch(selectedVals[1]) {
            case 'yes':
                toReturn += "is";
                break;
            case 'no':
                toReturn += "is not";
                break;
            default:
                toReturn += "???";
                break;
        }
        toReturn += " " + selectedVals[2];
        return toReturn;
    }
    toAdd['filter'] = function(selectedVals, curData) {
        var isSameStrategy = false;
        if ('Strategy' in curData) {
            isSameStrategy = (selectedVals[2] == curData['Strategy']);
        }
        var op = selectedVals[1];
        switch (op) {
            case 'yes':
                return isSameStrategy;
            case 'no':
                return !isSameStrategy;
            default:
                alert('TODO - error!');
                return false;
        }
    }
    criteriaData.push(toAdd);
}

function addSeasonCriteria(seasonData) {
    var toAdd = {};
    toAdd['Name'] = 'Season played in';
    toAdd['onchange1'] = function () {
        $('#criteria2').empty();
        $('#criteria3').empty();
        $('#criteria4').empty();
        $('#criteria2').append('<option value="yes">is</option>');
        $('#criteria2').append('<option value="no">is not</option>');
        $('#criteria2').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    };
    toAdd['onchange2'] = function() {
        $('#criteria3').empty();
        $('#criteria4').empty();
        for (season in seasonData) {
            $('#criteria3').append('<option>' + season + '</option>');
        }
        $('#criteria3').each(function(i) {
            this.selectedIndex = -1;
        });
        setCriteriaButtonEnabled(false);
    }
    toAdd['onchange3'] = function() {
        $('#criteria4').empty();
        setCriteriaButtonEnabled(true);
    }
    toAdd['toString'] = function(selectedVals) {
        toReturn = "Season ";
        switch(selectedVals[1]) {
            case 'yes':
                toReturn += "is";
                break;
            case 'no':
                toReturn += "is not";
                break;
            default:
                toReturn += "???";
                break;
        }
        toReturn += " " + selectedVals[2];
        return toReturn;
    }
    toAdd['filter'] = function(selectedVals, curData) {
        var isSameSeason = false;
        if ('Season' in curData) {
            isSameSeason = (selectedVals[2] == curData['Season']);
        }
        var op = selectedVals[1];
        switch (op) {
            case 'yes':
                return isSameSeason;
            case 'no':
                return !isSameSeason;
            default:
                alert('TODO - error!');
                return false;
        }
    }
    criteriaData.push(toAdd);
}



function getSortedKeys(assocArr) {
    var keys = []
    for (key in assocArr) {
        keys.push(key);
    }
    keys.sort();
    return keys;
}

function getDivString(className) {
    return '#' + className.toLowerCase() + 'Data';
}

function showClassData(className) {
    $(getDivString(className)).show("normal");
    for (var cl = 0; cl < classes.length; ++cl) {
        if (classes[cl] != className) {
            $(getDivString(classes[cl])).hide("normal");
        }
    }
}

function makeSafeId(id) {
    return id.replace(/[()'" ]/gi, '');
}

function makeNonBreaking(id) {
    return id.replace(/ /gi, '&nbsp;');
}

function makeChart(data) {
    chart = new EJSC.Chart("myChart", 
            {show_mouse_position: false, x_axis_formatter: new ArenaFormatter(),
            x_axis_tick_count: data.length, x_axis_stagger_ticks: false,
            x_max: data.length - 1, y_min: 1450, y_max: 1850});
    chart.onShowHint = function(point, series, chart, hint_element, HoverOrSelect) {
        $('#auxSpan').empty().append('<b>Rating:</b>' + point.y); 
        return "<b>[series_title]</b><br>" + getXLabel(point.x, false) + "<br><b>Rating:</b> [y]";
    }
    series = makeSeries(data);
    chart.addSeries(series);
    chart.setXAxisCaption("Matches");
    chart.setYAxisCaption("Rating");
    return chart; 
}

function makeSeries(data) {
    series = new EJSC.LineSeries(new EJSC.ArrayDataHandler(data), {"color": "rgb(150,184,211)"});
    series.title = "Arena team rating";
    return series;
}

function setActiveSeason(season) {
    for (var i = 0; i < allSeasons.length; ++i) {
        if (allSeasons[i] != season) {
            $('#showseason'+allSeasons[i]).css({fontWeight:"normal"});
        } else {
            $('#showseason'+allSeasons[i]).css({fontWeight:"bold"});
        }
    }
}

function setSeason(season) {
    var data = [];
    var nextIndex = 0;
    var lastEntry = null;
    for (var x = 0; x < wholeData.length; ++x) {
        if (wholeData[x]['Season'] == season) {
            data.push([nextIndex++, wholeData[x]['StartRating']]);
            lastEntry = wholeData[x];
        }
    }
    if (lastEntry != null) {
        data.push([nextIndex, lastEntry['EndRating']]);
    }
    chart.remove();
    chart = makeChart(data);
    setActiveSeason(season);
}

function dataLoaded(jsonData) {
    wholeData = jsonData;
    for (var cl = 0; cl < classes.length; ++cl) {
        classData[classes[cl]] = [];
    }

    var data = [];
    var nextIndex = 0;
    var latestSeason = -1;
    // Find the current season
    allSeasons = []; 
    for (var x = 0; x < jsonData.length; ++x) {
        var curSeason = jsonData[x]['Season'];
        if (!(contains(allSeasons, curSeason))) {
            allSeasons.push(curSeason);
        }
        if (curSeason > latestSeason) {
            latestSeason = curSeason;
        }
    }
    for (var i = 0; i < allSeasons.length; ++i) {
        var season = allSeasons[i];
        $('#seasonLinks').append('<a id="showseason' + season + '" href="javascript:setSeason(' + season + ');">Show season ' + season + '</a>&nbsp;');
    }
    setActiveSeason(latestSeason);
    for (var x = 0; x < jsonData.length; ++x) {
        var curData = jsonData[x];
        // Only show on graph if this is the current season
        if (curData['Season'] == latestSeason) {
            data.push([nextIndex++, curData['StartRating']]);
        }
        // Count the number of enemies of each class
        classCount = {}
        for (cl in classes) {
            classCount[classes[cl]] = 0;
        }
        if ('OpponentsClasses' in curData) {
            for (var i = 0; i < curData['OpponentsClasses'].length; ++i) {
                classCount[curData['OpponentsClasses'][i]]++;
            }
            for (var cl = 0; cl < classes.length; ++cl) {
                var numOfClass = classCount[classes[cl]];
                if (!(numOfClass in classData[classes[cl]])) {
                    classData[classes[cl]][numOfClass] = [curData];
                } else {
                    classData[classes[cl]][numOfClass].push(curData);
                }
            }
        }
        for (var i = 0; i < curData['Players'].length; ++i) {
            var player = curData['Players'][i];
            if (player in playerData) {
                playerData[player].push(curData);
            } else {
                playerData[player] = [curData];
            }
        }
        if (curData['Arena'] in arenaData) {
            arenaData[curData['Arena']].push(curData);
        } else {
            arenaData[curData['Arena']] = [curData];
        }
        if ('Strategy' in curData) {
            if (curData['Strategy'] in strategyData) {
                strategyData[curData['Strategy']].push(curData);
            } else {
                strategyData[curData['Strategy']] = [curData];
            }
        }
        if ('Season' in curData) {
            if (curData['Season'] in seasonData) {
                seasonData[curData['Season']].push(curData);
            } else {
                seasonData[curData['Season']] = [curData];
            }
        }
    }
    ourCurRating = jsonData[jsonData.length - 1]['EndRating'];
    data.push([nextIndex, ourCurRating]);
    chart = makeChart(data);
    // Set up class breakdown
    $('#classTabs > ul').empty();
    for (var cl = 0; cl < classes.length; ++cl) {
        var curClass = classes[cl];
        //$('#linksSpan').append('<a href="javascript:showClassData(\'' + curClass + '\')">' + curClass + '</a> ');
        var divString = getDivString(curClass);
        $('#classTabs > ul').append('<li><a href="' + divString + '"><span>' + curClass + '</span></a></li>');
        $(divString).append("<b>" + curClass + "</b><br>");
        for (num in [0, 1, 2, 3, 4, 5]) {
            if (num in classData[curClass]) {
                $(divString).append('<b>' + num + ":</b> " + getDataString(classData[curClass][num], 'Times faced', ourCurRating) + "<br>");
            }
        }
    }
    addClassCriteria(classData);
    $('#playerTabs > ul').empty();
    var playerSortedKeys = getSortedKeys(playerData);
    for (var idx = 0; idx < playerSortedKeys.length; ++idx) {
        var playerName = playerSortedKeys[idx];
        $('#playerTabs > ul').append('<li><a href="#player-' + makeSafeId(playerName) + '"><span>' + playerName + '</span></a></li>');
        $('#playerTabs').append('<div id="player-' + makeSafeId(playerName) + '">' + getDataString(playerData[playerName], 'Times fought', ourCurRating) + '</div>');
    }
    addPlayerCriteria(playerData);
    $('#arenaTabs > ul').empty();
    var arenaSortedKeys = getSortedKeys(arenaData);
    for (var idx = 0; idx < arenaSortedKeys.length; ++idx) {
        var arenaName = arenaSortedKeys[idx];
        $('#arenaTabs > ul').append('<li><a href="#arena-' + makeSafeId(arenaName) + '"><span>' + makeNonBreaking(arenaName) + '</span></a></li>');
        $('#arenaTabs').append('<div id="arena-' + makeSafeId(arenaName) + '">' + getDataString(arenaData[arenaName], 'Times fought', ourCurRating) + '</div>');
    }
    addArenaCriteria(arenaData);
    $('#strategyTabs > ul').empty();
    var strategySortedKeys = getSortedKeys(strategyData);
    for (var idx = 0; idx < strategySortedKeys.length; ++idx) {
        var strategyName = strategySortedKeys[idx];
        $('#strategyTabs > ul').append('<li><a href="#strategy-' + makeSafeId(strategyName) + '"><span>' + strategyName + '</span></a></li>');
        $('#strategyTabs').append('<div id="strategy-' + makeSafeId(strategyName) + '">' + getDataString(strategyData[strategyName], 'Times fought', ourCurRating) + '</div>');
    }
    addStrategyCriteria(strategyData);
    $('#seasonTabs > ul').empty();
    var seasonSortedKeys = getSortedKeys(seasonData);
    for (var idx = 0; idx < seasonSortedKeys.length; ++idx) {
        var seasonName = seasonSortedKeys[idx];
        $('#seasonTabs > ul').append('<li><a href="#season-' + makeSafeId(seasonName) + '"><span>' + seasonName + '</span></a></li>');
        $('#seasonTabs').append('<div id="season-' + makeSafeId(seasonName) + '">' + getDataString(seasonData[seasonName], 'Times fought', ourCurRating) + '</div>');
    }
    addSeasonCriteria(seasonData);
 
    $('#classTabs > ul').tabs();
    // Don't know why we need to do this but it fixes Firefox 3 beta 1
    $('#classTabs div:first').removeClass("ui-tabs-hide");
    $('#classTabs div:first').addClass("ui-tabs-show");
    $('#playerTabs > ul').tabs();
    $('#playerTabs div:first').removeClass("ui-tabs-hide");
    $('#playerTabs div:first').addClass("ui-tabs-show");
    $('#arenaTabs > ul').tabs();
    $('#arenaTabs div:first').removeClass("ui-tabs-hide");
    $('#arenaTabs div:first').addClass("ui-tabs-show");
    $('#strategyTabs > ul').tabs();
    $('#strategyTabs div:first').removeClass("ui-tabs-hide");
    $('#strategyTabs div:first').addClass("ui-tabs-show");
    $('#seasonTabs > ul').tabs();
    $('#seasonTabs div:first').removeClass("ui-tabs-hide");
    $('#seasonTabs div:first').addClass("ui-tabs-show");
    setupCriteria();
}

function getDataString(data, timesFacedString, curRating) {
    var toReturn = timesFacedString + ": " + data.length;
    var wins = 0;
    var losses = 0;
    var totalRating = 0;
    var updatedRating = 0;
    for (i = 0; i < data.length; ++i) {
        var curData = data[i];
        var curRatingDifference = curData['RatingChange'];
        if (curRatingDifference > 0) {
            wins++;
        } else if (curRatingDifference < 0) {
            losses++;
        }
        totalRating += curRatingDifference;
        if ('OpponentsCurRating' in curData && curData['OpponentsCurRating'] != null) {
            var theirCurRating = curData['OpponentsCurRating']; 
            var ourChanceOfWinning = 1.0 / (1.0 + Math.pow(10, (theirCurRating - curRating) / 400.0));
            if (curRatingDifference > 0) {
                // We won!
                updatedRating += Math.round(32 * (1.0 - ourChanceOfWinning));
            } else {
                // We lost!
                updatedRating += Math.round(32 * (0.0 - ourChanceOfWinning));
            }
        } else {
            updatedRating += curRatingDifference;
        }
    }
    toReturn += " Record: " + wins + "-" + losses + " Updated rating: " + updatedRating + " Raw rating: " + totalRating;
    return toReturn;
}

(function() {
    $(document).ready(function() {
        $.getJSON("arenadata.json", dataLoaded);
    });
})();

//]]>
