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.3 KiB
112 lines
3.3 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); |