// Copyright 2005 David Caldwell <david@porkrind.org> All rights reserved. -*- c -*-
var Login;function stats(game){this.game=game;this.queue=[];this.anonymous_queue=[];this.sent=[];this.session=Math.floor(Math.random()*0xFFFFFFFF);this.pending_stats=doc.text("");doc.id("pending_stats").appendChild(this.pending_stats);doc.id("pending").onclick=wrap(this,function(){this.send_queued();});this.pending=doc.id("pending");this.spinner=doc.id("spinner");this.start=function(){this.done();this.current={"name":this.game,"start date":(new Date()).getTime()};}
this.done=function(callback){if(!this.current)return;if(!this.current._done){this.current["end date"]=(new Date()).getTime();this.current._callback=callback;this.current._done=true;this.send(this.current);}else if(callback){if(this.current._play_id)
callback(this.current._play_id);}
this.current=undefined;}
this.set=function(stat,val){if(!this.current)return;return this.current[stat]=val;}
this.inc=function(stat,inc){if(!this.current)return;if(inc==undefined)inc=1;if(this.current[stat]==undefined)this.current[stat]=0;return this.current[stat]+=inc;}
this.dec=function(stat,dec){if(!this.current)return;if(dec==undefined)dec=1;if(this.current[stat]==undefined)this.current[stat]=0;return this.current[stat]-=dec;}
this.max=function(stat,val){if(!this.current)return;if(this.current[stat]==undefined)
return this.current[stat]=val;return this.current[stat]=Math.max(this.current[stat],val);}
this.min=function(stat,val){if(!this.current)return;if(this.current[stat]==undefined)
return this.current[stat]=val;return this.current[stat]=Math.min(this.current[stat],val);}
this.send=function(data){this.queue.push(data);this.update_status();this.send_queued();}
this.update_status=function(){if(this.queue.length){this.pending.style.display="inline";this.pending.title=this.queue.length+" game"+(this.queue.length>1?"s":"")+" are waiting to be sent.  Click to send immediately.";this.pending_stats.data=this.queue.length;}else{this.pending.style.display="none";this.pending_stats.data="";}}
this.send_queued=function(){if(this.sending)
return;var data,send;if(this.anonymous_queue.length&&Cookie.list.greenfelt_user&&Cookie.list.greenfelt_session){data=this.anonymous_queue.shift();send={user:Cookie.list.greenfelt_user,session:Cookie.list.greenfelt_session,play_id:data._play_id,anon_key:data._anon_key};}else if(this.queue.length){send=data=this.queue.shift();if(Login&&Login.is_logged_in()){send.user=Login.user;send.session=Login.session;}}else{this.update_status();return;}
var url=makeurl('stats.cgi',merge({json:1},map_obj(function(k,o){return k.charAt(0)=="_"||o[k]==undefined?{}:o;},send)));this.sending=true;this.spinner.style.display="inline";loadJSON(url,wrap(this,function(result,error,status){this.spinner.style.display="none";this.sending=false;if(result==undefined){printf("Error sending stats, re-queueing: %j\n",error);data.stats_send_retry=(data.stats_send_retry||0)+1;this.queue.unshift(data);return;}
this.update_status();data._play_id=result.play_id;data._anon_key=result.anon_key;if(result.anon_key){this.anonymous_queue.push(data);if(Login&&Login.is_logged_in())
Login.set_error("Please log in again.");}
if(data._callback)data._callback(result.play_id);this.sent.push(data);this.send_queued();}));}
if(Login)Login.on_login(wrap(this,function(){this.send_queued()}));}
function Stat(div,stat_name,stats){this.div=div;div.appendChild(this.text=document.createTextNode(this.value=0));this.stat_name=stat_name;this.stats=stats;}
Stat.prototype.upd=function(){return this.stats.set(this.stat_name,this.value);}
Stat.prototype.inc=function(inc){this.text.data=(this.value+=inc);return this.upd();}
Stat.prototype.set=function(val){this.text.data=this.value=val;return this.upd();}
Stat.prototype.get=function(){return this.value}