var Storage={};Storage.OFFLINE=0;Storage.SCOREKEEPER_OFFLINE=4;Storage.ONLINE=1;Storage.RECOVERED=2;Storage.Subscriber=function(B,p,s,b){var y=0;var i=60000;var o;var C=this;var r=B.id;var m=B;var g=s;var a=b;var A=p;var c="/xmpp";var w="http://cipriani/game/capture";var x=null;var q=Storage.OFFLINE;var h={node:"/home/zaphod/marathon-bot/game_"+r,service:"pubsub.zaphod"};var n={jid_connect:"zaphod",jid:null,subscribed:false};this.status=function(){return q};function v(D){q=D;switch(q){case Storage.OFFLINE:A.log("O servidor ou a sua conexão está fora do ar, tentaremos uma reconexão periodicamente.","alert");n.subscribed=false;clearInterval(o);o=setInterval(C.start,i);break;case Storage.SCOREKEEPER_OFFLINE:if(m.isStarted()&&!m.isEnded()){A.log("O publicador de eventos está fora do ar, por favor aguarde, estamos resolvendo o problema...","alert")}else{if(!m.isEnded()){A.log("A Maratona ainda não começou... Mas você já pode participar pelo Twitter!","info")}else{A.log("A Maratona já terminou... Mas você já ainda pode participar pelo Twitter!","info")}}break;case Storage.ONLINE:if(m.isStarted()&&!m.isEnded()){A.log("Conectado ao publicador de eventos! Divirta-se!","info")}else{if(!m.isEnded()){A.log("A Maratona ainda não começou... Mas você já pode participar pelo Twitter!","info")}else{A.log("A Maratona já terminou... Mas você já ainda pode participar pelo Twitter!","info")}}break;case Storage.RECOVERED:A.log("Realizando a sincronização...","info")}}this.start=function(){o=setInterval(C.start,i);l()};this.stop=function(){if(q==Storage.ONLINE){connection.disconnect()}};function l(){if(q==Storage.OFFLINE){if(x!=null){x.reset()}else{x=new Strophe.Connection(c)}x.connect(n.jid_connect,"",z)}}function z(D){if(D==Strophe.Status.DISCONNECTED){v(Storage.OFFLINE)}else{if(D==Strophe.Status.CONNECTED){x.addHandler(k,null,"presence",null,null,null);x.addHandler(j,null,"iq","result",null,h.service);x.addHandler(f,null,"message",null,null,h.service);x.send($pres().tree())}else{if((D==Strophe.Status.ERROR)||(D==Strophe.Status.CONNFAIL)||(D==Strophe.Status.AUTHFAIL)){v(Storage.OFFLINE)}}}}function k(E){var D=$(E);if(!D.attr("type")){if(q==Storage.OFFLINE||q==Storage.SCOREKEEPER_OFFLINE){v(Storage.RECOVERED);n.jid=D.attr("to");C.sync()}}else{if(D.attr("type")=="unavailable"||D.attr("type")=="error"){v(Storage.OFFLINE)}}return true}this.sync=function(){y=0;Marathon.utils.ajaxQueue.add({type:"GET",url:"/marathons/"+r+"/events",data:{fromTimestamp:y},dataType:"json",success:function(D){if(D.success){clearInterval(o);$.fx.off=true;g(D.resume["events"]);if(D.remaining_events.length>0){a(D.remaining_events);y=D.remaining_events[D.remaining_events.length-1]["_timestamp"]}$.fx.off=false;u()}else{v(Storage.OFFLINE)}},error:function(E,F,D){v(Storage.OFFLINE)}})};function u(){if(!n.subscribed){var D=$iq({type:"set",from:n.jid,to:h.service,id:"subscribing"}).c("pubsub",{xmlns:"http://jabber.org/protocol/pubsub"}).c("subscribe",{node:h.node,jid:n.jid});x.send(D.tree())}else{t()}}function t(){if(n.subscribed){var D=$iq({type:"get",from:n.jid,to:h.service,id:"retrieving"}).c("pubsub",{xmlns:"http://jabber.org/protocol/pubsub"}).c("items",{node:h.node});x.send(D.tree())}}function j(D){if(q!=Storage.ONLINE){if(q==Storage.RECOVERED){if($(D).attr("id")=="subscribing"){if(!n.subscribed){n.subscribed=$(D).find("subscription:first").attr("subscription")=="subscribed"}t()}else{if($(D).attr("id")=="retrieving"){e(d($(D).find("item")))}}}}return true}function f(D){if(q==Storage.ONLINE){e(d($(D).find("item")))}else{if(q==Storage.SCOREKEEPER_OFFLINE){v(Storage.RECOVERED);a(null)}}return true}function e(E){var D=[];var G=0;for(var F=0;F<E.length;F++){if(E[F]["_timestamp"]>y){D.push(E[F]);if(G<E[F]["_timestamp"]){G=E[F]["_timestamp"]}}}y=G;a(D)}function d(F){var D=[];var H={timestamp:0};var I,E,G;F.each(function(J){if($(this).find("scorekeeper:first").length>0){G=$(this).find("scorekeeper:first");if(parseInt(G.attr("timestamp"),10)>H.timestamp){H={type:"scorekeeper",obj:G,timestamp:parseInt(G.attr("timestamp"),10)}}}else{I=$(this).find("event:first");E={id:parseInt($(I).attr("id"),10),_marathon:r,_type:$(I).attr("type"),_timestamp:parseInt($(I).attr("timestamp"),10)};if(E._type=="action"){$.extend(E,{team:parseInt($(I).children("team:first").text(),10),action:parseInt($(I).children("action:first").text(),10)})}else{$.extend(E,{body:$(I).children("body:first").text()})}E.storage={_sync:$(I).children("storage:first").attr("sync"),_method:$(I).children("storage:first").attr("method")};if(E._timestamp>H.timestamp){H={type:"event",obj:I,timestamp:E._timestamp}}D.push(E)}});if(H){if(H.type=="scorekeeper"){G=H.obj;if(G.text()=="offline"){v(Storage.SCOREKEEPER_OFFLINE)}}else{if(q!=Storage.ONLINE){v(Storage.ONLINE)}}H=null}return D}A.log("Inicializando o placar, por favor aguarde...","info")};

