CSS and Javascript changes must comply with the wiki design rules.
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Clear the cache in Tools → Preferences
// <nowiki>
$(function() {
var i18n = {
alert_wrong_user : "This is another user's predictions page. Go to yours?",
alert_overview_page : "Go to create or edit your predictions?",
alert_log_in : 'You must be logged in to enter predictions. Log in?',
confirm_new_page : 'Create page?',
draw : 'TIE',
error_already_in_group : 'Error! You are already a member of this group',
highlight_start : 'Turn On Team Highlighting',
highlight_stop : 'Turn Off Team Highlighting',
intro : 'To enter predictions, click the team you think will win. If matches are BO2, click the center to predict a tie. To exit, refresh the page.',
launch_predictions : 'Launch Predictions',
no_user_page : "You don't have predictions for this event!",
prompt_create_group_name : 'Enter group name (case sensitive!)',
please_confirm_email : 'It looks like you haven\'t confirmed your email yet. Please do that and try again!',
relaunch_predictions : 'Resume Editing',
reload_page : 'This will reload the page. Continue?',
save_disallowed : "Sorry, you can't save, predictions expired.",
save_predictions : 'Save Predictions',
save_predictions_done : 'Predictions Saved! Reload the page to reset the UI.',
success_joining_group : 'Successfully joined group! Reload the page to update.',
success_joining_group_now_creating_page : 'Sucessfully joined group! Your predictions page will now be created and you will be redirected.',
success_creating : 'Successfully created! View?'
};
function initPredictions() {
window.saveFileLocation = getSaveFileLocation();
window.currentPageName = mw.config.get('wgPageName').replace(/_/g, ' ');
if (!verifyLogin()) return;
if (currentPageName !== saveFileLocation) {
window.startSpinner(this);
redirectToUserPage()
}
else {
launchPredictions.bind(this)();
}
}
function launchPredictions() {
addStartMessages();
$('.matchlist-time-cell').html('');
$('.ml-team').off('click');
$('.ml-team').hover(toggleTeamHover, toggleTeamHover);
removeLockedRowsFromEditing();
doReloadTasks(this);
console.log('1');
eventFire(document.getElementById('toggle-highlighting-button'), 'click');
$('.ml-prediction-2 .matchlist-team2, .ml-prediction-1 .matchlist-team1, .ml-prediction-0 .matchlist-time-cell' ).each(function() {
console.log('2');
eventFire(this, 'click');
});
}
function doReloadTasks(startButton) {
eventFire(document.getElementById('matchlist-show-all'), 'click');
// eventFire(document.getElementById('matchlist-show-schedule'), 'click');
$(startButton).off('click');
$(startButton).click(savePredictions);
$(startButton).html(i18n.save_predictions);
$('.ml-row-tbd .matchlist-team1').click(function(event) {
makePrediction(this, event, 1);
});
$('.ml-row-tbd .matchlist-team2').click(function(event) {
makePrediction(this, event, 2);
});
$('.user-predictions-allow-draws .ml-row-tbd .matchlist-time-cell').click(function(event) {
makePrediction(this, event, 0);
});
}
function relaunchPredictions() {
doReloadTasks(this);
}
function verifyLogin() {
if (! mw.config.get('wgUserId')) {
if (confirm(i18n.alert_log_in)) {
var curURL = window.location.href;
if (! curURL.endsWith('#Match_Schedule')) curURL = curURL + '#Match_Schedule';
var loginURL = "https://www.gamepedia.com/twitch-login?returnUrl=" + curURL;
window.location.href = loginURL;
}
}
else {
return true
}
}
function redirectToUserPage() {
var alertText = currentPageName.includes('/User/') ? 'alert_wrong_user' : 'alert_overview_page';
if (confirm(i18n[alertText])) {
return verifyPageExistsOrCreate(false).then(goToUserPage);
}
window.endSpinner();
return false;
}
function verifyPageExistsOrCreate(returnOnExists) {
console.log('finding existing predictions');
return new mw.Api().get({
action : 'query',
prop: 'revisions',
titles: saveFileLocation,
rvprop : 'ids'
}).then(function(data) {
if (data.query.pages[-1]) {
return createBlankUserpage();
}
return returnOnExists;
});
}
function createBlankUserpage() {
console.log('creating blank user page');
return new mw.Api().postWithToken('csrf', {
action : 'edit',
title : saveFileLocation,
text : '{{UserPredictions}}',
tags : 'prediction_edit'
}).then(function() { return false; });
}
function goToUserPage() {
// If a user without email confirmed tried to create a user page then
// it will have failed silently
// so we need to re-verify that the page exists here
// before navigating there
console.log('kittens');
new mw.Api().get({
action : 'query',
prop: 'revisions',
titles: saveFileLocation,
rvprop : 'ids'
}).then(function(data) {
if (data.query.pages[-1]) {
alert(i18n.please_confirm_email);
window.endSpinner();
return false;
}
window.location.href = mw.config.get('wgServer') + '/' + saveFileLocation;
return false;
});
}
function eventFire(el, etype){
if (el.fireEvent) {
el.fireEvent('on' + etype);
} else {
var evObj = document.createEvent('Events');
evObj.initEvent(etype, true, false);
el.dispatchEvent(evObj);
}
}
function addStartMessages() {
var sectionStart = document.getElementById('matchlist-section-start');
var elHTML = '<div class="predictions-instructions">' + i18n.intro + '</div><div class="toggle-button prediction-action" id="toggle-highlighting-button">' + i18n.highlight_stop + '</div>';
$(document.createElement('div')).css('clear','left').html(elHTML).attr('id', 'predictions-intro').insertAfter(sectionStart);
$('#toggle-highlighting-button').click(toggleHighlighting);
$('#toggle-styling-button').click(togglePredictionVsRealResultsStyling);
}
function removeLockedRowsFromEditing() {
var nowTime = Date.now() / 1000;
$('.ml-row-tbd').each(function() {
var thenTime = $(this).attr('data-prediction-expire');
if (!thenTime) return;
if (nowTime + (30 * 60) > parseInt(thenTime)) { // 30 minutes expiration for now
lockRow.bind(this)();
}
});
$('.ml-row-predictions-disabled').each(lockRow);
// $('.ml-row-unknown-team, .matchlist-flex').each(lockRow);
// as of july 2, we are creating & checking initialorder via MSHash so shouldn't need to lock that anymore
$('.ml-row-unknown-team').each(lockRow);
}
function lockRow() {
$(this).removeClass('ml-row-tbd');
$(this).find('.matchlist-time-cell').html('<div class="prediction-locked"></div>');
}
function toggleHighlighting() {
$('.ml-team, .matchlist-score').toggleClass('teamhighlighter').toggleClass('teamhighlight');
var newHTML = $(this).html() == i18n.highlight_stop ? i18n.highlight_start : i18n.highlight_stop;
$(this).html(newHTML);
}
function toggleTeamHover() {
$(this).toggleClass('ml-team-hovered');
}
function togglePredictionVsRealResultsStyling() {
$('#matchlist-content-wrapper').toggleClass('ml-reverse-pred-and-results');
$('#matchlist-content-wrapper').toggleClass('ml-normal-pred-and-results');
}
function makePrediction(el, event, n) {
event.stopPropagation();
var $el = $(el);
var $tr = $el.closest('tr');
$tr.removeClass('ml-prediction-0').removeClass('ml-prediction-1').removeClass('ml-prediction-2');
$tr.addClass('ml-prediction-' + n);
var $middle = $tr.find('.matchlist-time-cell');
$middle.attr('data-winner', n);
if (n == 0) {
$middle.html(i18n.draw).addClass('ml-prediction-0');
}
else {
$middle.removeClass('ml-prediction-0');
$middle.html($el.find('.teamimage-left, .teamimage-right').html());
}
}
function savePredictions() {
var startButton = this;
return validatePredictions().then(function(result) {
if (result === false) {
alert(i18n.save_disallowed);
return;
}
var data = getPredictions();
var matchOrder = getMatchOrder();
var tabOrder = getTabOrder();
console.log('saving data');
window.startSpinner(startButton);
return new mw.Api().postWithToken('csrf', {
action : 'edit',
title : saveFileLocation,
text : concatDataForSave(data, matchOrder, tabOrder),
tags : 'prediction_edit'
})
.then(restoreUI.bind(startButton));
});
}
function validatePredictions() {
var linesToCheck = [];
$('.ml-verify-prediction-expire.ml-prediction-0, .ml-verify-prediction-expire.ml-prediction-1, .ml-verify-prediction-expire.ml-prediction-2').each(function() {
linesToCheck.push($(this).attr('data-game-id'));
});
if (linesToCheck.length === 0) {
return $.Deferred().resolve(true);
}
var queryString = linesToCheck
.map(function(x) { return 'MatchId="' + x + '"' })
.join(' OR ');
console.log(queryString);
return new mw.Api().get({
action: 'cargoquery',
tables: 'MatchSchedule',
where: queryString,
fields: 'OverrideAllowPredictions'
}).then(function(data) {
for (i in data.cargoquery) {
if (data.cargoquery[i].title.OverrideAllowPredictions !== "1") {
return false;
}
}
return true;
});
}
function getPredictions() {
var data = [];
$('table.matchlist').each(function() {
data.push([]);
$(this).find('.ml-row').each(function() {
var result;
if ($(this).hasClass('ml-prediction-1')) result = 1;
if ($(this).hasClass('ml-prediction-2')) result = 2;
if ($(this).hasClass('ml-prediction-0')) result = 0;
data[data.length-1].push(result);
});
});
return data;
}
function getMatchOrder() {
var data = [];
$('table.matchlist').each(function() {
data.push([]);
var i = 1;
$(this).find('.ml-row').each(function() {
var order = $(this).attr('data-initial-order');
data[data.length-1].push(order ? order : false);
i++;
});
});
return data;
}
function getTabOrder() {
var data = [];
$('table.matchlist').each(function() {
data.push([]);
var i = 1;
$(this).find('.ml-row').each(function() {
var order = $(this).attr('data-initial-pageandtab');
data[data.length-1].push(order ? order : false);
i++;
});
});
return data;
}
function getSaveFileLocation() {
var user = mw.config.get('wgUserName');
var title = mw.config.get('wgTitle').replace('/Group/', '/User/').replace(/\/Leaderboard.*/, '');
console.log(title);
var titleTable = title.split('/');
if (titleTable[titleTable.length-2] == 'User' && mw.config.get('wgCanonicalNamespace') == 'Predictions') {
titleTable[titleTable.length-1] = user;
}
else {
titleTable.push('User');
titleTable.push(user);
}
return 'Predictions:' + titleTable.join('/')
}
function concatDataForSave(data, matchOrder, tabOrder) {
var dataConcat = concatDataTypeForSave(data, '');
var orderConcat = concatDataTypeForSave(matchOrder, '_order');
var tabConcat = concatDataTypeForSave(tabOrder, '_tab');
console.log(orderConcat);
console.log('printing tabConcat:');
console.log(tabOrder);
return '{{UserPredictions' + dataConcat + orderConcat + tabConcat + '}}';
}
function concatDataTypeForSave(data, suffix) {
var tbl = [];
for (tab in data) {
var luaTab = parseInt(tab) + 1;
for (row in data[tab]) {
if (typeof data[tab][row] !== 'undefined' && (data[tab][row] || data[tab][row] === 0)) {
var luaRow = parseInt(row) + 1;
tbl.push('|t' + luaTab + '_r' + luaRow + suffix + '=' + data[tab][row]);
}
}
}
return tbl.join('');
}
function restoreUI() {
alert(i18n.save_predictions_done);
$(this).off('click');
$(this).html(i18n.relaunch_predictions);
$(this).click(relaunchPredictions);
$('.ml-team').off('click');
$('.matchlist-time-cell').off('click');
window.endSpinner();
}
$('#matches-prediction-begin').click(initPredictions);
$('#predictions-join-group').click(function() {
window.startSpinner(this);
window.saveFileLocation = getSaveFileLocation();
console.log(saveFileLocation);
window.currentPageName = mw.config.get('wgPageName').replace(/_/g, ' ');
var memberList = $(this).attr('data-current-member-list');
var user = mw.config.get('wgUserName');
var re = new RegExp('(^|,)' + user + '($|,)')
if (memberList.match(re)) {
alert(i18n.error_already_in_group);
return;
}
return new mw.Api().postWithToken('csrf', {
action : 'edit',
title : mw.config.get('wgPageName'),
text : '{{UserPredictionsGroup|members=' + memberList + ',' + user + '}}',
tags : 'prediction_edit'
}).then(function(data) {
return verifyPageExistsOrCreate(true).then(function (result) {
if (result) {
alert(i18n.success_joining_group);
window.endSpinner();
}
else {
alert(i18n.success_joining_group_now_creating_page);
return createBlankUserpage().then(goToUserPage);
}
})
});
});
$('.predictions-create-page').each(function() {
$(this).click(function() {
window.startSpinner(this);
var targetTitle = $(this).attr('data-target-title');
if (! confirm(i18n.confirm_new_page)) {
window.endSpinner();
return;
}
var a = new mw.Api()
return a.postWithToken('csrf', {
action : 'edit',
title : targetTitle,
text : '{{' + $(this).attr('data-target-text') + '}}',
tags : 'prediction_edit'
}).then(function(data) {
a.postWithToken('csrf', {
action: 'purge',
titles : mw.config.get('wgPageName')
});
if (confirm(i18n.success_creating)) {
window.location.href = mw.config.get('wgServer') + '/' + targetTitle;
}
window.endSpinner();
});
});
});
$('#predictions-join-or-create').click(function() {
window.startSpinner(this);
var groupName = prompt(i18n.prompt_create_group_name);
if (!groupName) {
window.endSpinner();
return;
}
var title = mw.config.get('wgPageName');
var groupTitle = title.replace(/User\/.*/, 'Group') + '/' + groupName;
var a = new mw.Api();
return a.get({
action : 'query',
prop: 'revisions',
titles: groupTitle,
rvprop : 'ids'
}).then(function(data) {
if (data.query.pages[-1]) {
return createNewGroup(groupTitle);
}
window.location.href = mw.config.get('wgServer') + '/' + groupTitle
window.endSpinner();
});
});
$('#predictions-reload-data').click(function() {
purgeWithConfirmationAndReload();
});
function createNewGroup(groupTitle) {
var user = mw.config.get('wgUserName');
return new mw.Api().postWithToken('csrf', {
action : 'edit',
title : groupTitle,
text : '{{UserPredictionsGroup|members=' + user + '}}',
tags : 'prediction_edit'
}).then(function() {
window.location.href = mw.config.get('wgServer') + '/' + groupTitle;
});
}
$('#predictions-reload-user-data').click(function() {
if (! confirm(i18n.reload_page)) return;
window.startSpinner(this);
return blankEditWithReload();
});
$('#predictions-reload-user-data-from-leaderboard').click(function() {
var title = getSaveFileLocation();
var el = this;
return doesPageExist(title).then(function(result) {
if (! result) {
alert(i18n.no_user_page);
return;
}
if (! confirm(i18n.reload_page)) return;
window.startSpinner(el);
return blankEdit(title).then(purgeWithReload);
});
});
$('.predictions-refresh-target').each(function() {
$(this).click(function() {
var target = $(this).attr('data-refresh-target');
window.startSpinner(this);
if (! confirm(i18n.reload_page)) {
window.endSpinner();
return;
}
return blankEdit(target).then(purgeWithReload);
});
});
});
// </nowiki>