
/* Represents the entire Leaderboard grid */
var LeaderboardGrid = {
    'Rows': [],
    'CurrentSortType': SortType.EarningsAllTime,
    'CurrentSortOrder': SortOrder.Descending,
    'AddRow': LeaderboardGrid_AddRow,
    'Render': LeaderboardGrid_Render,
    'Refresh': LeaderboardGrid_Refresh,
    'Sort': LeaderboardGrid_Sort
};

function LeaderboardGrid_AddRow(row)
{
    this.Rows.push(row);
}

function LeaderboardGrid_Render()
{
    var trs = [];

    if (this.CurrentSortOrder === SortOrder.Ascending)
    {
        for (var i = 0; i < this.Rows.length; i++)
        {
            trs[trs.length] = this.Rows[i].Render(this.Rows.length - i);
        }
    }
    else
    {
        for (var i = this.Rows.length - 1; i >= 0; i--)
        {
            trs[trs.length] = this.Rows[i].Render(this.Rows.length - i);
        }
    }
    
    return trs;
}

function LeaderboardGrid_Refresh(sortType)
{
    this.CurrentSortType = sortType;
    this.Sort(sortType);
    
    if (this.CurrentSortOrder === SortOrder.Ascending)
        this.CurrentSortOrder = SortOrder.Descending;
    else
        this.CurrentSortOrder = SortOrder.Ascending;
}

function LeaderboardGrid_Sort(sortType)
{
    Quicksort(this.Rows, sortType, 0, this.Rows.length);
}



function Quicksort(array, sortType, start, end)
{
    if (end - 1 > start)
    {
        var pivot=start + Math.floor(Math.random()*(end-start));
        pivot = Partition(array, sortType, start, end, pivot);
        Quicksort(array, sortType, start, pivot);
        Quicksort(array, sortType, pivot + 1, end);
    }
}

function Partition(array, sortType, start, end, pivot)
{
    var newPivot = start;
    var p = array[pivot];
    Swap(array, pivot, end - 1);
    
    for (var i = start; i < end - 1; i++)
    {
        var res = array[i].Compare(p, sortType);
        if (res <= 0)
        {
            Swap(array, newPivot, i);
            newPivot++;
        }
    }
    
    Swap(array, end - 1, newPivot);
    return newPivot;
}

function Swap(array, left, right)
{
    var tmp = array[left];
    array[left] = array[right];
    array[right] = tmp;
}