var  baseUrl=window.location.href.substr(0,window.location.href.indexOf('faces'));


var NTP = {
  cookieShelfLife : 7, //7 min //days
  requiredResponses : 5,
  serverTimes : new Array, 
  serverUrl :baseUrl+"faces/getTime",
  sync : function(){
     NTP.serverTimes = new Array;
     NTP.setCookie("NTPClockSync",0);
     NTP.getServerTime();
  },
  getNow : function(){
      var date = new Date();
      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 responses set cookie
     if (NTP.serverTimes.length >= NTP.requiredResponses){
        // build average & sigma
	var average = 0;
	var x=0;
	var x2 = 0;
	var sigma = 0;
	var sig3 = 0;
	var diff = 0;
	var error = 0;
	var n=0;
	var i=0;
	for (n=0; n < NTP.serverTimes.length;n++){
	   x += NTP.serverTimes[n];
	   x2 += NTP.serverTimes[n] * NTP.serverTimes[n];
	}
	average = x / n;
	sigma = Math.sqrt((x2 - (n * average * average))/(n-1));
	// do it again excluding values more than 2.75*sigma away from the average 
	sig3 = 2.75 * sigma; 
	for (i=0; i < NTP.serverTimes.length;i++){
		diff = Math.abs(NTP.serverTimes[i] - average);
		if (diff > sig3){
			n -= 1;
			x -= NTP.serverTimes[i];
			x2 -= NTP.serverTimes[i] * NTP.serverTimes[i];	
		}
	}
	if (n > 12){
		average = x / n;
		sigma = Math.sqrt((x2 - (n * average * average))/(n-1));
		error = Math.round(sigma/Math.sqrt(n)/10)/100;
	}
	average = Math.round(average);
	NTP.setCookie("NTPClockOffset",average); //in miliseconds
	NTP.setCookie("NTPClockError",error); // in seconds
	NTP.setCookie("NTPClockSync",1);
        
     }
     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 * 1000*60)); //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") ;
      if (!offset){offset = 0;}
      return timeStamp + parseInt(offset);
  }  
}

