Stub formats/teams chooser

This commit is contained in:
Guangcong Luo
2013-05-04 00:43:41 -07:00
parent fd868f195d
commit e7ea6b471b
3 changed files with 351 additions and 51 deletions

View File

@@ -9,16 +9,22 @@
'click .closebutton': 'closePM',
'click .pm-window': 'clickPMBackground',
'focus textarea': 'onFocusPM',
'blur textarea': 'onBlurPM'
'blur textarea': 'onBlurPM',
'click button.formatselect': 'selectFormat',
'click button.teamselect': 'selectTeam'
},
initialize: function() {
var buf = '<div class="mainmenuwrapper">';
// left menu 2 (high-res: right, low-res: top)
buf += '<div class="leftmenu"><div class="activitymenu"><div class="pmbox"></div></div>';
// left menu 1 (high-res: left, low-res: bottom)
buf += '<div class="mainmenu"><div class="menugroup"><p><button class="button big" name="search"><strong>Look for a battle</strong></button></p></div>';
buf += '<div class="mainmenu"><div class="menugroup"><form class="battleform" data-search="1">';
buf += '<p><label class="label">Format:</label>'+this.renderFormats()+'</p>';
buf += '<p><label class="label">Team:</label>'+this.renderTeams()+'</p>';
buf += '<p><button class="button big" name="search"><strong>Look for a battle</strong></button></p></form></div>';
buf += '<div class="menugroup"><p><button class="button" name="joinRoom" value="teambuilder">Teambuilder</button></p><p><button class="button" name="joinRoom" value="ladder">Ladder</button></p></div></div></div>';
// right menu
@@ -33,8 +39,8 @@
this.$activityMenu = this.$('.activitymenu');
this.$pmBox = this.$activityMenu.find('.pmbox');
app.on('init:formats', this.updateSearch, this);
this.updateSearch();
app.on('init:formats', this.updateFormats, this);
this.updateFormats();
},
/*********************************************************
@@ -192,23 +198,18 @@
if (data.challengesFrom[userid]) {
var challenge = data.challengesFrom[userid];
var $challenge = self.openChallenge(name, $pmWindow);
var buf = '<p>'+Tools.escapeHTML(name)+' wants to battle!</p>';
buf += '<p><label class="label">Format:</label><strong>'+Tools.escapeFormat(challenge.format)+'</strong></p>';
if (challenge.format === 'randombattle') {
buf += '<p><label class="label">Team:</label><strong>random team</strong></p>';
buf += '<p><button name="acceptChallenge"><strong>Accept</strong></button> <button name="rejectChallenge">Reject</button></p>';
} else {
buf += '<p><label class="label">Team:</label><strong>idk man</strong></p>';
buf += '<p><button disabled><strong>Accept</strong></button> <button name="rejectChallenge">Reject</button></p>';
}
var buf = '<form class="battleform"><p>'+Tools.escapeHTML(name)+' wants to battle!</p>';
buf += '<p><label class="label">Format:</label>'+self.renderFormats(challenge.format, true)+'</p>';
buf += '<p><label class="label">Team:</label>'+self.renderTeams(challenge.format)+'</p>';
buf += '<p class="buttonbar"><button name="acceptChallenge"><strong>Accept</strong></button> <button name="rejectChallenge">Reject</button></p></form>';
$challenge.html(buf);
} else {
var $challenge = $pmWindow.find('.challenge');
if ($challenge.length) {
if ($challenge.find('button[name=acceptChallenge]').length) {
$challenge.html('<p>The challenge was cancelled.</p><p><button name="dismissChallenge">OK</button></p>');
$challenge.html('<form class="battleform"><p>The challenge was cancelled.</p><p class="buttonbar"><button name="dismissChallenge">OK</button></p></form>');
} else {
this.dismissChallenge();
$challenge.remove();
}
}
}
@@ -220,10 +221,9 @@
var userid = toId(name);
var $challenge = this.openChallenge(name);
var buf = '<p>Waiting for '+Tools.escapeHTML(name)+'...</p>';
var buf = '<form class="battleform"><p>Waiting for '+Tools.escapeHTML(name)+'...</p>';
buf += '<p><label class="label">Format:</label><strong>'+Tools.escapeFormat(challenge.format)+'</strong></p>';
buf += '<p><label class="label">Team:</label><strong>random team</strong></p>';
buf += '<p><button name="cancelChallenge">Cancel</button></p>';
buf += '<p class="buttonbar"><button name="cancelChallenge">Cancel</button></p></form>';
$challenge.html(buf);
}
@@ -237,9 +237,16 @@
}
return $challenge;
},
updateSearch: function() {
updateFormats: function() {
if (window.BattleFormats) {
this.$('.mainmenu button.big').html('<strong>Look for a battle</strong>').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));
});
} else {
this.$('.mainmenu button.big').html('<em>Connecting...</em>').addClass('disabled');
}
@@ -260,15 +267,22 @@
return;
}
$challenge = this.openChallenge(name);
var buf = '<p>Challenge '+Tools.escapeHTML(name)+'?</p>';
buf += '<p><label class="label">Format:</label><strong>Random Battle</strong></p>';
buf += '<p><label class="label">Team:</label><strong>random team</strong></p>';
buf += '<p><button name="makeChallenge"><strong>Challenge</strong></button> <button name="dismissChallenge">Cancel</button></p>';
var buf = '<form class="battleform"><p>Challenge '+Tools.escapeHTML(name)+'?</p>';
buf += '<p><label class="label">Format:</label>'+this.renderFormats()+'</p>';
buf += '<p><label class="label">Team:</label>'+this.renderTeams()+'</p>';
buf += '<p class="buttonbar"><button name="makeChallenge"><strong>Challenge</strong></button> <button name="dismissChallenge">Cancel</button></p></form>';
$challenge.html(buf);
},
acceptChallenge: function(i, target) {
var userid = $(target).closest('.pm-window').data('userid');
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();
if (team) app.send('/saveteam '+$.toJSON(team));
app.send('/accept '+userid);
},
rejectChallenge: function(i, target) {
@@ -277,16 +291,22 @@
app.send('/reject '+userid);
},
makeChallenge: function(i, target) {
var userid = $(target).closest('.pm-window').data('userid');
var name = $(target).closest('.pm-window').data('name');
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 buf = '<p>Challenging '+Tools.escapeHTML(name)+'...</p>';
buf += '<p><label class="label">Format:</label><strong>Random Battle</strong></p>';
buf += '<p><label class="label">Team:</label><strong>random team</strong></p>';
buf += '<p><button name="cancelChallenge">Cancel</button></p>';
var teamIndex = $pmWindow.find('button[name=team]').val();
var team = null;
if (app.user.teams[teamIndex]) team = app.user.teams[teamIndex].team;
var buf = '<form class="battleform"><p>Challenging '+Tools.escapeHTML(name)+'...</p>';
buf += '<p><label class="label">Format:</label><strong>'+Tools.escapeFormat(format)+'</strong></p>';
buf += '<p class="buttonbar"><button name="cancelChallenge">Cancel</button></p></form>';
$(target).closest('.challenge').html(buf);
app.send('/challenge '+userid+', randombattle');
if (team) app.send('/saveteam '+$.toJSON(team));
app.send('/challenge '+userid+', '+format);
},
cancelChallenge: function(i, target) {
var userid = $(target).closest('.pm-window').data('userid');
@@ -296,13 +316,163 @@
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 '<button class="select formatselect" name="format" disabled value="'+Tools.escapeHTML(formatid)+'"><em>Loading...</em></button>';
}
if (_.isEmpty(BattleFormats)) {
return '<button class="select formatselect" name="format" disabled><em>No formats available</em></button>'
}
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 '<button class="select formatselect'+(noChoice?' preselected':'')+'" name="format" value="'+formatid+'"'+(noChoice?' disabled':'')+'>'+Tools.escapeFormat(formatid)+'</button>';
},
curTeamFormat: '',
curTeamIndex: -1,
renderTeams: function(formatid) {
if (!app.user.teams || !window.BattleFormats) {
return '<button class="select teamselect" name="team" disabled><em>Loading...</em></button>';
}
if (!formatid) formatid = this.curFormat;
if (!window.BattleFormats[formatid]) {
return '<button class="select teamselect" name="team" disabled></button>';
}
if (window.BattleFormats[formatid].team) {
return '<button class="select teamselect preselected" name="team" value="random" disabled>Random team</button>';
}
var teams = app.user.teams;
if (!teams.length) {
return '<button class="select teamselect" name="team" disabled>You have no teams</button>'
}
var teamIndex = 0;
if (this.curTeamIndex >= 0) {
teamIndex = this.curTeamIndex;
}
if (this.curTeamFormat !== formatid) {
for (var i=0; i<teams.length; i++) {
if (teams[i].format === formatid) {
teamIndex = i;
break;
}
}
}
return '<button class="select teamselect" name="team" value="'+teamIndex+'">'+TeamPopup.renderTeam(teamIndex)+'</button>';
},
// buttons
search: function() {
alert('we don\'t support battles yet :(');
},
joinRoom: function(room) {
app.joinRoom(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] += '<li><h3>'+Tools.escapeHTML(curSection)+'</li>';
}
bufs[curBuf] += '<li><button name="selectFormat" value="' + i + '"' + (curFormat === i ? ' class="sel"' : '') + '>' + Tools.escapeHTML(format.name) + '</button></li>';
}
if (bufs[1]) {
this.$el.html('<ul class="popupmenu" style="float:left">'+bufs[0]+'</ul><ul class="popupmenu" style="float:left;padding-left:5px">'+bufs[1]+'</ul><div style="clear:left"></div>');
} else {
this.$el.html('<ul class="popupmenu">'+bufs[0]+'</ul>');
}
},
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 buf = '';
var teams = app.user.teams;
if (!teams.length) {
buf = '<li><em>You have no teams</em></li>';
} else {
var format = BattleFormats[data.format];
var curTeam = +data.team;
var teamFormat = (format.teambuilderFormat || (format.isTeambuilderFormat ? data.format : false));
buf = '<li><h3>'+Tools.escapeFormat(teamFormat)+' teams</h3></li>';
var atLeastOne = false;
for (var i = 0; i < teams.length; i++) {
if ((!teams[i].format && !teamFormat) || teams[i].format === teamFormat) {
var selected = (i === curTeam);
buf += '<li><button name="selectTeam" value="'+i+'"'+(selected?' class="sel"':'')+'>'+Tools.escapeHTML(teams[i].name)+'</button></li>';
atLeastOne = true;
}
}
if (!atLeastOne) buf += '<li><em>You have no '+Tools.escapeFormat(teamFormat)+' teams</em></li>';
buf += '<li><h3>Other teams</h3></li>';
for (var i = 0; i < teams.length; i++) {
if ((!teams[i].format && !teamFormat) || teams[i].format === teamFormat) continue;
var selected = (i === curTeam);
buf += '<li><button name="selectTeam" value="'+i+'"'+(selected?' class="sel"':'')+'>'+Tools.escapeHTML(teams[i].name)+'</button></li>';
}
}
if (format.canUseRandomTeam) {
buf += '<li><button value="-1">Random Team</button></li>';
}
this.$el.html('<ul class="popupmenu teams">'+buf+'</ul>');
},
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) {
var team = app.user.teams[i];
var buf = ''+Tools.escapeHTML(team.name)+'<br />';
for (var i=0; i<team.team.length; i++) {
buf += '<span class="pokemonicon" style="float:left;'+Tools.getIcon(team.team[i])+'"></span>';
}
return buf;
}
});

View File

@@ -1062,32 +1062,46 @@
// other than the popup will still be possible (and will dismiss
// the popup).
type: 'normal',
width: 300,
constructor: function(data) {
var $el = $(data.el || data.$el);
var $measurer = $('<div style="position:relative;height:0;overflow:hidden"></div>').appendTo('body');
$el.appendTo($measurer);
$el.css('width', this.width - 22);
if (!this.events) this.events = {};
this.events['click button'] = 'dispatchClickButton';
if (data && data.sourceEl) {
this.sourceEl = data.sourceEl = $(data.sourceEl);
var offset = this.sourceEl.offset();
var $el = $(data.el || data.$el);
var room = $(window).height();
if (offset.top <= room*3/4) {
$el.css('top', offset.top + this.sourceEl.outerHeight());
} else {
$el.css('bottom', room - offset.top);
}
$el.css('width', this.width - 22);
room = $(window).width() - offset.left;
if (room < this.width + 10) {
$el.css('right', 10);
} else {
$el.css('left', offset.left);
}
}
Backbone.View.apply(this, arguments);
var offset = this.sourceEl.offset();
var room = $(window).height();
var height = $el.outerHeight();
var sourceHeight = this.sourceEl.outerHeight();
if (room > offset.top + sourceHeight + height + 5) {
$el.css('top', offset.top + sourceHeight);
} else if (height + 5 <= offset.top) {
$el.css('bottom', room - offset.top);
} else if (height + 10 < room) {
$el.css('bottom', 5);
} else {
$el.css('top', 0);
}
room = $(window).width() - offset.left;
var outerWidth = $el.outerWidth();
if (room < outerWidth + 10) {
$el.css('right', 10);
} else {
$el.css('left', offset.left);
}
$el.appendTo('body');
$measurer.remove();
},
dispatchClickButton: function(e) {

View File

@@ -281,6 +281,111 @@ body {
border-radius: 6px;
box-shadow: inset 1px 1px 0 #ffffff, inset -1px -1px 0 #DDDDDD, 2px 2px 3px rgba(0,0,0,.2);
z-index: 100;
}
.popupmenu, popupmenu li {
margin: -2px 0 -1px 0;
padding: 0;
list-style: none;
font-size: 8pt;
}
.popupmenu h3 {
margin: 5px 0 0 -2px;
padding: 1px 0;
font-size: 8pt;
color: #579;
}
.popupmenu li:first-child h3 {
margin-top: 0;
}
.popupmenu button {
display: block;
cursor: pointer;
font-size: 8pt;
font-family: Verdana, Helvetica, Arial, sans-serif;
margin: 0 0 0 6px;
padding: 0 4px;
border: 0;
border-radius: 2px;
background: transparent;
width: 204px;
height: 19px;
text-align: left;
box-sizing: border-box;
}
@media (max-height:590px) {
.popupmenu button {
height: 17px;
}
.popupmenu h3 {
margin-top: 2px;
}
.popupmenu, popupmenu li {
margin: -3px 0 -2px 0;
}
}
@media (max-height:518px) {
.popupmenu button {
height: 16px;
}
.popupmenu h3 {
margin-top: 1px;
}
}
.popupmenu button.sel {
padding: 0 3px;
border: 1px solid #BBBBBB;
}
.popupmenu button:hover,
.popupmenu button.sel:hover {
padding: 0 3px;
border: 1px solid #888888;
background: #D5D5D5;
}
.select {
cursor: pointer;
box-sizing: border-box;
width: 230px;
height: 28px;
padding: 0 5px;
font-size: 9pt;
text-align: left;
font-family: Verdana, Helvetica, Arial, sans-serif;
border-radius: 3px;
border: 1px solid #555555;
background: #EEEEEE;
color: black;
}
.select.teamselect {
height: 43px;
}
.select:hover {
border-color: #888888;
background: #FFFFFF;
}
.select:after {
float: right;
margin-top: 1px;
font-size: 14px;
content: "\f0d7";
font-family: FontAwesome;
-webkit-font-smoothing: antialiased;
color: #777777;
}
.select:disabled {
border-color: #999999;
background: rgba(187,187,187,.5);
color: #555555;
}
.select:disabled:after {
content: "";
}
.select.preselected,
.select:disabled.preselected {
color: black;
}
/*********************************************************
@@ -305,6 +410,15 @@ body {
padding: 0 0 30px 0;
}
.battleform {
width: 230px;
text-align: left;
margin: 0 auto;
}
.battleform .buttonbar {
text-align: center;
}
.mainmenuwrapper {
position: relative;
min-height: 100%;
@@ -440,7 +554,8 @@ body {
border-radius: 20px;
background: rgba(201, 207, 219, .6);
color: black;
color: white;
text-shadow: 0 1px 0 black;
}
.menugroup {
background: rgba(201, 207, 219, .4);
@@ -564,6 +679,7 @@ body {
.userdetails {
min-height: 80px;
width: 191px;
padding: 1px 1px 1px 86px;
}
.userdetails img {