');
if (autoscroll) {
$chatFrame.scrollTop($chat.height());
}
},
openPM: function(name, dontFocus) {
var userid = toId(name);
var $pmWindow = this.$pmBox.find('.pm-window-'+userid);
if (!$pmWindow.length) {
group = name.charAt(0);
if (group === ' ') {
group = '';
} else {
group = ''+Tools.escapeHTML(group)+'';
}
var buf = '
'+group+Tools.escapeHTML(name.substr(1))+'
';
buf += '
';
$pmWindow = $(buf).prependTo(this.$pmBox);
$pmWindow.find('textarea').autoResize({
animate: false,
extraSpace: 0
});
} else {
$pmWindow.show();
if (!dontFocus) {
var $chatFrame = $pmWindow.find('.pm-log');
var $chat = $pmWindow.find('.inner');
$chatFrame.scrollTop($chat.height());
}
}
if (!dontFocus) this.$el.scrollTop(0);
return $pmWindow;
},
closePM: function(e) {
var userid;
if (e.currentTarget) {
e.preventDefault();
e.stopPropagation();
userid = $(e.currentTarget).closest('.pm-window').data('userid');
} else {
userid = toId(e);
}
$pmWindow = this.$pmBox.find('.pm-window-'+userid)
$pmWindow.hide();
var $rejectButton = $pmWindow.find('button[name=rejectChallenge]');
if ($rejectButton.length) {
this.rejectChallenge(userid, $rejectButton);
}
$rejectButton = $pmWindow.find('button[name=cancelChallenge]');
if ($rejectButton.length) {
this.cancelChallenge(userid, $rejectButton);
}
var $next = $pmWindow.next();
while ($next.length && $next.css('display') === 'none') {
$next = $next.next();
}
if ($next.length) {
$next.find('textarea[name=message]').focus();
return;
}
$next = $pmWindow.prev();
while ($next.length && $next.css('display') === 'none') {
$next = $next.prev();
}
if ($next.length) {
$next.find('textarea[name=message]').focus();
return;
}
if (app.curSideRoom) app.curSideRoom.focus();
},
focusPM: function(name) {
this.openPM(name).prependTo(this.$pmBox).find('textarea[name=message]').focus();
},
onFocusPM: function(e) {
$(e.currentTarget).closest('.pm-window').addClass('focused');
},
onBlurPM: function(e) {
$(e.currentTarget).closest('.pm-window').removeClass('focused');
},
keyPress: function(e) {
if (e.keyCode === 13 && !e.shiftKey) { // Enter
var $target = $(e.currentTarget);
e.preventDefault();
e.stopPropagation();
var text;
if ((text = $target.val())) {
// this.tabComplete.reset();
// this.chatHistory.push(text);
var userid = $target.closest('.pm-window').data('userid');
text = ('\n'+text).replace(/\n/g, '\n/pm '+userid+', ').substr(1);
this.send(text);
$(e.currentTarget).val('');
}
} else if (e.keyCode === 27) { // Esc
this.closePM(e);
}
},
clickUsername: function(e) {
e.stopPropagation();
var name = $(e.currentTarget).data('name');
app.addPopup('user', UserPopup, {name: name, sourceEl: e.currentTarget});
},
clickPMBackground: function(e) {
if (!e.shiftKey && !e.cmdKey && !e.ctrlKey) {
if (window.getSelection && !window.getSelection().isCollapsed) {
return;
}
app.dismissPopups();
$(e.currentTarget).find('textarea[name=message]').focus();
e.stopPropagation();
}
},
challengesFrom: null,
challengeTo: null,
resetPending: function() {
this.updateSearch();
var self = this;
this.$('form.pending').closest('.pm-window').each(function(i, el) {
self.challenge($(el).data('userid'));
});
},
searching: false,
updateSearch: function(data) {
if (data) this.searching = data.searching;
var $searchForm = $('.mainmenu button.big').closest('form');
var $formatButton = $searchForm.find('button[name=format]');
var $teamButton = $searchForm.find('button[name=team]');
if (this.searching) {
$formatButton.addClass('preselected')[0].disabled = true;
$teamButton.addClass('preselected')[0].disabled = true;
$searchForm.find('button.big').html(' Searching...').addClass('disabled');
} else {
var format = $formatButton.val();
var teamIndex = $teamButton.val();
$formatButton.replaceWith(this.renderFormats(format));
$teamButton.replaceWith(this.renderTeams(format, teamIndex));
$searchForm.find('button.big').html('Look for a battle').removeClass('disabled');
$searchForm.find('button.cancelSearch').html('Look for a battle').removeClass('disabled');
$searchForm.find('p.cancel').remove();
}
},
updateChallenges: function(data) {
this.challengesFrom = data.challengesFrom;
this.challengeTo = data.challengeTo;
for (var i in data.challengesFrom) {
this.openPM(' '+i, true);
}
var self = this;
this.$('.pm-window').each(function(i, el) {
var $pmWindow = $(el);
var userid = $pmWindow.data('userid');
var name = $pmWindow.data('name');
if (data.challengesFrom[userid]) {
var challenge = data.challengesFrom[userid];
var $challenge = self.openChallenge(name, $pmWindow);
var buf = '';
$challenge.html(buf);
} else {
var $challenge = $pmWindow.find('.challenge');
if ($challenge.length) {
if ($challenge.find('button[name=acceptChallenge]').length) {
// Someone was challenging you, but cancelled their challenge
$challenge.html('');
} else if ($challenge.find('button[name=cancelChallenge]').length) {
// You were challenging someone else, and they either accepted
// or rejected it
$challenge.remove();
}
}
}
});
if (data.challengeTo) {
var challenge = data.challengeTo;
var name = challenge.to;
var userid = toId(name);
var $challenge = this.openChallenge(name);
var buf = '';
$challenge.html(buf);
}
},
openChallenge: function(name, $pmWindow) {
var userid = toId(name);
if (!$pmWindow) $pmWindow = this.openPM(name, true);
var $challenge = $pmWindow.find('.challenge');
if (!$challenge.length) {
$challenge = $('').insertAfter($pmWindow.find('h3'));
}
return $challenge;
},
updateFormats: function() {
if (!window.BattleFormats) {
this.$('.mainmenu button.big').html('Connecting...').addClass('disabled');
return;
}
if (!this.searching) this.$('.mainmenu button.big').html('Look for a battle').removeClass('disabled');
var self = this;
this.$('button[name=format]').each(function(i, el) {
var val = el.value;
var $teamButton = $(el).closest('form').find('button[name=team]');
$(el).replaceWith(self.renderFormats(val));
$teamButton.replaceWith(self.renderTeams(val));
});
},
updateTeams: function() {
if (!window.BattleFormats) return;
var teams = app.user.teams;
var self = this;
this.$('button[name=team]').each(function(i, el) {
var val = el.value;
if (val === 'random') return;
var format = $(el).closest('form').find('button[name=format]').val();
$(el).replaceWith(self.renderTeams(format, val));
});
},
updateRightMenu: function() {
if (app.sideRoom) {
this.$('.rightmenu').hide();
} else {
this.$('.rightmenu').show();
}
},
// challenge buttons
challenge: function(name) {
var userid = toId(name);
var $challenge = this.$('.pm-window-'+userid+' .challenge');
if ($challenge.length && !$challenge.find('button[name=dismissChallenge]').length) {
return;
}
$challenge = this.openChallenge(name);
var buf = '';
$challenge.html(buf);
},
acceptChallenge: function(i, target) {
var $pmWindow = $(target).closest('.pm-window');
var userid = $pmWindow.data('userid');
var teamIndex = $pmWindow.find('button[name=team]').val();
var team = null;
if (app.user.teams[teamIndex]) team = app.user.teams[teamIndex].team;
$(target).closest('.challenge').remove();
app.send('/utm '+(team?$.toJSON(team):''));
app.send('/accept '+userid);
},
rejectChallenge: function(i, target) {
var userid = $(target).closest('.pm-window').data('userid');
$(target).closest('.challenge').remove();
app.send('/reject '+userid);
},
makeChallenge: function(i, target) {
var $pmWindow = $(target).closest('.pm-window');
var userid = $pmWindow.data('userid');
var name = $pmWindow.data('name');
var format = $pmWindow.find('button[name=format]').val();
var teamIndex = $pmWindow.find('button[name=team]').val();
var team = null;
if (app.user.teams[teamIndex]) team = app.user.teams[teamIndex].team;
var buf = '';
$(target).closest('.challenge').html(buf);
app.send('/utm '+(team?$.toJSON(team):''));
app.send('/challenge '+userid+', '+format);
},
cancelChallenge: function(i, target) {
var userid = $(target).closest('.pm-window').data('userid');
$(target).closest('.challenge').remove();
app.send('/cancelchallenge '+userid);
},
dismissChallenge: function(i, target) {
$(target).closest('.challenge').remove();
},
format: function(format, button) {
app.addPopup('format', FormatPopup, {format: format, sourceEl: button});
},
team: function(team, button) {
var format = $(button).closest('form').find('button[name=format]').val();
app.addPopup('team', TeamPopup, {team: team, format: format, sourceEl: button});
},
// format/team selection
curFormat: '',
renderFormats: function(formatid, noChoice) {
if (!window.BattleFormats) {
return '';
}
if (_.isEmpty(BattleFormats)) {
return ''
}
if (!noChoice) {
this.curFormat = formatid;
if (!this.curFormat) {
if (BattleFormats['randombattle']) {
this.curFormat = 'randombattle';
} else for (var i in BattleFormats) {
this.curFormat = i;
break;
}
}
formatid = this.curFormat;
}
return '';
},
curTeamFormat: '',
curTeamIndex: -1,
renderTeams: function(formatid, teamIndex) {
if (!app.user.teams || !window.BattleFormats) {
return '';
}
if (!formatid) formatid = this.curFormat;
if (!window.BattleFormats[formatid]) {
return '';
}
if (window.BattleFormats[formatid].team) {
return '';
}
var teams = app.user.teams;
if (!teams.length) {
return ''
}
if (teamIndex === undefined) {
teamIndex = 0;
if (this.curTeamIndex >= 0) {
teamIndex = this.curTeamIndex;
}
if (this.curTeamFormat !== formatid) {
for (var i=0; i'+TeamPopup.renderTeam(teamIndex)+'';
},
// buttons
search: function(i, button) {
var $searchForm = $(button).closest('form');
if ($searchForm.find('.cancel').length) {
return;
}
var $formatButton = $searchForm.find('button[name=format]');
var $teamButton = $searchForm.find('button[name=team]');
var format = $formatButton.val();
var teamIndex = $teamButton.val();
var team = null;
if (app.user.teams[teamIndex]) team = app.user.teams[teamIndex].team;
$formatButton.addClass('preselected')[0].disabled = true;
$teamButton.addClass('preselected')[0].disabled = true;
$searchForm.find('button.big').html(' Connecting...').addClass('disabled');
$searchForm.append('');
app.send('/utm '+(team?$.toJSON(team):''));
app.send('/search '+format);
},
cancelSearch: function() {
app.send('/cancelsearch');
this.searching = false;
this.updateSearch();
},
joinRoom: function(room) {
app.joinRoom(room);
}
});
var FormatPopup = this.FormatPopup = this.Popup.extend({
initialize: function(data) {
var curFormat = data.format;
var selectType = (this.sourceEl.closest('form').data('search') ? 'search' : 'challenge');
var bufs = ['',''];
var curBuf = 0;
var curSection = '';
for (var i in BattleFormats) {
var format = BattleFormats[i];
var selected = false;
if (format.effectType !== 'Format') continue;
if (selectType && !format[selectType + 'Show']) continue;
if (format.section && format.section !== curSection) {
curSection = format.section;
curBuf = (curSection === 'Doubles' || curSection === 'Past Generations') ? 1 : 0;
bufs[curBuf] += '
'+Tools.escapeHTML(curSection)+'
';
}
bufs[curBuf] += '';
}
if (bufs[1]) {
this.$el.html('
'+bufs[0]+'
'+bufs[1]+'
');
} else {
this.$el.html('
'+bufs[0]+'
');
}
},
selectFormat: function(format) {
var $teamButton = this.sourceEl.closest('form').find('button[name=team]');
this.sourceEl.val(format).html(Tools.escapeFormat(format));
$teamButton.replaceWith(app.rooms[''].renderTeams(format));
app.rooms[''].curFormat = format;
this.close();
}
});
var TeamPopup = this.TeamPopup = this.Popup.extend({
initialize: function(data) {
var bufs = ['','','','',''];
var curBuf = 0;
var teams = app.user.teams;
var bufBoundary = 128;
if (teams.length > 128 && $(window).width() > 1080) {
bufBoundary = Math.ceil(teams.length/5);
} else if (teams.length > 81) {
bufBoundary = Math.ceil(teams.length/4);
} else if (teams.length > 54) {
bufBoundary = Math.ceil(teams.length/3);
} else if (teams.length > 27) {
bufBoundary = Math.ceil(teams.length/2);
}
if (!teams.length) {
bufs[curBuf] = '
You have no teams
';
} else {
var format = BattleFormats[data.format];
var curTeam = +data.team;
var teamFormat = (format.teambuilderFormat || (format.isTeambuilderFormat ? data.format : false));
if (teamFormat) {
bufs[curBuf] = '
'+Tools.escapeFormat(teamFormat)+' teams
';
var count = 0;
for (var i = 0; i < teams.length; i++) {
if ((!teams[i].format && !teamFormat) || teams[i].format === teamFormat) {
var selected = (i === curTeam);
bufs[curBuf] += '';
count++;
if (count % bufBoundary == 0 && curBuf < 4) curBuf++;
}
}
if (!count) bufs[curBuf] += '
You have no '+Tools.escapeFormat(teamFormat)+' teams
';
bufs[curBuf] += '
Other teams
';
} else {
bufs[curBuf] = '
All teams
';
}
for (var i = 0; i < teams.length; i++) {
if (teamFormat && teams[i].format === teamFormat) continue;
var selected = (i === curTeam);
bufs[curBuf] += '';
count++;
if (count % bufBoundary == 0 && curBuf < 4) curBuf++;
}
}
if (format.canUseRandomTeam) {
bufs[curBuf] += '';
}
if (bufs[1]) {
while (!bufs[bufs.length-1]) bufs.pop();
this.$el.html('
'+bufs.join('
')+'
');
} else {
this.$el.html('
'+bufs[0]+'
');
}
},
selectTeam: function(i) {
var formatid = this.sourceEl.closest('form').find('button[name=format]').val();
i = +i;
this.sourceEl.val(i).html(TeamPopup.renderTeam(i));
app.rooms[''].curTeamIndex = i;
app.rooms[''].curTeamFormat = formatid;
this.close();
}
}, {
renderTeam: function(i) {
if (i === 'random') {
var buf = 'Random team ';
for (var i=0; i<6; i++) {
buf += '';
}
return buf;
}
var team = app.user.teams[i];
var buf = ''+Tools.escapeHTML(team.name)+' ';
for (var i=0; i';
}
return buf;
}
});
}).call(this, jQuery);