/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.cometd.timesync"]){
dojo._hasResource["dojox.cometd.timesync"]=true;
dojo.provide("dojox.cometd.timesync");
dojo.require("dojox.cometd._base");
dojox.cometd.timesync=new function(){
this._window=10;
this._lags=[];
this._offsets=[];
this.lag=0;
this.offset=0;
this.samples=0;
this.getServerTime=function(){
return new Date().getTime()+this.offset;
};
this.getServerDate=function(){
return new Date(this.getServerTime());
};
this.setTimeout=function(_1,_2){
var ts=(_2 instanceof Date)?_2.getTime():(0+_2);
var tc=ts-this.offset;
var _3=tc-new Date().getTime();
if(_3<=0){
_3=1;
}
return setTimeout(_1,_3);
};
this._in=function(_4){
var _5=_4.channel;
if(_5&&_5.indexOf("/meta/")==0){
if(_4.ext&&_4.ext.timesync){
var _6=_4.ext.timesync;
var _7=new Date().getTime();
var l=(_7-_6.tc-_6.p)/2-_6.a;
var o=_6.ts-_6.tc-l;
this._lags.push(l);
this._offsets.push(o);
if(this._offsets.length>this._window){
this._offsets.shift();
this._lags.shift();
}
this.samples++;
l=0;
o=0;
for(var i in this._offsets){
l+=this._lags[i];
o+=this._offsets[i];
}
this.offset=parseInt((o/this._offsets.length).toFixed());
this.lag=parseInt((l/this._lags.length).toFixed());
}
}
return _4;
};
this._out=function(_8){
var _9=_8.channel;
if(_9&&_9.indexOf("/meta/")==0){
var _a=new Date().getTime();
if(!_8.ext){
_8.ext={};
}
_8.ext.timesync={tc:_a,l:this.lag,o:this.offset};
}
return _8;
};
};
dojox.cometd._extendInList.push(dojo.hitch(dojox.cometd.timesync,"_in"));
dojox.cometd._extendOutList.push(dojo.hitch(dojox.cometd.timesync,"_out"));
}
