-
Notifications
You must be signed in to change notification settings - Fork 66
/
vir.js
137 lines (118 loc) · 4.37 KB
/
vir.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Virtual rating change
var api_url = "https://codeforces.com/api/";
var ratings = [];
var places = [];
var rows = [];
var ratingsDict = {};
var handles = [];
var contestId = -1;
var points = -1;
var rating = -1;
var rank = -1;
$(document).ready(function() {
$('#inputform').submit(function(e) {
$("#mainSpinner").addClass("is-active");
resetData();
e.preventDefault();
$('#rating').blur();
$('#points').blur();
$('#contestId').blur();
// the user may want to know rating change for the same contest for different points, rank, oldrating
// we don't want to download the contest data again, as it takes really long
// so we'll take a newContestId var, and check later if this is the same as the previously entered contestId
var newContestId = $('#contestId').val().trim();
rating = $('#rating').val().trim();
points = $('#points').val().trim();
if(!(newContestId && rating && points)) {
err_message('contestIdDiv', 'All fields required');
return;
}
// TODO: why am I doing this twice?
var newContestId = $('#contestId').val().trim();
rating = $('#rating').val().trim();
points = $('#points').val().trim();
if (newContestId != contestId || rows.length == 0 || Object.keys(ratingsDict).length == 0) {
showMessage("Downloading data can take a few minutes. Thanks for your patience.");
contestId = newContestId;
req1 = $.get(api_url + 'contest.standings', { contestId: contestId }, function(data, status) {
var currentRank = 1;
for (var i = 0; i < data.result.rows.length; i++) {
rows = data.result.rows;
// trying to guess what what would have been his rank if he participated in the real contest
if (points >= data.result.rows[i].points && rank == -1) {
handles.push('virtual user');
places.push(data.result.rows[i].rank);
rank = data.result.rows[i].rank;
}
places.push(data.result.rows[i].rank)
handles.push(data.result.rows[i].party.members[0].handle);
}
}).fail(function() {
err_message('contestIdDiv', 'Contest not found, or not rated, or not finished yet, or bad network');
});
// we need all the participants' ratings before the contest
req2 = $.get(api_url + 'contest.ratingChanges', { contestId: contestId }, function(data, status) {
for (var i = 0; i < data.result.length; i++) {
change = data.result[i];
ratingsDict[change.handle] = change.oldRating;
}
}).fail(function() {
err_message('contestIdDiv', 'Contest not found, or not rated, or not finished yet or bad network');
});
$.when(req1, req2).then(function() {
for (var i = 0; i < handles.length; i++) {
ratings[i] = handles[i] in ratingsDict ? ratingsDict[handles[i]] : rating;
}
results = CalculateRatingChanges(ratings, places, handles);
showResult(results);
});
} else {
for (var i = 0; i < rows.length; i++) {
if (points >= rows[i].points && rank == -1) {
handles.push('virtual user');
places.push(rows[i].rank);
rank = rows[i].rank;
}
places.push(rows[i].rank)
handles.push(rows[i].party.members[0].handle);
}
for (var i = 0; i < handles.length; i++) {
ratings[i] = handles[i] in ratingsDict ? ratingsDict[handles[i]] : rating;
}
setTimeout(refresh, 2);
}
});
});
function refresh() {
results = CalculateRatingChanges(ratings, places, handles);
showResult(results);
}
function resetData() {
$('#mainSpinner').addClass('is-active');
$('#result').addClass('hidden');
ratings = [];
places = [];
handles = [];
rank = -1;
}
function showResult(resluts) {
$('#mainSpinner').removeClass('is-active');
$('#result').removeClass('hidden');
for (var i = 0; i < results.length; i++) {
if (results[i].party == 'virtual user') {
$('#change').html(results[i].delta>0?'+'+results[i].delta:results[i].delta);
$('#rank').html(rank);
$('#position').html(parseInt(results[i].seed));
}
}
}
function err_message(div,msg) {
$('#mainSpinner').removeClass('is-active');
$("#"+div+"Err").html(msg);
$("#"+div).addClass("is-invalid");
}
//
function showMessage(text) {
var data = {message: text, timeout: 10000};
$('#loading-text')[0].MaterialSnackbar.showSnackbar(data);
}