var Marathon={};Marathon.utils={ajaxQueue:$.manageAjax.create("marathonQueue",{queue:true}),calculateNewSeries:function(d,f,b,a,g){var c=d[d.length-1][0];b=b*60000;if(c<f){var e;while(!(c<=f&&f<(c+b))){e=[];e[0]=d[d.length-1][0];if(g=="copy"){e[1]=d[d.length-1][1]}else{if(g=="reset"){e[1]=0}}c+=b;e[0]=c;d.push(e);if(d.length>a){d.shift()}}}},formatDate:function(b,c){b=new Date(b);var a="";if(c){a+="dia "+b.getDate()+"/"+(b.getMonth()+1)+" as "}a+=(b.getHours().toString().length==1?"0":"")+b.getHours().toString()+":";a+=(b.getMinutes().toString().length==1?"0":"")+b.getMinutes().toString()+":";a+=(b.getSeconds().toString().length==1?"0":"")+b.getSeconds().toString();return a}};Marathon.Game=function(c,b,h,d,g,l){this.id=c;this.name=b;this.place=h;this.teams={};this.actions={};var f=d*1000;var n=Marathon.utils.formatDate(f,true);var i=g;var j=f+(g*3600000);var e=this;var k=$(l);this.isEnded=function(){return(j<=this.now())};this.isStarted=function(){return(f<=this.now())};this.startTimestamp=function(){return f};function a(){k.empty().text("Maratona finalizada!")}function m(){if(e.isStarted()&&!e.isEnded()){k.countdown("change",{until:new Date(j),onExpiry:a,layout:"Faltam {d<}<strong>{dn}</strong> {dl},{d>}{h<} <strong>{hn}</strong> {hl},{h>}{m<} <strong>{mnn}</strong> {ml},{m>} <strong>{snn}</strong> {sl} {desc}",description:'para o fim da maratona. <span class="small-font">(Iniciada '+n+")</span>"})}else{a()}}k.countdown({until:new Date(f),onExpiry:m,layout:"Faltam {d<}<strong>{dn}</strong> {dl},{d>}{h<} <strong>{hn}</strong> {hl},{h>}{m<} <strong>{mnn}</strong> {ml},{m>} <strong>{snn}</strong> {sl} {desc}",description:'para o início da maratona. <span class="small-font">(Início '+n+")</span>"})};Marathon.Game.prototype={addTeam:function(a){if(!this.teams[a.id]){this.teams[a.id]=a}},addAction:function(a){if(!this.actions[a.id]){this.actions[a.id]=a}},now:function(){return new Date().getTime()}};Marathon.Team=function(c,a){this.id=c;this.name=a;var b=0;this.score=function(){return b};this.addPoints=function(d){b+=d};this.subPoints=function(d){b-=d};this.reset=function(){b=0}};Marathon.Action=function(g,d,c,b,f){this.id=g;this.name=d;this.acronym=c;var a=b;var e=f;this.increment=function(){return a};this.decrement=function(){return e}};Marathon.EventController=function(k,d,b){var j=k;var f=this;var e=b||[];this.addSubscriber=function(l){e.push(l)};function c(m){f.reset();var l=[];for(var n=0;n<m.length;n++){l.push({_timestamp:parseInt(m[n]["lastTimestamp"],10),_type:"action","$action":j.actions[parseInt(m[n]["action_id"],10)],"$team":j.teams[parseInt(m[n]["team_id"],10)],count:parseInt(m[n]["query_quantity"],10)})}if(l.length>0){f.bulkDeliver(l)}}function g(m){if(m==null){h.sync()}else{for(var l=0;l<m.length;l++){a(m[l])}if(m.length>0){f.deliver(m)}}}function a(l){if(l._type=="action"){$.extend(l,{"$team":j.teams[l.team],"$action":j.actions[l.action]})}}function i(){return(j.isStarted()&&!j.isEnded())}var h=new Storage.Subscriber(j,d,c,g);this.deliver=function(m){if(!$.isArray(m)){m=[m]}for(var l=0;l<m.length;l++){if(m[l]["_type"]=="action"){switch(m[l]["storage"]["_method"]){case"add":j.teams[m[l]["team"]].addPoints(m[l]["$action"].increment());case"remove":j.teams[m[l]["team"]].subPoints(m[l]["$action"].decrement())}}}for(l=0;l<e.length;l++){e[l].deliver(m)}};this.reset=function(){for(var l in j.teams){j.teams[l].reset()}for(l=0;l<e.length;l++){e[l].reset()}};this.bulkDeliver=function(m){for(var l=0;l<e.length;l++){e[l].bulkDeliver(m)}};this.start=function(){h.start()}};Marathon.ScorePanel=function(d,b){var a=d;var f=0;var e=$(b);function c(){e.html(f);e.effect("bounce",{times:3},300)}this.deliver=function(j){var h=f;for(var g=0;g<j.length;g++){if(j[g]["_type"]=="action"&&j[g]["team"]==a.id){switch(j[g]["storage"]["_method"]){case"add":f+=j[g]["$action"].increment();break;case"remove":f-=j[g]["$action"].decrement()}}}if(h!=f){c()}};this.bulkDeliver=function(j){var h=f;for(var g=0;g<j.length;g++){if(j[g]["_type"]=="action"&&j[g]["$team"].id==a.id){f+=j[g]["$action"].increment()*j[g]["count"]}}if(h!=f){c()}};this.reset=function(){f=0;c()};this.getPoints=function(){return f};this.setPoints=function(g){f=g};c()};Marathon.HistoryPanel=function(b,d){var e=$(d);var a=b;e.html("<ul></ul>");var c=$("ul:first",e);this.log=function(g,f){var h=$("<li></li>");if(f=="alert"){h.attr("class","color-alert-bg");h.html('<span class="ui-icon ui-icon-alert"/>'+Marathon.utils.formatDate(new Date().getTime(),false)+" - "+g)}else{if(f=="info"){h.attr("class","color-info-bg");h.html('<span class="ui-icon ui-icon-info"/>'+Marathon.utils.formatDate(new Date().getTime(),false)+" - "+g)}}h.hide().prependTo(c).slideDown("slow");if(c.children().length>a){c.find("li:last").remove()}};this.deliver=function(g){for(var f=0;f<g.length;f++){switch(g[f]["storage"]["_method"]){case"add":var h=$("<li></li>");if(g[f]["_type"]=="action"){h.attr("class","color-team-"+g[f]["team"]+"-bg removable");h.html('<span class="ui-icon ui-icon-transfer-e-w"/>'+Marathon.utils.formatDate(g[f]["_timestamp"],false)+" - "+g[f]["$action"].name+" - Time "+g[f]["$team"].name)}else{if(g[f]["_type"]=="comment"){h.attr("class","color-comment-bg removable");h.html('<span class="ui-icon ui-icon-comment"/>'+Marathon.utils.formatDate(g[f]["_timestamp"],false)+" - "+g[f]["body"])}}h.hide().prependTo(c).slideDown("slow");if(c.children().length>a){c.find("li:last").remove()}break;case"remove":c.children("li.removable:first").remove()}}};this.bulkDeliver=function(f){$("<li></li>").attr("class","color-comment-bg").html("Essa lista somente mostrará eventos realizados a partir de "+Marathon.utils.formatDate(f[0]["_timestamp"],true)).prependTo(c)};this.reset=function(){e.html("<ul></ul>");c=$("ul:first",e)}};Marathon.TeamPerformance=function(j,g,d,f){var e=d;var c=j.id;var b=g.id;var i={};var h=f;var a=180;function k(){$(h).find(".perf-points-"+c).sparkline(i[c],{type:"line",chartRangeMin:0,width:"240px",height:"30px"});$(h).find(".perf-points-"+b).sparkline(i[b],{type:"line",chartRangeMin:0,width:"240px",height:"30px"})}this.deliver=function(p){var n,m,l;for(var o=0;o<p.length;o++){switch(p[o]["storage"]["_method"]){case"add":if(p[o]["_type"]=="action"){for(n in i){Marathon.utils.calculateNewSeries(i[n],p[o]["_timestamp"],5,a,"reset");if(n==p[o]["team"]){i[n][i[n].length-1][1]+=p[o]["$action"].increment()}}}break;case"remove":if(p[o]["_type"]=="action"){l=i[p[o]["team"]];n=l.length-1;m=l[n][1];do{l[n][1]-=p[o]["$action"].increment();n--}while(n>=0&&l[n][1]==m)}}}k()};this.bulkDeliver=function(l){i[c]=[[l[0]["_timestamp"],0]];i[b]=[[l[0]["_timestamp"],0]];k()};this.reset=function(){i[c]=[[e,0]];i[b]=[[e,0]];k()};this.reset()};Marathon.PointTimelinePanel=function(k,i,d,h){var e=d;var c=k.id;var b=i.id;var l=h;var g;var a=180;var j={};j[c]=[[e,0]];j[b]=[[e,0]];var f={seriesColors:[COLORS["bgColor_"+c],COLORS["bgColor_"+b]],grid:{background:"#8A8271"},axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer,tickOptions:{showMark:false,formatString:"(%e) %H:%M"}},yaxis:{tickInterval:20,tickOptions:{formatString:"%d"}}},series:[{showMarker:false,lineWidth:2},{showMarker:false,lineWidth:2}],cursor:{zoom:true,showTooltip:false}};function m(){$("#"+l).empty();g=null;g=$.jqplot(l,[j[c],j[b]],f)}this.deliver=function(r){var p,o,n;for(var q=0;q<r.length;q++){switch(r[q]["storage"]["_method"]){case"add":if(r[q]["_type"]=="action"){for(p in j){Marathon.utils.calculateNewSeries(j[p],r[q]["_timestamp"],1,a,"copy");if(p==r[q]["team"]){j[p][j[p].length-1][1]+=r[q]["$action"].increment()}}}break;case"remove":if(r[q]["_type"]=="action"){n=j[r[q]["team"]];p=n.length-1;o=n[p][1];do{n[p][1]-=r[q]["$action"].increment();p--}while(p>=0&&n[p][1]==o)}}}m()};this.bulkDeliver=function(o){j[c]=[[o[0]["_timestamp"],0]];j[b]=[[o[0]["_timestamp"],0]];for(var n=0;n<o.length;n++){if(o[n]["_type"]=="action"){j[o[n]["$team"].id][0][1]+=o[n]["$action"].increment()*o[n]["count"]}}m()};this.reset=function(){j[c]=[[e,0]];j[b]=[[e,0]];m()}};Marathon.ScoreDifference=function(l,i,d,h){var c=l;var b=i;var f={};var e=d;var k=h;var j=[];var g=0;var a=60;function m(){$(k+" .diff-text").text(g);$(k+" .diff-spark").sparkline(j,{type:"line",chartRangeMin:0,width:"150px",height:"30px"})}this.deliver=function(r){var p,o,n;for(var q=0;q<r.length;q++){switch(r[q]["storage"]["_method"]){case"add":if(r[q]["_type"]=="action"){f[r[q]["team"]]+=r[q]["$action"].increment();Marathon.utils.calculateNewSeries(j,r[q]["_timestamp"],1,a,"copy");g=Math.abs(f[c.id]-f[b.id]);j[j.length-1][1]=g}break;case"remove":if(r[q]["_type"]=="action"){f[r[q]["team"]]-=r[q]["$action"].decrement();n=j;p=n.length-1;o=n[p][1];do{g=Math.abs(f[c.id]-f[b.id]);n[p][1]=g;p--}while(p>=0&&n[p][1]==o)}}}m()};this.bulkDeliver=function(o){for(var n=0;n<o.length;n++){if(o[n]["_type"]=="action"){f[o[n]["$team"].id]+=o[n]["$action"].increment()*o[n]["count"]}}g=Math.abs(f[c.id]-f[b.id]);j=[[o[0]["_timestamp"],g]];m()};this.reset=function(){f[c.id]=0;f[b.id]=0;g=Math.abs(f[c.id]-f[b.id]);j=[[e,g]];m()};this.reset()};Marathon.PointAccumulator=function(b,e){var a=b;var c=e||[];var d;this.addSubscriber=function(f){c.push(f)};this.deliver=function(h){var f,j;for(var g=0;g<h.length;g++){switch(h[g]["storage"]["_method"]){case"add":if(h[g]["_type"]=="action"){f=h[g]["$action"].increment();d.score+=f;d.shots+=1;d["action_"+h[g]["action"]]+=1;d["team_"+h[g]["team"]]["score"]+=f;d["team_"+h[g]["team"]]["shots"]+=1;d["team_"+h[g]["team"]]["action_"+h[g]["action"]]+=1}break;case"remove":if(h[g]["_type"]=="action"){j=h[g]["$action"].decrement();d.score-=j;d.shots-=1;d["action_"+h[g]["action"]]-=1;d["team_"+h[g]["team"]]["score"]-=j;d["team_"+h[g]["team"]]["shots"]-=1;d["team_"+h[g]["team"]]["action_"+h[g]["action"]]-=1}}}for(g=0;g<c.length;g++){c[g].deliver(h,d)}};this.bulkDeliver=function(h){var f;for(var g=0;g<h.length;g++){if(h[g]["_type"]=="action"){f=h[g]["$action"].increment();d.score+=f*h[g]["count"];d.shots+=1*h[g]["count"];d["action_"+h[g]["$action"].id]+=1*h[g]["count"];d["team_"+h[g]["$team"].id]["score"]+=f*h[g]["count"];d["team_"+h[g]["$team"].id]["shots"]+=1*h[g]["count"];d["team_"+h[g]["$team"].id]["action_"+h[g]["$action"].id]+=1*h[g]["count"]}}for(g=0;g<c.length;g++){c[g].bulkDeliver(h,d)}};this.reset=function(){d={score:0,shots:0};for(var g in a.teams){d["team_"+g]={};d["team_"+g]["score"]=0;d["team_"+g]["shots"]=0;for(var f in a.actions){d["team_"+g]["action_"+f]=0;d["action_"+f]=0}}};this.reset()};Marathon.GameStats=function(d,f){var a=d;var c=$(f);function e(h,g){return Math.round((g-h)/3600000)}function b(h,g){c.find("#table-shots-total-total").text(h.shots);c.find("#table-score-total-total").text(h.score);c.find("#table-average-total").text(g==0?h.score:Math.round(h.score/g*10)/10);for(var l in a.teams){c.find("#table-shots-"+l+"-total").text(h["team_"+l]["shots"]);c.find("#table-score-"+l+"-total").text(h["team_"+l]["score"]);c.find("#table-average-"+l).text(g==0?h["team_"+l]["score"]:Math.round(h["team_"+l]["score"]/g*10)/10);for(var k in a.actions){c.find("#table-shots-"+l+"-"+k).text(h["team_"+l]["action_"+k]);c.find("#table-score-"+l+"-"+k).text(h["team_"+l]["action_"+k]*a.actions[k].increment());c.find("#table-shots-total-"+k).text(h["action_"+k]);c.find("#table-score-total-"+k).text(h["action_"+k]*a.actions[k].increment())}}}this.deliver=function(h,g){b(g,e(a.startTimestamp(),h[h.length-1]["_timestamp"]))};this.bulkDeliver=function(h,g){b(g,e(a.startTimestamp(),h[0]["_timestamp"]))};this.reset=function(){c.find("td").text("0")};this.reset()};