/* TF2Lobby.com
 * Copyright 2010-2011 Ryan "FLOOR_MASTER" Mannion. All rights reserved.
 * The contents of this file may not be used in any other context than
 * tf2lobby.com without permission
 */

$(document).ready(function(){window.classes={scout:0,soldier:0,pyro:0,demo:0,heavy:0,engy:0,medic:0,sniper:0,spy:0};window.stats={translateClass:{scout:"Scout",soldier:"Soldier",pyro:"Pyro",demo:"Demo",heavy:"Heavy",engy:"Engineer",medic:"Medic",sniper:"Sniper",spy:"Spy",noclass:"Unknown"},translateFlagEvent:{flag_drop:" dropped the ",flag_capture:" captured the ",flag_defend:" defended the ",flag_pickup:" picked up the "},translateWeapon:{scattergun:"Scattergun",force_a_nature:"FAN",pistol_scout:"Scout Pistol",bat:"Bat",sandman:"Sandman",taunt_scout:"Scout Taunt",bat_wood:"Sandman Bat",ball:"Ball",tf_projectile_rocket:"Rocket Launcher",rocketlauncher_directhit:"Direct Hit",shotgun_soldier:"Soldier Shotgun",shovel:"Shovel",unique_pickaxe:"Equalizer",taunt_soldier:"Soldier Taunt",flamethrower:"Flamethrower",backburner:"Backburner",shotgun_pyro:"Pyro Shotgun",flaregun:"Flare Gun",fireaxe:"Axe",axtinguisher:"Axtinguisher",taunt_pyro:"Pyro Taunt",tf_projectile_pipe:"Pipe Bomb",tf_projectile_pipe_remote:"Sticky Bomb",stick_resistance:"Scottish Resistance",bottle:"Bottle",sword:"Eyelander",demoshield:"Targe",taunt_demoman:"Demo Taunt",minigun:"Minigun",natascha:"Natascha",shotgun_hwg:"Heavy Shotgun",fists:"Fists",gloves:"KGB",taunt_heavy:"Heavy Taunt",obj_sentrygun:"Level 1 Sentry",obj_sentrygun2:"Level 2 Sentry",obj_sentrygun3:"Level 3 Sentry",shotgun_primary:"Engineer Shotgun",pistol:"Engineer Pistol",wrench:"Wrench",syringegun_medic:"Syringe Gun",blutsauger:"Blutsauger",bonesaw:"Bonesaw",ubersaw:"Ubersaw",taunt_medic:"Medic Taunt",sniperrifle:"Sniper Rifle",tf_projectile_arrow:"Huntsman",smg:"SMG",club:"Kukri",taunt_sniper:"Sniper Taunt",compound_bow:"Flaming Arrow",jar:"Jarate",revolver:"Revolver",ambassador:"Ambassador",knife:"Knife",taunt_spy:"Spy Taunt",world:"World",player:"Player",tf_pumpkin_bomb:"Pumpkin Bomb",telefrag:"Telefrag",deflect_rocket:"Deflected Rocket",deflect_promode:"Deflected Pipe Bomb",deflect_arrow:"Deflected Arrow",deflect_flare:"Deflected Flare",deflect_sticky:"Deflected Sticky Bomb"},oppositeTeam:{red:"blu",blu:"red"},baseAvatarUrl:"http://media.steampowered.com/steamcommunity/public/images/avatars/",redColor:"#c15143",bluColor:"#80a1c2",accounts:{},accountIndexes:{},t:{capturePointTimes:{},weaponsUsed:{},classKillsTeam:{red:$.extend(true,{},window.classes),blu:$.extend(true,{},window.classes)},classKills:$.extend(true,{},window.classes),classAssistsTeam:{red:$.extend(true,{},window.classes),blu:$.extend(true,{},window.classes)},classAssists:$.extend(true,{},window.classes),classDeathsTeam:{red:$.extend(true,{},window.classes),blu:$.extend(true,{},window.classes)},classDeaths:$.extend(true,{},window.classes),killWeapons:{},killWeaponsTeam:{red:{},blu:{}},deathWeapons:{},deathWeaponsTeam:{red:{},blu:{}},scoreEvents:{red:[],blu:[]},scores:{red:0,blu:0},classTime:$.extend(true,{},window.classes),classTimeTeam:{red:$.extend(true,{},window.classes),blu:$.extend(true,{},window.classes)}},accountFilter:{},c:{classKillsTeam:{red:{scout:0,soldier:0,pyro:0,demo:0,heavy:0,engy:0,medic:0,sniper:0,spy:0},blu:{scout:0,soldier:0,pyro:0,demo:0,heavy:0,engy:0,medic:0,sniper:0,spy:0}},classDeathsTeam:{red:{scout:0,soldier:0,pyro:0,demo:0,heavy:0,engy:0,medic:0,sniper:0,spy:0},blu:{scout:0,soldier:0,pyro:0,demo:0,heavy:0,engy:0,medic:0,sniper:0,spy:0}},timeSeries:{red:[],blu:[]},timeSeriesTicks:[],kills:{red:0,blu:0}},intervalKillsIntervalS:60,intervalKillsAll:{red:new Array(),blu:new Array()},intervalKills:{red:new Array(),blu:new Array()}};window.statsEvents.events=new Array();for(var b in window.statsEvents.rawEvents){var d=new Object();for(var a in window.statsEvents.eventColumns){d[window.statsEvents.eventColumns[a]]=window.statsEvents.rawEvents[b][a]}window.statsEvents.events.push(d)}if(window.map!=null){window.stats.offsetX=0-window.map.minX;window.stats.offsetY=0-window.map.minY;window.stats.rangeX=window.map.maxX-window.map.minX;window.stats.rangeY=window.map.maxY-window.map.minY;window.stats.scaleX=window.map.imageWidth/(window.map.rotate?(window.map.maxY-window.map.minY):(window.map.maxX-window.map.minX));window.stats.scaleY=window.map.imageHeight/(window.map.rotate?(window.map.maxX-window.map.minX):(window.map.maxY-window.map.minY));window.timeline=new Timeline();window.timeline.baseTimeS=window.statsEvents.events[0].created;for(var b=0;b<window.statsEvents.events.length;b++){if(window.statsEvents.events[b].type!="connected"&&window.statsEvents.events[b].type!="team_change"){window.timeline.baseTimeS=window.statsEvents.events[b].created;break}}window.timeline.rangeS=window.statsEvents.events[window.statsEvents.events.length-1].created-window.timeline.baseTimeS;window.timeline.calculateTime(window.timeline.baseTimeS);window.timeline.setScale(parseInt($("#timeScale option:selected").val()));$("#timeScale").change(function(e){e.preventDefault();window.timeline.setScale(parseInt($("#timeScale option:selected").val()))});$("#timeSlider").slider({min:window.timeline.baseTimeS,max:window.timeline.baseTimeS+window.timeline.rangeS,slide:function(e,f){window.timeline.pause();window.timeline.adjustVisible(f.value,false);window.timeline.setOffsetMs((f.value-window.timeline.baseTimeS)*1000)},change:function(f,g){var e=(g.value-window.timeline.baseTimeS)/window.stats.intervalKillsIntervalS;buildTeamKillChart();buildTeamClassKillsChart();window.stats.teamKillIntervalChart.lockCrosshair({x:e})}});$("#cumulativeCheckbox").click(function(f){f.preventDefault();var e=($(this).attr("checked")=="checked");if(e){$(this).removeAttr("checked").attr("src","/img/icons/checkOff.png");window.timeline.setCumulative(false)}else{$(this).attr("checked","checked").attr("src","/img/icons/checkOn.png");window.timeline.setCumulative(true)}});$("#timelineMode").change(function(h){h.preventDefault();var g=($(this).find("option:selected").val()=="classes");for(var e=0;e<window.statsEvents.events.length;e++){var f=window.statsEvents.events[e];$.each(f.nodes,function(){this.redraw(g)})}})}else{$("#timelineContainer").hide();$("#noTimelineContainer").show()}window.tooltip=new Tooltip();$("#lobbyDate").html(String.secondsToDateTime(window.lobbyInfo.startTime));var c=$("#matchTimelineHelp").addClass("pointer");window.tooltip.setup(c,'<img src="/img/mtHelp.png"/>');$("#killTableSwitch span[mode]").click(function(e){e.preventDefault();var f=$(this).attr("mode");buildVitalsCharts(f);$("#playerDetails").slideUp()});$("#test").mouseover(function(e){});buildStats();buildClassTables();buildKillTable();buildVitalsCharts("all");buildKillMatrixTable();buildWeaponsTable();if(window.map!=null){window.timeline.initCanvas();window.timeline.setMarkers();buildTeamKillChart();buildKillChart();buildTeamClassKillsChart()}});function buildStats(){var e=new Object;for(var m in window.statsEvents.accounts){e[m]=0;window.stats.accountFilter[m]=true}var n=window.stats.c;var p=window.stats.accounts;var r=window.stats.t;for(var k=0;k<window.statsEvents.events.length;k++){var j=window.statsEvents.events[k];if(j.type=="kill"){r.weaponsUsed[j.weapon]=0}}for(var m in window.statsEvents.accounts){var o=new PlayerStats(window.statsEvents.accounts[m],m,e,r.weaponsUsed);window.stats.accounts[m]=o;var h=$('<img src="/img/icons/checkOff.png" class="check pointer"/>').attr("accountId",m);var q=$("<li></li>").append(h);$('<img src="'+o.getAvatarUrl()+'" class="avatar"><span class="name">'+o.name+"</span>").appendTo(q);q.appendTo("#filterList")}var d=(window.map==null?0:parseInt(window.timeline.rangeS/window.stats.intervalKillsIntervalS));for(var g in r.weaponsUsed){window.stats.intervalKills.red[g]=[];window.stats.intervalKills.blu[g]=[];for(var k=0;k<d;k++){window.stats.intervalKills.red[g][k]=0;window.stats.intervalKills.blu[g][k]=0}r.killWeapons[g]=0;r.killWeaponsTeam.red[g]=0;r.killWeaponsTeam.blu[g]=0;r.deathWeapons[g]=0;r.deathWeaponsTeam.red[g]=0;r.deathWeaponsTeam.blu[g]=0}for(var k=0;k<d;k++){window.stats.intervalKillsAll.red[k]=0;window.stats.intervalKillsAll.blu[k]=0}for(var k=0;k<window.statsEvents.events.length;k++){var j=window.statsEvents.events[k];j.nodes=[];if(window.map!=null){if(j.type=="kill"){j.nodes=[new Kill(j)]}else{if(j.type=="flag_drop"){j.nodes=[new FlagEvent(j)];p[j.playerId].flagDrops++}else{if(j.type=="flag_pickup"){j.nodes=[new FlagEvent(j)];p[j.playerId].flagPickups++}else{if(j.type=="flag_capture"){j.nodes=[new FlagEvent(j)];p[j.playerId].flagCaptures++}else{if(j.type=="flag_defend"){p[j.playerId].flagDefends++}else{}}}}}}if(j.type=="kill"){p[j.playerId].addKill(j);p[j.player2Id].addDeath(j);r.killWeapons[j.weapon]++;r.killWeaponsTeam[j.playerTeam][j.weapon]++;r.deathWeapons[j.weapon]++;r.deathWeaponsTeam[j.player2Team][j.weapon]++;r.classKills[j.playerClass]++;r.classKillsTeam[j.playerTeam][j.playerClass]++;r.classDeaths[j.player2Class]++;r.classDeathsTeam[j.player2Team][j.player2Class]++;var b=(window.map==null?0:parseInt((j.created-window.timeline.baseTimeS)/window.stats.intervalKillsIntervalS));window.stats.intervalKills[j.playerTeam][j.weapon][b]++;window.stats.intervalKillsAll[j.playerTeam][b]++}else{if(j.type=="assist"){p[j.playerId].assists++;p[j.playerId].classAssists[j.player2Class]++;r.classAssists[j.playerClass]++;r.classAssistsTeam[j.playerTeam][j.playerClass]++}else{if(j.type=="team_time"){p[j.playerId].teamTime[j.playerTeam]+=j.val}else{if(j.type=="class_time"){if(j.playerTeam==""){continue}if(p[j.playerId].classTime[j.playerClass]==null){p[j.playerId].classTime[j.playerClass]=parseInt(j.val)}else{p[j.playerId].classTime[j.playerClass]+=parseInt(j.val)}r.classTime[j.playerClass]+=parseInt(j.val);r.classTimeTeam[j.playerTeam][j.playerClass]+=parseInt(j.val)}else{if(j.type=="point_capture"){p[j.playerId].cpCaptures++;if(r.capturePointTimes[j.created]==null){r.capturePointTimes[j.created]=[j]}else{r.capturePointTimes[j.created].push(j)}}else{if(j.type=="capture_block"){p[j.playerId].cpBlocks++}else{if(j.type=="current_score"||j.type=="final_score"){r.scoreEvents[j.playerTeam].push({time:j.created,score:j.val});r.scores[j.playerTeam]=j.val}else{if(j.type=="domination"){p[j.playerId].dominations.push(j.player2Id);p[j.player2Id].dominated.push(j.playerId)}else{if(j.type=="revenge"){p[j.playerId].revenges.push(j.player2Id)}else{if(j.type=="charge_deploy"){p[j.playerId].ubersDeployed++}else{if(j.type=="medic_death"){p[j.player2Id].healing+=parseInt(j.val);if(parseInt(j.data)==1){p[j.player2Id].ubersDropped++}}}}}}}}}}}}}for(var f in r.capturePointTimes){r.capturePointTimes[f][0].nodes=[new CPEvent(r.capturePointTimes[f])]}for(var m in p){var l=p[m];l.finalize()}}function CPEvent(g){this.players=new Array();this.cPos={x:0,y:0};var e=0;var d=0;for(var b in g){var c=g[b];this.players.push({accountId:c.playerId,name:window.stats.accounts[c.playerId].name,team:c.playerTeam,"class":c.playerClass,pos:{x:c.playerX,y:c.playerY,z:c.playerZ},avatar:window.stats.baseAvatarUrl+window.statsEvents.accounts[c.playerId].avatar});e+=c.playerX;d+=c.playerY}this.name=g[0].data;this.team=g[0].playerTeam;e/=g.length;d/=g.length;this.cPos=calculateCPos(e,d);var f=new Array();for(var b in this.players){var a=this.players[b];f.push('<li><img src="'+a.avatar+'" class="avatar '+a.team+'"/><span class="name">'+a.name+"</span></li>")}this._tooltip="<div>"+this.name+' captured by:<ul class="players">'+f.join("")+"</ul></div>";this.cpImg=$('<img src="/img/icons/'+this.team+'Cp.png" class="cpIcon"/>').css("left",(this.cPos.x-15)+"px").css("top",(this.cPos.y-15)+"px").addClass("pointer").hide().appendTo("#mapOverviewImage");window.tooltip.setup(this.cpImg,this._tooltip);this.hide=function(h){if(h){this.cpImg.fadeOut("fast")}else{this.cpImg.hide()}};this.show=function(h){if(h){this.cpImg.fadeIn("fast")}else{this.cpImg.show()}};this.drawCanvas=function(){};this.redraw=function(){};return this}function FlagEvent(a){this.type=a.type;this.player={accountId:a.playerId,name:window.stats.accounts[a.playerId].name,team:a.playerTeam,"class":a.playerClass,pos:{x:a.playerX,y:a.playerY,z:a.playerZ},cPos:calculateCPos(a.playerX,a.playerY),avatar:window.stats.baseAvatarUrl+window.statsEvents.accounts[a.playerId].avatar};var c;var b=window.stats.oppositeTeam[this.player.team];if(this.type=="flag_drop"){c=b+"FlagDrop"}else{if(this.type=="flag_capture"){c=b+"FlagCap"}else{if(this.type=="flag_pickup"){c=b+"FlagPickup"}}}this._tooltip='<div><img src="'+this.player.avatar+'" class="avatar '+this.player.team+'"/><span class="name">'+this.player.name+" "+window.stats.translateFlagEvent[this.type]+(this.player.team=="blu"?'<span class="redFg">RED</span>':'<span class="bluFg">BLU</span>')+" flag</span></div>";this.flagImg=$('<img src="/img/icons/'+c+'.png" class="flagIcon"/>').css("left",(this.player.cPos.x-23)+"px").css("top",(this.player.cPos.y-13)+"px").addClass("pointer").hide().appendTo("#mapOverviewImage");window.tooltip.setup(this.flagImg,this._tooltip);this.hide=function(d){if(d){this.flagImg.fadeOut("fast")}else{this.flagImg.hide()}};this.show=function(d){if(d){this.flagImg.fadeIn("fast")}else{this.flagImg.show()}};this.redraw=function(){};this.drawCanvas=function(){};return this}function calculateCPos(c,b){var a=new Object();if(window.map==null){return{x:0,y:0}}if(window.map.rotate){a.x=(b+window.stats.offsetY)*window.map.imageWidth/window.stats.rangeY;a.y=(c+window.stats.offsetX)*window.map.imageHeight/window.stats.rangeX}else{a.x=(c+window.stats.offsetX)*window.map.imageWidth/window.stats.rangeX;a.y=(b+window.stats.offsetY)*window.map.imageHeight/window.stats.rangeY}if(window.map.flipX){a.x=window.map.imageWidth-a.x}if(window.map.flipY){a.y=window.map.imageHeight-a.y}return a}function Kill(b){this.id=b.eventId;this.killer={accountId:b.playerId,name:window.stats.accounts[b.playerId].name,team:b.playerTeam,"class":b.playerClass,pos:{x:b.playerX,y:b.playerY,z:b.playerZ},cPos:calculateCPos(b.playerX,b.playerY),avatar:window.stats.baseAvatarUrl+window.statsEvents.accounts[b.playerId].avatar};this.killed={accountId:b.player2Id,name:window.stats.accounts[b.player2Id].name,team:b.player2Team,"class":b.player2Class,pos:{x:b.player2X,y:b.player2Y,z:b.player2Z},cPos:calculateCPos(b.player2X,b.player2Y),avatar:window.stats.baseAvatarUrl+window.statsEvents.accounts[b.player2Id].avatar};this.weapon=b.weapon;this.angle=Math.atan((this.killed.cPos.y-this.killer.cPos.y)/(this.killed.cPos.x-this.killer.cPos.x));this.created=b.created;this.distance=Math.sqrt(Math.pow(this.killer.cPos.x-this.killed.cPos.x,2)+Math.pow(this.killer.cPos.y-this.killed.cPos.y,2));this.lSegAngle=this.angle+Math.PI/7;this.rSegAngle=this.angle-Math.PI/7;var a=(this.killer.cPos.x<=this.killed.cPos.x);var c=15;if(a){this.arrowHead={l:{x:this.killed.cPos.x-c*Math.cos(this.lSegAngle),y:this.killed.cPos.y-c*Math.sin(this.lSegAngle)},r:{x:this.killed.cPos.x-c*Math.cos(this.rSegAngle),y:this.killed.cPos.y-c*Math.sin(this.rSegAngle)}}}else{this.arrowHead={l:{x:this.killed.cPos.x+c*Math.cos(this.lSegAngle),y:this.killed.cPos.y+c*Math.sin(this.lSegAngle)},r:{x:this.killed.cPos.x+c*Math.cos(this.rSegAngle),y:this.killed.cPos.y+c*Math.sin(this.rSegAngle)}}}this._tooltip='<div><img src="'+this.killer.avatar+'" class="avatar '+this.killer.team+'"/><span class="name">'+this.killer.name+'</span><img src="/img/weaps/'+this.weapon+'.png" class="weapon"/><img src="'+this.killed.avatar+'" class="avatar '+this.killed.team+'"/><span class="name">'+this.killed.name+"</span></div></div>";this.offset=7;this.killImg=$('<img src="'+this.killer.avatar+'" class="killIcon"/>').css("left",(this.killer.cPos.x-this.offset)+"px").css("top",(this.killer.cPos.y-this.offset)+"px").addClass(this.killer.team=="red"?"redBg":"bluBg").addClass("pointer").hide().appendTo("#mapOverviewImage");window.tooltip.setup(this.killImg,this._tooltip);this.deathImg=$('<img src="'+this.killed.avatar+'" class="deathIcon"/>').css("left",(this.killed.cPos.x-this.offset)+"px").css("top",(this.killed.cPos.y-this.offset)+"px").addClass(this.killed.team=="red"?"redBg":"bluBg").addClass("pointer").hide().appendTo("#mapOverviewImage");window.tooltip.setup(this.deathImg,this._tooltip);this.hide=function(d){if(d){this.killImg.fadeOut("fast");this.deathImg.fadeOut("fast")}else{this.killImg.hide();this.deathImg.hide()}};this.show=function(d){if(d){this.killImg.fadeIn("fast");this.deathImg.fadeIn("fast")}else{this.killImg.show();this.deathImg.show()}};this.redraw=function(d){if(d){this.offset=7;this.killImg.attr("src","/img/class/"+this.killer["class"]+".png");this.deathImg.attr("src","/img/class/"+this.killed["class"]+".png")}else{this.offset=7;this.killImg.attr("src",this.killer.avatar);this.deathImg.attr("src",this.killed.avatar)}};return this}Kill.prototype.drawCanvas=function(){var a=window.timeline.ctx;if(this.killer.team=="red"){a.strokeStyle="rgba(193, 81, 67, 0.75)"}else{if(this.killer.team=="blu"){a.strokeStyle="rgba(128, 161, 194, 0.75)"}}a.lineWidth=3;a.beginPath();a.moveTo(this.killer.cPos.x,this.killer.cPos.y);a.lineTo(this.killed.cPos.x,this.killed.cPos.y);a.lineTo(this.arrowHead.l.x,this.arrowHead.l.y);a.moveTo(this.killed.cPos.x,this.killed.cPos.y);a.lineTo(this.arrowHead.r.x,this.arrowHead.r.y);a.stroke()};function PlayerStats(c,d,b,a){this.id=d;this.name=c.name;this.fid=c.fid;this.avatar=c.avatar;this.color=c.color;this.kills=0;this.deaths=0;this.assists=0;this.distance=0;this.killWeapons=$.extend(true,{},a);this.deathWeapons=$.extend(true,{},a);this.healing=0;this.ubersDeployed=0;this.ubersDropped=0;this.dominations=[];this.dominated=[];this.revenges=[];this.currentKillStreak=[];this.bestKillStreak=[];this.currentDeathStreak=[];this.bestDeathStreak=[];this.killMatrix=$.extend(true,{},b);this.killDistance={};this.deathDistance={};this.flagPickups=0;this.cpCaptures=0;this.cpBlocks=0;this.flagDrops=0;this.flagCaptures=0;this.flagDefends=0;this.classKills=$.extend(true,{},window.classes);this.classDeaths=$.extend(true,{},window.classes);this.classTime=$.extend(true,{},window.classes);this.classAssists=$.extend(true,{},window.classes);this.teamTime={red:0,blu:0,spec:0};return this}PlayerStats.prototype.getAvatarUrl=function(){return window.stats.baseAvatarUrl+this.avatar};PlayerStats.prototype.addKill=function(a){this.kills++;this.currentKillStreak.push(a.player2Id);this.killMatrix[a.player2Id]++;this.killWeapons[a.weapon]++;if(this.currentDeathStreak.length>this.bestDeathStreak.length){this.bestDeathStreak=this.currentDeathStreak}this.currentDeathStreak=[];this.classKills[a.player2Class]++;return this};PlayerStats.prototype.addDeath=function(a){this.deaths++;this.currentDeathStreak.push(a.playerId);if(this.currentKillStreak.length>this.bestKillStreak.length){this.bestKillStreak=this.currentKillStreak}this.currentKillStreak=[];this.deathWeapons[a.weapon]++;this.classDeaths[a.playerClass]++;return this};PlayerStats.prototype.finalize=function(){var b=null;var a=0;for(var c in this.classTime){if(this.classTime[c]>a){a=this.classTime[c];b=c}}this.mostUsedClass=b;if(this.currentKillStreak.length>this.bestKillStreak.length){this.bestKillStreak=this.currentKillStreak}this.currentKillStreak=[];if(this.currentDeathStreak.length>this.bestDeathStreak.length){this.bestDeathStreak=this.currentDeathStreak}this.currentDeathStreak=[];if(this.teamTime.red>this.teamTime.blu){this.preferredTeam="red"}else{this.preferredTeam="blu"}};function buildKillMatrixTable(){var g=$("#killMatrix");var i=$("<thead></thead>").appendTo(g);var b=$("<tr></tr>").appendTo(i);var e=$("<tbody></tbody>").appendTo(g);var l=$("<tfoot></tfoot>").appendTo(g);var f=$("<tr></tr>").appendTo(l);$("<th></th>").html("Player").addClass("player").appendTo(b);$("<th></th>").html("Total Deaths").appendTo(f);var c=0;for(var h in window.stats.accounts){var k=window.stats.accounts[h];var j=k.getAvatarUrl();var m=$("<th></th>").html('<img src="'+j+'" class="avatar"/>').appendTo(b);if(window.lobbyInfo.maxPlayers>12){m.addClass("small")}window.tooltip.setup(m,"<div>"+k.name+"</div>");var n=$("<tr></tr>");$("<td></td>").html('<img src="'+j+'" class="avatar"/><span class="playerName">'+k.name+"</span>").attr("accountId",h).click(onPlayerClick).addClass("pointer").addClass("player").appendTo(n);for(var a in k.killMatrix){$("<td></td>").html(k.killMatrix[a]).attr("zero",k.killMatrix[a]==0).appendTo(n)}var d=$("<td></td>").html(k.kills).attr("zero",k.kills==0).appendTo(n);$("<th></th>").html(k.deaths).appendTo(f);n.appendTo(e);c++}$("<th></th>").html("Total<br/>Kills").appendTo(b);$("<th></th>").html("&nbsp;").appendTo(f);$.tablesorter.addParser({id:"playerNames",is:function(o){return false},format:function(o){return $(o).eq(1).html()},type:"text"});g.tablesorter({widgets:["zebra"],sortList:[[c+1,1]],headers:{0:{sorter:"playerNames"}}})}function buildWeaponsTable(){var l=$("#weaponsTable");var h=$("<thead></thead>").appendTo(l);var b=$("<tr></tr>").appendTo(h);var f=$("<tbody></tbody>").appendTo(l);$("<th></th>").html("Player").addClass("player").appendTo(b);var d=0;var m=window.stats.t;for(var e in m.weaponsUsed){var c=$('<th colspan="2"></th>').html('<img src="/img/weaps/'+e+'.png" width="30" class="weapon"/>').addClass("pointer").appendTo(b);var n='<div><img src="/img/weaps/'+e+'.png" class="bigWeapon"/><br/>'+window.stats.translateWeapon[e]+"</div>";window.tooltip.setup(c,n)}var k=0;var i=function(p,r,o){var s=$("<tr></tr>");if(k%2==0){s.addClass("even")}$("<td></td>").html(p).appendTo(s);for(var q in m.weaponsUsed){$('<td class="kills"></td>').html(r[q]).attr("zero",r[q]==0).appendTo(s);$("<td></td>").html(o[q]).attr("zero",o[q]==0).appendTo(s)}s.appendTo(f);k++};for(var g in window.stats.accounts){var j=window.stats.accounts[g];var a='<img src="'+j.getAvatarUrl()+'" class="avatar"/><span class="playerName">'+j.name+"</span>";i(a,j.killWeapons,j.deathWeapons)}i('<span class="teamButton redBg">Red</span>',m.killWeaponsTeam.red,m.deathWeaponsTeam.red);i('<span class="teamButton bluBg">Blu</span>',m.killWeaponsTeam.blu,m.deathWeaponsTeam.blu);i('<span class="teamButton allButton">All</span>',m.killWeapons,m.deathWeapons)}function buildClassTables(){var d=$("#medicTable");var e=$("<thead></thead>").appendTo(d);var g=$("<tr></tr>").appendTo(e);var c=$("<tbody></tbody>").appendTo(d);$("<th></th>").html("Player").addClass("player").appendTo(g);$("<th></th>").html("Time").appendTo(g);$("<th></th>").html("Healing").appendTo(g);$("<th></th>").html("Ubers").appendTo(g);$("<th></th>").html("Dropped").appendTo(g);for(var h in window.stats.accounts){var b=window.stats.accounts[h];if(b.classTime.medic>0){var f=$("<tr></tr>").appendTo(c);var a=window.stats.baseAvatarUrl+b.avatar;$("<td></td>").html('<img src="'+a+'" class="avatar '+b.preferredTeam+'"/><span class="playerName">'+b.name+"</span>").click(onPlayerClick).attr("accountId",h).addClass("pointer").addClass("player").appendTo(f);$("<td></td>").html(String.secondsToDuration(b.classTime.medic)).appendTo(f);$("<td></td>").html(b.healing).appendTo(f);$("<td></td>").html(b.ubersDeployed).attr("zero",b.ubersDeployed==0).appendTo(f);$("<td></td>").html(b.ubersDropped).attr("zero",b.ubersDropped==0).appendTo(f)}}$.tablesorter.addParser({id:"playerNames",is:function(i){return false},format:function(i){return $(i).eq(1).html()},type:"text"});d.tablesorter({widgets:["zebra"],sortList:[[0,0]],headers:{0:{sorter:"playerNames"},1:{sorter:false}}})}function buildKillTable(){var h=$("#killTable").addClass("killTable");var f=$("<thead></thead>").appendTo(h);var a=$("<tr></tr>").appendTo(f);var c=$("<tbody></tbody>").appendTo(h);$("<th></th>").html("Player").addClass("player").appendTo(a);$("<th></th>").appendTo(a);$("<th></th>").html("Kills").appendTo(a);$("<th></th>").html("Asst").appendTo(a);$("<th></th>").html("Dths").appendTo(a);$("<th></th>").html("KA:D").appendTo(a);window.tooltip.setup($("<th></th>").html("KS").appendTo(a),"Longest Kill Streak");var d=null;if(window.map!=null){d=window.map.mode}if(d=="ctf"){window.tooltip.setup($("<th></th>").html("FP").appendTo(a),"Flags Picked Up");window.tooltip.setup($("<th></th>").html("FC").appendTo(a),"Flags Captured");window.tooltip.setup($("<th></th>").html("FD").appendTo(a),"Flags Defended")}else{if(d=="cp"){window.tooltip.setup($("<th></th>").html("CP").appendTo(a),"Capture Points Captured");window.tooltip.setup($("<th></th>").html("CB").appendTo(a),"Capture Points Blocked")}}for(var e in window.stats.accounts){var g=window.stats.accounts[e];var i=$("<tr></tr>");var b=window.stats.baseAvatarUrl+g.avatar;$("<td></td>").html('<img src="'+b+'" class="avatar '+g.preferredTeam+'"/><span class="playerName">'+g.name+"</span>").click(onPlayerClick).attr("accountId",e).addClass("pointer").addClass("player").appendTo(i);$("<td></td>").html('<img src="/img/class/'+g.mostUsedClass+'.png" class="classIcon"/>').attr("classType",g.mostUsedClass).appendTo(i);$("<td></td>").html(g.kills).attr("zero",g.kills==0).appendTo(i);$("<td></td>").html(g.assists).attr("zero",g.assists==0).appendTo(i);$("<td></td>").html(g.deaths).attr("zero",g.deaths==0).appendTo(i);$("<td></td>").html((g.deaths==0?0:(Math.round((g.kills+g.assists)/g.deaths*100)/100))).appendTo(i);$("<td></td>").html(g.bestKillStreak.length).attr("zero",g.bestKillStreak.length==0).appendTo(i);if(d=="ctf"){$("<td></td>").html(g.flagPickups).attr("zero",g.flagPickups==0).appendTo(i);$("<td></td>").html(g.flagCaptures).attr("zero",g.flagCaptures==0).appendTo(i);$("<td></td>").html(g.flagDefends).attr("zero",g.flagDefends==0).appendTo(i)}else{if(d=="cp"){$("<td></td>").html(g.cpCaptures).attr("zero",g.cpCaptures==0).appendTo(i);$("<td></td>").html(g.cpBlocks).attr("zero",g.cpBlocks==0).appendTo(i)}}i.appendTo(c)}$.tablesorter.addParser({id:"playerNames",is:function(j){return false},format:function(j){return $(j).eq(1).html()},type:"text"});h.tablesorter({widgets:["zebra"],sortList:[[0,0]],headers:{0:{sorter:"playerNames"},1:{sorter:false}}})}function onPlayerClick(b){b.preventDefault();var i=$(this).attr("accountId");var k=window.stats.accounts[i];buildVitalsCharts(i);$("#playerDetails").slideDown();$(".pdName").html(k.name);$("a#pdLink").attr("href","/profile?id="+i);buildPDList(k.bestKillStreak,"KS");buildPDList(k.bestDeathStreak,"DS");buildPDList(k.dominations,"Dom");buildPDList(k.dominated,"Domd");buildPDList(k.revenges,"Rev");$("table.pdList tr:even").removeClass().addClass("even");$("table.pdList tr:odd").removeClass().addClass("odd");var d=$("#classKillsTable").empty();var j=$("<thead></thead>").appendTo(d);var a=$("<tr></tr>").appendTo(j);var f=$("<tbody></tbody>").appendTo(d);$("<th></th>").html("&nbsp;").appendTo(a);var g=$("<tr></tr>").appendTo(f).addClass("even");var c=$("<tr></tr>").appendTo(f).addClass("odd");var e=$("<tr></tr>").appendTo(f).addClass("even");$("<td></td>").html("Killed Class").appendTo(g);$("<td></td>").html("Assisted Against Class").appendTo(c);$("<td></td>").html("Killed By Class").appendTo(e);for(var h in window.classes){$("<th></th>").html('<img src="/img/class/'+h+'.png" width="15" class="classIcon"/>').appendTo(a);$("<td></td>").html(k.classKills[h]).attr("zero",k.classKills[h]==0).appendTo(g);$("<td></td>").html(k.classAssists[h]).attr("zero",k.classAssists[h]==0).appendTo(c);$("<td></td>").html(k.classDeaths[h]).attr("zero",k.classDeaths[h]==0).appendTo(e)}$("<th></th>").html("Total").appendTo(a);$("<td></td>").html(k.kills).attr("zero",k.kills==0).appendTo(g);$("<td></td>").html(k.assists).attr("zero",k.assists==0).appendTo(c);$("<td></td>").html(k.deaths).attr("zero",k.deaths==0).appendTo(e)}function buildPDList(c,a){var b=$("#pd"+a+"List").empty();$("#pd"+a+"Count").html(c.length);$.each(c,function(){var d=$('<img src="'+window.stats.accounts[this].getAvatarUrl()+'" class="avatar"/>').appendTo(b).addClass("pointer");window.tooltip.setup(d,window.stats.accounts[this].name)})}function buildTeamClassKillsChart(){var c={};for(var b in window.stats.c.classKillsTeam){for(var e in window.stats.c.classKillsTeam[b]){if(window.stats.c.classKillsTeam[b][e]>0){c[e]=true}}}var h=new Array();var a=new Array();var g=new Array();var d=0;var f=new Array();for(var e in c){f.push(e);h.push([d+0.5,'<img src="/img/class/'+e+'.png" class="classIcon" />']);a.push([d,window.stats.c.classKillsTeam.red[e]]);g.push([d,window.stats.c.classKillsTeam.blu[e]]);d++}window.stats.classKillsChart=$.plot("#classKillsChart2",[{data:a,color:window.stats.redColor,label:"RED Kills",bars:{show:true,barWidth:0.9}},{data:g,color:window.stats.bluColor,label:"BLU Kills",bars:{show:true,barWidth:0.9}}],{xaxis:{ticks:h},yaxis:{tickDecimals:0,min:0},legend:{show:true,position:"ne",labelBoxBorderColor:null,backgroundColor:"#2a2725",backgroundOpacity:0.25}})}function buildClassKillsChart(f){var a=null;var m=null;var k=null;if(f=="all"){a=window.stats.t.classKills;m=window.stats.t.classDeaths;k=window.stats.t.classAssists}else{if(f=="red"||f=="blu"){a=window.stats.t.classKillsTeam[f];m=window.stats.t.classDeathsTeam[f];k=window.stats.t.classAssistsTeam[f]}else{a=window.stats.accounts[f].classKills;m=window.stats.accounts[f].classDeaths;k=window.stats.accounts[f].classAssists}}var b={};for(var g in a){if(a[g]>0){b[g]=true}}for(var g in m){if(m[g]>0){b[g]=true}}for(var g in k){if(k[g]>0){b[g]=true}}var e=new Array();var c=new Array();var j=new Array();var l=new Array();var d=0;var h=new Array();for(var g in b){h.push(g);e.push([d+0.5,'<img src="/img/class/'+g+'.png" class="classIcon" />']);c.push([d,a[g]]);j.push([d,m[g]]);l.push([d,k[g]]);d++}window.stats.classKillsChart=$.plot("#classKillsChart",[{data:c,label:"Kills",bars:{show:true,barWidth:0.9}},{data:j,label:"Deaths",bars:{show:true,barWidth:0.9}},{data:l,label:"Assists",bars:{show:true,barWidth:0.9}}],{xaxis:{ticks:e},legend:{show:true,position:"ne",labelBoxBorderColor:null,backgroundColor:"#2a2725",backgroundOpacity:0.25},grid:{hoverable:true}});$("#classKillsChartData").html("");$("#classKillsChart").bind("plothover",function(p,s,q){if(q!=null){var n=h[q.dataIndex];var o=a[n];var r=m[n];var i=k[n];$("#classKillsChartData").html('<img src="/img/class/'+n+'.png" class="classIcon"/>'+window.stats.translateClass[n]+": "+o+" kills, "+i+" assists, "+r+" deaths ("+(r==0?o+i:parseInt((o+i)/r*100)/100)+" ratio)")}})}function buildTotalClassTimeChart(d){var c=new Array();var b=null;if(d=="all"){b=window.stats.t.classTime}else{if(d=="red"||d=="blu"){b=window.stats.t.classTimeTeam[d]}else{b=window.stats.accounts[d].classTime}}for(var a in b){if(b[a]>0){c.push({data:b[a],label:window.stats.translateClass[a]})}}window.stats.totalClassTimeChart=$.plot("#totalClassTimeChart",c,{series:{pie:{show:true,stroke:{width:0,color:"#2a2725"},label:{show:true},combine:{threshold:0.03,label:"Other"}}},legend:{show:false},grid:{hoverable:true}});$("#totalClassTimeChartData").html("");$("#totalClassTimeChart").bind("plothover",function(f,h,g){var e=parseFloat(g.series.percent).toFixed(2);$("#totalClassTimeChartData").html('<span style="font-weight: bold; color: '+g.series.color+'">'+g.series.label+": "+String.secondsToDuration(g.series.data[0][1])+" ("+e+"%)</span>")})}function buildKillChart(){var d=new Array();for(var b in window.stats.intervalKillsAll){var a=new Array();for(var c in window.stats.intervalKillsAll[b]){a.push([c,window.stats.intervalKillsAll[b][c]])}d.push({data:a,color:(b=="red"?window.stats.redColor:window.stats.bluColor)})}window.stats.teamKillIntervalChart=$.plot("#teamKillIntervalChart",d,{xaxis:{},yaxis:{tickDecimals:0},crosshair:{mode:"x",color:"white"},series:{lines:{fill:true}}})}function buildTeamKillChart(){window.stats.teamKillChart=$.plot("#teamKillChart",[{data:window.stats.c.timeSeries.red,color:window.stats.redColor,label:"RED Kills"},{data:window.stats.c.timeSeries.blu,color:window.stats.bluColor,label:"BLU Kills"}],{xaxis:{mode:"time",tickFormatter:function(b){return""}},yaxis:{tickDecimals:0,min:0},legend:{show:true,position:"ne",labelBoxBorderColor:null,backgroundColor:"black",backgroundOpacity:0.25,noColumns:2,container:$("#teamKillChartLegend")},series:{lines:{fill:true}}});var a=window.stats.teamKillChart.getData();$("#teamKillChartLegend .legendLabel").eq(0).html((a[0].data.length>0?a[0].data[a[0].data.length-1][1]:0)+" RED Kills&nbsp;&nbsp;&nbsp;");$("#teamKillChartLegend .legendLabel").eq(1).html((a[1].data.length>0?a[1].data[a[1].data.length-1][1]:0)+" BLU Kills")}function Timeline(){this._prevWasForward=true;this._timeScale=5;this._playTimer=null;this._intervalMs=100;this._markerWidth=$("#timeSliderMarkers").width();this.ctx=null;this.baseTimeS=0;this.rangeS=0;this._mapImage=null;this._prevThreshold=0;this._cumulative=false;this._offsetMs=0;this._eventIndexWindowS=30;this._eventIndexHead=0;this._eventIndexTail=0;var a=this;$("#playPause").click(function(b){b.preventDefault();a.togglePlay()});return this}Timeline.prototype.initCanvas=function(){if(window.map.imageHeight<400){$("#mapOverview").css("paddingTop",parseInt((400-window.map.imageHeight)/2)+"px")}else{if(window.map.imageHeight>450){$("#teamKillChart").css("height",parseInt(window.map.imageHeight*0.3)+"px");$("#teamKillIntervalChart").css("height",parseInt(window.map.imageHeight*0.3)+"px");$("#classKillsChart2").css("height",parseInt(window.map.imageHeight*0.4)+"px")}}this.ctx=document.getElementById("mapOverviewCanvas").getContext("2d");this._mapImage=new Image();var a=this;this._mapImage.onload=function(){a.ctx.drawImage(a._mapImage,0,0)};this._mapImage.src="/img/overviews/"+window.map.mapImage+".jpg";this.markerCtx=document.getElementById("timeSliderMarkers").getContext("2d")};Timeline.prototype.resetCanvas=function(){this.ctx.clearRect(0,0,window.map.imageWidth,window.map.imageHeight);this.ctx.drawImage(this._mapImage,0,0)};Timeline.prototype.setScale=function(a){this._timeScale=a};Timeline.prototype.setOffsetMs=function(a){this._offsetMs=a};Timeline.prototype.togglePlay=function(){if(this._playTimer==null){var a=this;this._playTimer=setInterval(function(){a.stepForward()},this._intervalMs);$("#playPause img").attr("src","/img/icons/pause.png");if(this._offsetMs/1000>=this.rangeS){$("#timeSlider").slider("value",this.baseTimeS);this._offsetMs=0;this.adjustVisible(this.baseTimeS,false)}}else{this.pause()}};Timeline.prototype.stepForward=function(){this._offsetMs+=this._intervalMs*this._timeScale;$("#timeSlider").slider("value",(this._offsetMs/1000)+this.baseTimeS);this.adjustVisible((this._offsetMs/1000)+this.baseTimeS,true);if(this._offsetMs/1000>=this.rangeS){this.pause()}};Timeline.prototype.setMarkers=function(){var b=window.stats.t;for(var d in b.capturePointTimes){this.addMarker(d,b.capturePointTimes[d][0].playerTeam,10)}for(var a=0;a<window.statsEvents.events.length;a++){var c=window.statsEvents.events[a];if(c.type=="flag_pickup"){this.addMarker(c.created,c.playerTeam,10)}else{if(c.type=="flag_capture"){this.addMarker(c.created,c.playerTeam,20)}}}};Timeline.prototype.addMarker=function(d,c,b){var a=(d-this.baseTimeS)/this.rangeS*this._markerWidth;if(c=="red"){this.markerCtx.strokeStyle="rgba(193, 81, 67, 0.75)"}else{if(c=="blu"){this.markerCtx.strokeStyle="rgba(128, 161, 194, 0.75)"}else{this.markerCtx.strokeStyle="rgba(170, 170, 170, 0.75)"}}this.markerCtx.lineWidth=2;this.markerCtx.beginPath();this.markerCtx.moveTo(a,50-b);this.markerCtx.lineTo(a,50);this.markerCtx.stroke()};Timeline.prototype.pause=function(){if(this._playTimer!=null){clearInterval(this._playTimer);this._playTimer=null;$("#playPause img").attr("src","/img/icons/play.png")}};Timeline.prototype.adjustVisible=function(k,a,g){var h=window.stats.c;forward=(k>this._prevThreshold);this._prevThreshold=k;if(g!=null&&g==true){}if(forward){if(this._prevWasForward==false){this._eventIndexHead++}while(this._eventIndexHead<window.statsEvents.events.length-1&&window.statsEvents.events[this._eventIndexHead].created<=k){var e=window.statsEvents.events[this._eventIndexHead];if(e.type=="kill"){var b=h.timeSeries[window.stats.oppositeTeam[e.playerTeam]];window.stats.c.kills[e.playerTeam]++;h.classKillsTeam[e.playerTeam][e.playerClass]++;h.timeSeries[e.playerTeam].push([e.created*1000,window.stats.c.kills[e.playerTeam]]);if(b.length){b.push([e.created*1000,b[b.length-1][1]])}else{b.push([e.created*1000,0])}h.timeSeriesTicks.push(e.created*1000)}$.each(e.nodes,function(){this.show(a)});this._eventIndexHead++}while(this._cumulative==false&&this._eventIndexTail<window.statsEvents.events.length-1&&window.statsEvents.events[this._eventIndexTail].created<=k-this._eventIndexWindowS){var e=window.statsEvents.events[this._eventIndexTail];$.each(e.nodes,function(){this.hide(a)});this._eventIndexTail++}this._prevWasForward=true}else{if(this._prevWasForward==true){this._eventIndexHead--}while(this._eventIndexHead>=0&&window.statsEvents.events[this._eventIndexHead].created>k){var e=window.statsEvents.events[this._eventIndexHead];if(e.type=="kill"){window.stats.c.kills[e.playerTeam]--;h.timeSeries[e.playerTeam].pop();h.timeSeries[window.stats.oppositeTeam[e.playerTeam]].pop();h.timeSeriesTicks.pop();h.classKillsTeam[e.playerTeam][e.playerClass]--}$.each(e.nodes,function(){this.hide(a)});this._eventIndexHead--}this._eventIndexTail=this._eventIndexHead;while(this._cumulative==false&&this._eventIndexTail>0&&window.statsEvents.events[this._eventIndexTail].created>k-this._eventIndexWindowS){var e=window.statsEvents.events[this._eventIndexTail];$.each(e.nodes,function(){this.show(a)});this._eventIndexTail--}this._prevWasForward=false}this.resetCanvas();for(var f=(this._cumulative?0:this._eventIndexTail);f<this._eventIndexHead;f++){var d=window.statsEvents.events[f].created;if((this._cumulative==true||d>k-this._eventIndexWindowS)&&d<=k){$.each(window.statsEvents.events[f].nodes,function(){this.drawCanvas()})}}var l=0;for(var f=window.stats.t.scoreEvents.red.length-1;f>=0;f--){if(window.stats.t.scoreEvents.red[f].time<k){l=window.stats.t.scoreEvents.red[f].score;break}}var j=0;for(var f=window.stats.t.scoreEvents.blu.length-1;f>=0;f--){if(window.stats.t.scoreEvents.blu[f].time<k){j=window.stats.t.scoreEvents.blu[f].score;break}}$("#redScore").html(l);$("#bluScore").html(j);this.calculateTime(k)};Timeline.prototype.setCumulative=function(a){this._cumulative=a;$("#timeSlider").slider("value",this.baseTimeS);this._offsetMs=0;this.adjustVisible(this.baseTimeS,true)};Timeline.prototype.calculateTime=function(a){var b=parseInt(a-this.baseTimeS);$("#timeSliderTime").html(String.secondsToTimestamp(a)+' <span class="gray">('+String.secondsToDuration(b)+")</span>")};function buildVitalsCharts(b){buildTotalClassTimeChart(b);buildClassKillsChart(b);var a=$(".vitalSelected").removeClass().addClass("vitalSelected").html(b);if(b=="all"){a.addClass("teamButton").addClass("allButton");$("#classKillsNote").html("For the kills/deaths chart, kills represents the number of times that class killed another player, and deaths represents the number of times that class died")}else{if(b=="red"||b=="blu"){a.addClass("teamButton").addClass(b+"Bg");$("#classKillsNote").html("For the kills/deaths chart, kills represents the number of times that class killed another player, and deaths represents the number of times that class died")}else{a.html("Player");$("#classKillsNote").html("For the kills/deaths chart, kills/assists represents the number of times the selected player killed or assisted against that class, and deaths represents the number of times the selected player was killed by that class")}}};
