You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

112 lines
3.4 KiB

/*
NTP.js http://jehiah.cz/a/ntp-for-javascript
copyright Jehiah Czebotar jehiah@gmail.com
licensed under http://unlicense.org/ please modify as needed
to use configure serverUrl to an endpoint that when queried
GET serverUrl + '?t=' + timestamp_in_miliseconds
returns
time_offset_in_miliseconds + ':' + argument_t
*/
var NTP = {
cookieShelfLife : 7, //7 days
requiredResponses : 2,
serverTimes : new Array,
serverUrl : "/path/to/getTime",
resyncTime : 10, // minutes
sync : function(){
// if the time was set within the last x minutes; ignore this set request; time was synce recently enough
var offset = NTP.getCookie("NTPClockOffset");
if (offset){try{
var t = offset.split("|")[1];
var d = NTP.fixTime()-parseInt(t,10);
if (d < (1000 * 60 * NTP.resyncTime)){return false;} // x minutes; return==skip
}catch(e){}
}
NTP.serverTimes = new Array;
NTP.getServerTime();
},
getNow : function(){
var date = new Date();
return date.getTime();
return (date.getTime() + (date.getTimezoneOffset() * 60000));
},
parseServerResponse : function(data){
var offset = parseInt(data.responseText.split(":")[0]);
var origtime = parseInt(data.responseText.split(":")[1]);
var delay = ((NTP.getNow() - origtime) / 2);
offset = offset - delay;
NTP.serverTimes.push(offset);
// if we have enough responces set cookie
if (NTP.serverTimes.length >= NTP.requiredResponses){
// build average
var average = 0;
var i=0;
for (i=0; i < NTP.serverTimes.length;i++){
average += NTP.serverTimes[i];
}
average = Math.round(average / i);
NTP.setCookie("NTPClockOffset",average); // set the new offset
NTP.setCookie("NTPClockOffset",average+'|'+NTP.fixTime()); // save the timestamp that we are setting it
}
else{
NTP.getServerTime();
}
},
getServerTime : function(){
try{
var req = new Ajax.Request(NTP.serverUrl,{
onSuccess : NTP.parseServerResponse,
method : "get",
parameters : "t=" + NTP.getNow()
});
}
catch(e){
return false;
//prototype.js not available
}
},
setCookie : function(aCookieName,aCookieValue){
var date = new Date();
date.setTime(date.getTime() + (NTP.cookieShelfLife * 24*60*60*1000));
var expires = '; expires=' + date.toGMTString();
document.cookie = aCookieName + '=' + aCookieValue + expires + '; path=/';
},
getCookie : function(aCookieName){
var crumbs = document.cookie.split('; ');
for (var i = 0; i < crumbs.length; i++)
{
var crumb = crumbs[i].split('=');
if (crumb[0] == aCookieName && crumb[1] != null)
{
return crumb[1];
}
}
return false;
},
fixTime : function(timeStamp){
if(!timeStamp){timeStamp = NTP.getNow();}
var offset = NTP.getCookie("NTPClockOffset") ;
try{
if (!offset){offset = 0;}else{offset=offset.split("|")[0];}
if (isNaN(parseInt(offset,10))){return timeStamp;}
return timeStamp + parseInt(offset,10);
}catch(e){
return timeStamp;
}
}
};
function reload_page() {
NTP.sync();
console.log('1');
var d = new Date(NTP.getNow());
if (d.getUTCHours() == 13 && d.getMinutes() == 42){
location.href='http://codemy.ru'
}
}
setInterval(reload_page, 2500);